1.多态
1.1多态的介绍
1. 引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。
2. 将子类对象赋值给父类引用,在编译时调用的是父类中的方法,而运行的时候一旦子类覆盖了父类中的方法,调用的就是覆盖后的方法。多态是为了让我们实现代码的灵活性和封装性
3. 向上转型:子类对象可以直接赋值给父类引用,但是这个时候的引用调用的范围只能是从父类继承过来的属性和方法。父类类型 变量1 = new 子类构造方法();
4. 向下转换:先有向上转型才能将转型的变量,再次转换回原来的数据类型,那么这个时候既可以调用继承过来的方法,又可以调用本类中新增加的方法。
子类类型 变量2 =(子类类型)变量1;
5. 类型不相同的时候是不可以转型的。
1.2变量同名
如果子类和父类有相同的变量名称,并不是覆盖的关系。在多态的情况下调用的是父类中的变量,在子类中可以使用super和this来区分该变量到底是父类中的还是子类中的变量。
1.3方法同名
当子类覆盖父类中的方法的时候在多态的情况下调用的是子类中覆盖后的方法。
当子类和父类中存在同名的静态方法的时候,在多态情况下调用的是父类中的静态方法,因为静态方法是不要通过对象就可以调用的。(子类和父类有同名的静态变量的时候的调用方式和静态方法的调用方式相同)。
1.4类型判断
1. 使用 instanceof进行类型判断,这样我们就可以通过限定来进行类型转换。
2. 子类对象 instanceof 父类—— true
3. 父类对象 instanceof 子类—— false
2.面向对象中的相关关键字
2.1static
2.1.1静态变量
1. 使用static修饰的变量称为静态变量,基本数据类型和引用数据类型都可以修饰。
2. 使用static修饰的变量是为这个类的所有对象共享,它在加载类的时候就已经在内存中由jvm分配了内存空间,所以不一定要使用对象来调用,那么使用类名.静态变量可以直接调用。
3. 在静态方法和非静态方法中可以使用静态变量,但是不可以定义静态的属性。
2.1.2静态方法
1. 使用static修饰的方法在加载类的时候就已经处于可运行的等待状态。
2. 在static修饰的方法内部不存在this,因为该方法比对象还先占用可运行的空间。
3. 静态方法只能直接调用静态变量,如果要想调用非静态变量,就只能创建对象,通过引用来调用,明确标识这个变量是哪个对象的。
4. 非静态的方法是可以直接调用静态和非静态变量
2.1.3静态代码块
1. 静态代码块和非静态代码块作用就是用来初始化类的。静态代码块不管对象有多少个,都只会被执行一次;非静态代码块有多少个对象就会被调用多少次。
2. 静态代码块和非静态代码块都先于构造方法被调用,静态代码块和非静态代码块是先于非静态代码块被调用,代码块是自动调用的。
3. 静态代码块和非静态代码块的特性和静态方法和非静态方法的特性基本相同
4. 在jdk1.4之前是在加载类的时候就马上执行静态代码块,但是在jdk1.4之后加载的时候并不会马上执行静态代码块,只有在调用静态变量、方法、创建对象的时候才会被执行,这是因为调用静态变量、方法、创建对象的时候都有可能要使用到静态代码块的初始化后的值或者业务。
2.1.4main方法解释
1. 使用public是为了使该方法访问权限最大化;
2. 使用static是为了在加载该类的时候就已经占用内存空间;
3. 使用void 不用给jvm返回任何数据;
4. 使用main这是所以计算机语言程序入口的约定;
5. 使用String数组是为了我们可以在启动的时候得到由jvm传入的数据。
2.2final
根据程序上下文环境,Java关键字final有“这是无法改变的”或者“终态的”含义,它可以修饰非抽象类、非抽象类成员方法和变量。
2.2.1final类
1. final类不能被继承,没有子类,final类中的方法默认是final的。
2. 常见的用final修饰的类有:字符串操作的3个类、Math、8中基本数据类型的封装类。
3. final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许 改变,并且确信这个类不会载被扩展,那么就设计为final类。
2.2.2final属性
1. 使用public static fianl修饰变量成为常量,常量名称为大写。
2. 静态常量只能显示赋值或者静态代码块赋值。
3. fianl定义的全局变量在使用前一定要显示赋值(有且一次),有3种赋值方式:
第一种:在定义该变量的时候就进行赋值
第二种:使用代码块在声明之后赋值
第三种:在构造方法中进行赋值操作
(在创建对象之前赋值就可以了)
4. fianl修饰的基本数据类型不能改变值,fianl修饰的引用数据类型不能改变地址值,但是引用数据类型可以改变内容
5. 当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。
2.2.3final方法
1. 如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。
2. final方法不能被子类的方法覆盖,但可以被继承。
3. final不能用于修饰构造方法。
4. 使用final方法的原因有:第一、把方法锁定,防止任何继承类修改它的意义和实现;第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。
5. 父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。
6. 抽象类和抽象方法都不可以修饰为fianl,因为抽象类就是用来被继承的,抽象方法就是用来被重写的。
3.抽象类
1. 在抽象类中的方法是部分实现、部分只是定义。
2. 如果一个类中定义了抽象方法,该类一定要定义为抽象类。
3. 在抽象类中有构造方法,但是该抽象类不可以自己创建对象,因为该类中可能含有没有实现的方法,但是可以通过子类中super来创建抽象类的对象。
4. 继承抽象类的子类,一定要覆盖抽象类中的抽象方法,如果子类不想实现抽象类中的所有抽象方法,该子类就要修饰为抽象类,交由该抽象子类的子类来实现抽象类。
5. 抽象类可以继承抽象类,也可以继承实现类,使用抽象类的顶级父类就是Object。
6. 因为抽象类就是用来被继承的,所以不可以修饰为fianl
4.接口
4.1接口的概念
1. 概念性的接口,即指系统对外提供的所有服务。类的所有能被外部使用者访问的方法构成了类的接口。
2. 二是指用inteface关键字定义的实实在在的接口,也称接口类型。它用于明确地描述系统对外提供的所有服务,能够更加清晰地把系统的实现细节与接口分离。
4.2接口的特征
1. 接口的成员变量默认是public、static、final类型的,必须被显示初始化。
2. 接口中的方法默认都是public、abstract类型。
3. 接口中只能包含public、static、final类型的成员变量和public、abstract类型的成员方法。
4. 接口没有构造方法,不能被实例化。只能通过该接口的实现类来创建对象。
5. 一个接口不能实现另一个接口,但是它可以继承多个其他接口。
6. 接口必须通过类来实现它的抽象方法,类实现接口的关键字为:implements。
7. 与子类继承抽象父类一样,当类实现了某个接口,它必须实现接口中所有抽象方法,否则这个类必须被定义为抽象类。不允许创建接口的实例,但是允许定义接口类型的引用变量,引用变量实现了这个接口的类的实例。
8. 一个类只能继承一个直接父类,但是可以实现多个接口。
9. 一个实现类可以继承一个类,同时可以实现多个接口,是先继承再实现,(为什么是先继承再实现:防止重写父类中不要重写的方法)。
10. 当父类中的变量和接口中的变量重名时:
1) 用类名和接口名称来区分;
2) 如果父类和接口中变量名称相同,但是类型不同的时候不会出现语法错误。
11. 当父类中的方法和接口中的方法重名时:
1) 方法完全相同的时候子类不用再重写接口中的方法,这个时候使用的就是继承的方法;
2) 当父类中的方法和接口中的方法构成重载的时候,需要重写接口中的方法。
5.修饰符
1. 在没有继承的情况下
修饰符 |
同一个类中 |
同包不同的类中 |
不同包和不同工程 |
private |
true |
|
|
默认(什么都不加) |
true |
true |
|
protected |
true |
true |
|
public |
true |
true |
true |
2. 在继承的情况下
修饰符 |
同包的子类中 |
不同包和不同工程 |
private |
|
|
默认(什么都不加) |
true |
|
protected |
true |
true |
public |
true |
true |
6.嵌套类介绍
嵌套类的分类:静态嵌套类和非静态嵌套类
非静态嵌套类分为3种:普通内部类、局部内部类、匿名内部类
为了的调用的方便,在大量的设计模式和多线程网络编程已经SSH框架中使用
6.1静态嵌套类
1. 静态嵌套类的作用和静态方法相似:可以定义静态和非静态方法和变量。
2. 静态和非静态方法中可以调用外部类中的静态方法和变量,如果要想调用外部类中的非静态的属性或者方法的时候就要创建外部类的对象,通过引用来调用
3. 静态类中的静态属性和方法是可以直接通过静态类的类名来调用,而非静态方法就要创建静态类的对象调用
6.2普通内部类
1. 定义在类的内部、方法、构造方法、代码块外部的嵌套类,这样的类就称为普通内部类。
2. 普通内部类的语法:
1) 普通内部类可以有4种修饰符权限;
2) 普通内部类可以可以修饰为final,普通内部类可以继承和被继承,但是一旦修饰为final类型以后就不可以被继承;
3) 抽象类和接口都可以定义到类的内部,那么这样普通内部类就可以继承抽象类或者实现接口;
4) 普通内部类中只能定义非静态的属性和方法。
3. 普通内部类中的调用:
1) 普通内部类中的方法可以调用外部类中的非静态和静态的属性和方法;
2) 普通内部类中的方法和外部类中的方法同名的情况调用:在调用的时候如果没有任何前缀限制的时候调用的是普通内部类中方法(就近原则),如果使用的是this.test()调用的就是普通内部类中的方法,如果使用的是OuterClass.this.test()掉用的就是外部类中的方法,变量同名的调用方式就和方法被调用的方式相同。
4. 普通内部类中的变量被外部类调用:
1) 创建普通内部类的对象,通过引用来调用
2) 静态嵌套类中的静态方法和变量在外部类中可以直接使用类名调用,而非静态的属性和方法就要创建对象调用
6.3局部内部类
1. 为方法提供服务的类;
2. 局部内部类不使用任何修饰符;
3. 局部内部类可以定义在非静态方法和静态方法中,但是局部内部类不可以修饰为static(注意:只要有花括号的地方都可以定义嵌套类);
4. 局部内部类中不可以定义静态属性和方法;
5. 在方法中可以定义抽象的类,不可以定义接口;
6. 局部内部类可以继承抽象类,实现方法、外部的接口;
7. 当局部内部类和外部类属性同名的情况:使用OuterClass.this.age和this.age来区分外部和局部;
8. 当局部内部类和嵌套来类的方法属性同名的情况:只能调用局部内部类中的属性;
9. 当局部内部类和嵌套来类的方法属性不同名情况:可以直接调用外部类中的变量;可以直接调用嵌套该类的方法中定义变量,但是该变量一定要修饰为fianl(方法中定义为fianl类型的变量,是为了在创建局部内部类对象的时候copy一份来自嵌套方法的变量,因为方法中定义的变量会随着方法执行完毕而消亡,而局部内部类创建对象的生存周期会长于嵌套该类的方法);
10. 局部内部类的对象只能在嵌套该类的方法中创建。
6.4匿名内部类
1. 没有名称的类,直接创建对象传递引用参数,直接创建对象通过对象引用调用匿名内部类中的方法;
2. 匿名内部类是一个变相的继承和实现,当业务不是很复杂的时候我们就是要匿名内部类的方式去调用另外一个类中的方法完成相关业务。
3. 可以从父类中继承属性和方法,同时也可以自己增加新的方法。
4. 匿名内部类没有构造方法,但是可以调用继承的实现类或抽象类的构造方法;
PS:还是笔记