全面的面向对象知识点

上传人:悦** 文档编号:177887157 上传时间:2022-12-27 格式:DOCX 页数:21 大小:36.28KB
收藏 版权申诉 举报 下载
全面的面向对象知识点_第1页
第1页 / 共21页
全面的面向对象知识点_第2页
第2页 / 共21页
全面的面向对象知识点_第3页
第3页 / 共21页
资源描述:

《全面的面向对象知识点》由会员分享,可在线阅读,更多相关《全面的面向对象知识点(21页珍藏版)》请在装配图网上搜索。

1、成员变量的特点:1、成员变量有默认值引用类型:null基本类型:整数: byte 0 short 0 int 0 long 0L小数: float 0.0F double 0.0 布尔: false (true) 字符:用的 unicode u00002、成员变量 VS 局部变量共同点: 都是变量,用于保存可变的数据 格式: 类型 变量名;既然是变量都应该满足java标识符的规则不同点: 局部变量在使用之前必须初始化 ,而成员变量自动在定义的时候就初始化(默 认值见上) 作用域不同,局部变量在包含自身的函数或者代码块中有效,而成员变量在整个类中有效在内存中的区域不同,局部变量在栈中,成员变量在

2、堆内存 访问方式不同,局部变量可以通过变量名直接访问,成员变量必须以来于(实例.)来访问 细节:调用函数的时候,需要注意的是如果函数有返回类型,那么可以调用打印语句将 返回的数据进行输出,反之,编译出错!匿名对象的特点:1、 创建实例的方式new 类();2、访问属性的方式 2种: String color = new Car()颜色; System.out.println(new Car().颜色);3、匿名类创建的实例的有效范围是匿名类创建结束4、使用匿名类改变实例的属性是不可取的,因为改变之后该实例 访问不到(每个对象用完之后就消失)5、匿名类的使用范围:函数的调用 和 实参的传递 使用

3、场景:函数的调用: 当只需要调用一次类的成员函数的时,可以采用匿名类,多次调用必须起名字。实参的传递: 当开发者创建一个实例只是想要将该实例作为实际的参数传递给函数, 那么就可以使用封装的概念:1. 封装即在描述一个类的时候,将原来的逐步的功能(面向过程),组装进类中。属性 和函数2. 封装2.1 属性的封装实现:将属性的访问权限设置为private,然后提供共有的访问方法 对于属性而言,要提供getXxx()和setXxx()2.2 函数的封装实现: 函数本身就是封装,因为函数本身就是一个具有特定功能的函数 函数也称之为:功能封装的实现:属性封装: 将类中的成员属性设置为私有的访问方式,对外

4、提供公有的访问权限封装的好处:1、将变化隔离2、便于使用3、提高代码的复用性4、提高代码安全性(记忆)构造函数: 就是一个普通的用来对类进行初始化操作的函数构造器的特点:1、在描述一个类的时候,类本身有一个默认的无参数的构造函数2、构造函数没有返回值类型,但是也不能写 void3、构造函数的名称和类名一致4、一旦开发者自己定义了构造函数,那么编译器就不会自动给类添加默认的 无参数的构造函数5、构造函数可以按照函数重载的形式出现(最常见的重载的例子)6、在一个构造函数中不能以一般的调用函数的方式来调用构造函数new7、没有 return应用:构造函数主要在初始化的时候调用注意:1、定义变量的时候

5、可以初始化,优先级最高(加载类)2、构造函数也可以初始化成员变量,只不过覆盖1 中的值代码块:使用括起来的一些 java 语句分类:在函数中: 局部代码块在 类中: 构造代码块特点:1、按顺序执行2、可以嵌套3、变量不能冲突,但是可以在变量释放后再定义同名的变量4、先是默认初始化 int a; 再是显示的初始化 int a = 23; 构造代码块初始化 a = 45 构造函数初始化 a = 67;区别: 构造代码块给所有的实例初始化 构造函数是给特定的对象进行初始化项目应用:可以将多个实例都需要初始化的变量放在构造代码块中一次性初始化 可以提高代码的效率this 关键字:该关键字主要用来解决局

6、部变量和成员变量之间的命名冲突问题this用法:this.成员变量函数使用细节:1、可以调用成员2、调用构造函数 格式: this(/ 构造函数的参数列表);使用 this 调用构造函数的时候一定要放在第一行 因为实例的初始化工作要先进行 构造函数中不允许递归的出现 (自己调用自己称作递归)A调用B B又调用A,也就递归(注意这里的AB都是构造函Static 关键字: 类变量:属于类,而且需要使用 static 修饰,作用范围: 可以用来修饰属性、函数和类,还可以修饰代码块 特 点:所有的实例都共享一份 成员属性可以通过实例访问 还可以通过类名直接访问(核心的特点) 静态方法中只能调用静态的成

7、员,不能使用非静态成员(变量和函数) 但是定义自己的局部变量是允许的 静态函数中不能使用 this、super 关键字main ()函数简介:public static void main(String args) 分析: 1、该函数是由JVM帮助开发人员调用的2、该函数的名称必须是mainpublic :控制该函数的访问的权限,其他的类都可以调用,直接通过类名来访问static : 说明该函数是一个静态函数,可以使用类名直接访问,也可以通过对象来访 问void : 说明该函数没有计算的结果main : 函数名称可变,但是 JVM 只认识 main() ,如果没有则抛出异常如:/java.la

8、ng.NoSuchMethodErrorString : 函数的形参, args 可变,也可以写为可变参数的形式: public static void main(String. args )注意:如何给虚拟机传递 main 函数的参数:java Demo5 34 45 56 78原理: 将 class 文件后的参数以“ ”分割后组装成为一个 String 类型的 数组传递进去静态代码块:主要用于对静态成员变量进行初始化,当类被加载的时候执行,而且执行一次 格式:static . 需求:请以不同的方式打印 helloworld总结:类的初始化过程:静态初始化1、类被装载2、类的静态变量先做默认

9、的初始化工作 static int a; / 03、 编译器对静态变量进行显示的初始化工作static int a = 90; / 904、类的静态代码块对静态变量进行初始化非静态初始化5、类的非静态成员进行默认的初始化工作 int a ;6、类的非静态变量进行显示的始化工作 int a = 8; / 87、类的构造代码块对非静态变量进行初始化工作8、类的构造函数对非静态变量进行初始化工作(创建对象时)单例设计模式:java 中借鉴了工程的一些设计的思想java 中就有一些常见的设计模式(解决一类问题的思想或者方案)java 的设计模式 23 种(书籍)单例的设计模式:为什么要使得一个对象是单

10、个的:为了避免堆内存中过多的垃圾对象(如果对象过多 会导致内存溢出)默认的堆内存的空间是 64M单例模式:1、将类的构造函数私有化 (private)2、创建一个类类型的变量,使用私有的构造函数来初始化3、对外提供获取对象的共有的方法4、将所有的成员定义为 static 的单例的实现方式:1、饿汉式 private static Server ser = new Server();2、懒汉式class Server/*饿汉式private static Server ser = new Server(); / 属性 private Server() / 私有的成员只能在本类中使用 public

11、 static Server getInstances() / 成员函数 return ser;*/ 懒汉式private static Server ser = null; / 属性private Server() / 私有的成员只能在本类中使用public static Server getInstances() / 成员函数 if(ser = null)ser = new Server();return ser;/*继承: 继承主要用来解决类和类直接的重复代码问题实现: extends (扩展)应用:1、不要为了继承而继承2、当父类中所有的成员子类都需要的时候,可以使用继承 如果父类中有

12、一些某些子类不需要的成员,那么就不能单独的为了代 码的共享而继承细节:1、private 修饰的成员无法被继承2、java 中是单继承 (同时只能扩展一个类),但是可以通过接口来完成多 实现 继承的特点:1、属性1.1子类可以直接继承父类的非私有的成员属性(private)1.2子类可以通过super关键字来获取父类中定义的与子类同名的成员1.3子类可以通过默认的调用this或者super来调用父类的静态成员2、函数2.1子类可以直接调用父类的非private的成员函数2.2子类可以定义和父类相同的函数,称之为覆盖(Override) I重写 如果调用子类的函数,则执行子类重写后的函数,如果调

13、用父类的使用 super关键字。女口: super.show()2.3子类中的函数不能使用this关键字调用自己(递归)2.4 函数的重写需要函数的声明完全一致(包括函数的返回类型)2.5 如果父类是静态的函数,那么子类也必须使用静态的函数进行重写,否则会访问父类的静态函数重写: (Override)1、函数名必须一致2、参数列表必须一致3、返回类型必须一致4、如果是 static 的必须相同5、修饰符只能大于等于父类父 默认 子 默认 public父 public 子 public 父 private 子 不能继承6、子类抛出的异常必须小于等于父类的异常子 A 也可以抛出 A 的子类重载:

14、(Overload)1、函数名要相同2、参数列表不同final : 最终的、最后的作用范围:可以用来修饰类、函数、变量(成员变量、局部变量)修饰类: 标志该类不能被继承 ; 无法从最终 Person 进行继承什么样的类应该被修饰为final的?1.1所有的工具类应该被修饰为final(一般情况)1.2 字符串类中所有方法都是对字符串进行操作的,那么其他的类进 行重写是没有意义如果一个类的功能都是完成自身的对象的一些操作,那么该类也可以是 final 的如: String1.3 如果该类的功能不需要被其他类进行继承(扩展)的化,那么也可 以修饰为 final修饰函数: 标志函数不能被重写 : Z

15、i 中的 function() 无法覆盖 Fu 中的 function。;被覆盖的方法为fi应用:当父类的功能和子类是一致的,而且不能让子类来重写,那么该函 数就可以被final 修饰修饰变量:成员变量:1.1 如果 final 用来修饰成员变量,那么该变量就会变为常量,并且 需要赋初始化值final double money = 34.0;1.2 一旦给常量赋值了,那么该常量就不能被改变(值)局部变量:1.1当final修饰局部变量时,当作常量来使用1.2 面试题:请问 final 是否可以修饰形式参数? yes为什么要使用final来修饰实参?因为该参数在局部的函数中不需要被修改,这样可以

16、提高代码的 效率的变量注意:当类中定义了一个局部内部类,那么局部内部类中只能访问final如:class Avoid show()int a = 90;class B / 局部内部类/ a = 34; 报错抽象类: 使用 abstract 修饰的类称之为抽象类特 点:1、 抽象类不能被直接实例化 :是抽象的;无法对其进行实例化2、如果抽象类中有抽象的函数,那么继承该抽象类的子类必须实现父类的所有的 抽象函数或者把自己(子类)也声明为抽象类3、包含抽象函数的一定是抽象类抽象类中不一定包含抽象函数4、只能被继承注 意:定义抽象函数的时候,一定不能有其实代表实现,没有就是函数没有实现应用:1、当父类

17、不确定子类的具体的实现方式时,可以将父类中的该函数定义为抽象的抽象 = 未知|不确定那么该类就一定是抽象类作用:1、可以将未知的实现抽取出来统一定义为抽象类2、可以强制子类实现父类没有实现的函数3、使用抽象类编程可以提高代码的扩展性模板设计模式:测试代码的执行时间:思想: 代码执行前 看表 1代码执行后 看表 2看表 2 - 看表 1实现: 看表模版方法设计模式:模版:1、根据具体的需求写出实现功能的模版代码2、抽取模版代码中的可变部分作为抽象方法3、在模版代码中调用抽取出来的抽象方法4、将模版代码抽象为一个普通的方法5、将模版方法和抽象方法会抽取为一个抽象类6、将模版方法设置为 final

18、修饰的7、在测试类中继承抽象类,实现抽象方法,调用模版方法接口:(interface)接口:就是一个特殊的类,该类使用interface来定义格式: interface 接口名 接口的实现: 使用 implements 关键字来实现接口特点:接口的函数都是public abstract,所以接口不能使用new关键字来创建实 例1、接口中定义的变量默认加 public static final ,那么就是静态常量,那就 必须要初始化,而且该值不能被修改2、 接口中定义的函数默认加public abstract,那么就抽象函数,那就不能 使用,而且该值不能被修改3、接口可以多实现,而且实现的接口之

19、间使用,隔开4、接口只能继承接口5、类、抽象类用来实现接口6、A B C是三个接口,B继承A C继承BD 是一个实现类(可以直接被实例化的类)而且实现了 C那么D中有ABC中的所有的功能D = C = B = A注意:1、开发者可以自己显示的使用默认的修饰来修饰接口,但是必须和默认的一致2、一个类可以实现多个接口并继承单个类如: class D extends C implements A,B注意: 先继承后实现应用:1、如果类需要多重继承的时候,可以使用接口来多重实现2、当一个类中需要扩展功能时,可以将该功能定义在接口中多态:对象的多种表现形态你: 人 男人 儿子 学员 公民 外国人多态的表

20、现形式:类:类和类之间有关系 is a 男人 is a 人 继承关系 必要条件: 多种形态之间必须要有继承关系 表现形式: 儿子 a = new 儿子();男人 b = new 儿子(); / 多态的表现形式父类的引用指向子类的实例作用:提高代码的复用性 扩展性很好特点: 1、函数(核心)编译时1.1 多态在编译时,自动检测函数是否被引用用的类型包含,如果不包含 出编译出错运行时1.2 如果子类重写了父类的函数,那么在多态情况下,调用的函数是子类 重写的函数1.3 如果子类没有重写父类的函数,那么在多态情况下,调用的函数是父类的 函数2、静态函数2.1 静态函数的调用取决与引用变量的类型3、非

21、静态属性3.1 和非静态函数一致4、静态属性3.3 首先调用自己的,(先调用引用类型变量所属的类的变量)(焦老师讲课 时,用父类引用调用子类的非静态方法,而非静态方法内部包含了对静态成员变量,所以输 出是子类的静态变量值,如果用父类引用掉用静态成员变量,则结果输出是父类的静态成员 变量的值)哈雷还是哈雷多态中的转型和 instanceof 关键字多态中的转型:基本数据类型的转换:int - long 自动 小类型转大类型是自动的long - int 强制 大类型转小类型是强转的 注意:会损失精度类之间的类型转换:前提是多态1、子类转父类 自动转换2、父类转子类 强制转换 格式: 子类 子 =

22、(子类)父类需求: 如何来判断一个引用变量指向的实例是属于哪个类的instanceof关键字:instanceof判断一个引用变量是否是某一类的实例特点: 子类的引用变量永远是父类的实例子类的引用变量 instanceof 父类 永远是 trueObject: 默认是所有类的终极父类Object的父类是谁? 没有常见方法:toString() :当直接打印一个对象的引用变量时, JVM 默认调用该方法 对类进行描述和说明的 格式:类型内存的哈希码 注意:开发者在定义类的时候应该重写该方法,使得打印的信息更加容易描述类hashCode() :返回对象的内存地址的 hashcode 编码,需要通过

23、 integr 的toHexString()将其转换为Oxequals() :用于判断对象在内存中的地址是否相等(默认是使用=来实现)如果开发者要判断对象的属性是否相等,那么需要重写 Object 的 equals()注意:java规范中定义,两个对象如果equals()返回true,那么要求开发者也要重写hashCode().习惯:当开发者定义类的时候,首先要考虑的是是否要重写 Object的方法?习惯:以上的3 个方法都要重写场景: 买猫?逛街 卖猫(3 只 1 500) 张三 你问题:具体的对象,对象是不是相等 ? 常用? 常用内部类:顾名思义内部的类,也叫做嵌套类(inner clas

24、s I nested class)格 式: 在类的成员位置可以直接定义一个类,把成员位置上的类,称作成员内部类 分 类:1、如果在类的成员位置定义了另外一个类: 称作:成员内部类特点:可以访问外部类的所有的成员属性(private)可以使用private修饰,只有外部类可以访问直接调用内部类的成员函数的格式:外部类.内部类变量=new外部类().new内部类(); 变量.函数名();2、如果在类的成员位置定义了另外一个静态类: 称作:静态内部类特点:无法从静态的上下文中使用this,super或者实例的成员如果内部类中存在静态成员,那么内部类必须声明为静态的3、如果在类的函数中定义了另外一个类

25、: 称作:局部内部类优点:使得包含局部内部类的功能更加明细细节:在包含局部内部类的函数中创建局部内部类的实例要写在局部内部类定义的后面在局部内部类中为了代码的安全性只能访问包含局部内部类的函数的常量,但是可以直接访问外部类的成员4、局部静态类(不存在)特殊:在局部内部类中不存在内部类被修饰为private或者static匿名内部类:interface Cint x = 3;abstract void show();class A/*class B extends Cvoid show()System.out.println(x = +x);*/void function()/ B b = ne

26、w B();/ b.show();new C()public void show()System.out.println(x = +x);.show();/ 匿名内部类class Demo8public static void main(String args)/Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx Tx /*匿名内部类: 指的的是在创建内部类的时候不使用引用变量进行指向,而不是描述内 部类的时候不起名前提: 成员内部类必须继承或者实现某一个特定的抽象类或者接口特点: 1 、可以在创建内部类实例的时候取消内部类的

27、定义2、只适合在抽象类或者接口中有少量的未实现的函数上使用*/A a = new A();a.function();/System.out.println(Hello World!);异常: 异常就是程序可能发生的问题情况 如: int a ; a java 将程序中常见的问题描述为类。java 中的异常体系:-| Throwable所有问题的父类,而且其中定义了一些所有问题的共有的功能| Error 严重的问题(一般程序人员不需要去管理)| Exception 一般的问题(处理)JVM 处理异常的特点:1、发现异常,将异常封装为一个异常的具体的对象 2、采用异常的一些方法打印异常消息3、默认

28、调用的是异常类的printStackTrace()打印异常的详细信息手工处理异常:格式:try/ 写可能发生异常的代码 JVM 会帮助你创建出来异常的对象catch(/ 接受传递的异常的对象)/ 处理问题(异常)finally/ 无论程序正常还是异常都执行特点: 程序发生异常后,后续代码继续执行手工处理异常的细节:1、在 try 中如果语句出现异常,那么异常后面的该语句不执行2、所以要将异常后的代码放在catch语句块结束后3、注意:变量的作用域问题4、在捕获异常的时候,可以使用具体异常的父类来捕获,范围更大5、当使用catch语句捕获多个异常的时候,catch语句块要按照由小到大的顺 序进行

29、否则编译出错java 中的异常声明:1、为什么要有异常的声明?java程序应该显示的告诉函数的调用者,需要捕获异常2、使用的范围:异常的声明只适用与函数声明上3、声明的格式权限 返回值的类型 函数名(/ 形参 参数列表) 异常声明 / 函数体 return 返回值;4、异常声明throws 异常类,异常类好处:异常声明的好处在于,强制告诉调用者需要处理异常 自定义异常:为什么?因为在开发环境中,由于环境的不同,可能有不同的异常,.java不可能 全部都帮助开发者定义,所以 java 提供了异常的自定义功能。自定义的实现:1、创建一个类,继承 Exception 或者子类2、在需要异常的地方创建

30、自定义异常的实例3、使用throw关键字将2中异常对象抛出给catch语句块使用自定义异常消息:方式一:在异常类中重写getMessage()如下:private String message = 老师得感冒了,感冒异常;public String getMessage() return message;方式二:自定义带message参数的构造函数,如下: 感冒(String message”super(message);throws VS throw共同点:1、都是关键字2、都是用来处理异常区别:1、使用位置不同throws函数的参数和函数体的之间来使用 throw 在函数体内使用2、后面跟

31、的内容不同throws跟的是异常类信息,可以跟多个异常类使用,”隔开 throw 跟的是具体的一个异常对象,只能抛出一个具体的对象,如果该关键字单独出现的话,后面的语句执行不到,所以要和if语句结合使用3、作用也不同throws 主要用来声明异常,使得开发者在调用的时候,可以捕获异throw告诉JVM创建异常,并帮忙抛出给调用该方法的函数/ 受检异常和非受检异常-| Throwable-| Error-| Exception-I RuntimeException (运行时异常丨非受检异常)-I NORuntimeException(该类不存在,非运行时异常I受检异常)受检异常:1、当在函数上声

32、明是一个受检异常时,那么java编译器会在编译的时候进行异常的检测,如果有异常,则报错2、当在函数上声明是一个非受检异常时,那么java编译器会在编译的时候不 进行异常的检测,如果有异常,则报错,等声明为非受检异常时可以省略声明语句为什么java中要提供受检异常和非受检异常?因为在某些情况当程序发生异常后,需要终止程序的继续运行,而在特殊情况下需要 继续执行异常后面的代码,所以java就提供了不同的解决方案。数组下标越界异常: 可以避免 for(;);算术异常:if()非法的参数异常: IllegalArgumentException1 、程序人员完全可以避免2、如果发生以上异常,后续的计算是

33、没有意义如何判断一个异常是运行时异常(非受检异常)还是非运行时异常(受检异常)?如果一个异常是RuntimeException的子类,那么该异常就是非受检异常 反之是受检异常应用: 什么时候自定义受检异常?什么时候自定义非受检异常?当程序发生的异常完全可以由程序员的专业素养能够避免,或者该异常的发生已经导致后续的 程序没有必必要再继续执行,那么就可以自定义为非受检异常(运行时异常)当程序的异常是为了提醒程序开发人员,要核对相关的代码的时候,此时就 可以声明为受检异常特点: 运行时异常不需要显示声明该异常,编译通过。 非运行时异常要显示的声明异常,而且调用该函数的时候必须进行异常的处理, 否则编

34、译失败声明异常后函数的重写特点:1、当父类的函数抛出的异常是A,那么子类在重写父类函数的时候可以抛出A或A 的直接子类2、当父类的函数抛出的异常是多个如A,B,那么子类在重写父类函数的时候可以 抛出A和B的子集或者更多的A和B子类 注意:父类没有声明异常,子类有异常需要捕获处理,不能再抛finally:无论程序正常还是异常都会执行finally块作用: 主要用于释放系统资源特点: 当catch语句中出现return语句的时候,JVM会先执行finally在使得函数终 止。当程序中使用System.exit(O);退出JVM时finally不执行处理异常的几种常见的格式:第一种: trycatch()trycatch()catch()定要细粒度的捕获。注意:开发过成中,开发者在捕获异常的时候第二种: trycatch()finally注意: 变量的使用作用域第三种:tryfinally

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!