1.多态
- 非静态成员方法:编译看左边,运行看右边
成员变量:编译看左边,运行看左边
静态方法:编译看左边,运行看左边
2.多态中,属性永远是调用父类中的属性
2.静态与非静态
- 静态属性可以通过类名和对象访问,是这个类所有对象所共享的
- 类中的静态属性跟随着类,一起保存在内存中的方法区
- 非静态属性: 创建对象后,系统会自动给对象中的非静态属性做初始化赋默认值,静态属性:类加载到内存中的时候,系统就会给类中的静态属性做初始化赋值
- 如何记录一个类在一段时间内,一共创建了多少个对象 答:设置一个静态计数器,构造器里面count++
- 静态方法中不能调用类中的非静态方法或非静态属性,不能访问this
- 静态代码块 static{},一般用来给静态成员初始化,随着类的加载而执行
- 匿名代码块:静态代码块,构造代码块。
3.final与abstract
- Final修饰变量,不能被修改,方法不能被重写,类不能被继承
- Final修饰成员变量时必须手动赋值,局部变量不用手动赋值
- Final修饰引用类型变量 ,指的是引用s的指向的对象不能改变(对象的地址不能改),但是可以改变类的属性(name,age)Student s=new Student()
- Abstract
抽象方法:没有方法体的方法abstract void show(),只能存在于抽象类和接口中
接口中不用在void 前写abstract ,默认:public,abstract,
抽象类:抽象类中可以有普通方法,但抽象方法只能存在于抽象类或接口中
抽象类不能进行实例化创建对象,而非抽象类可以实例化创建对象,
他们中都有构造器,但抽象类的不能用来创建对象,可以通过匿名内部类
5. 抽象类是用来被子类继承的,子类继承抽象类,并且实现抽象类中的抽象方法
3.接口:
- Interface,接口最终也会被编译成.class文件
- Jdk8中允许在接口中编写静态方法和默认方法 jdk9中还允许在接口中编写私有方法
接口中的默认方法由接口的实现类对象去调用
Interface Action{
Public void show()
Static void show1(){}
Default void show2(){}
}
Class Test{
Psvm{
Action.show1();}
原因:有利于功能升级,让别人的实现类不用再重写,方便使用
子类能不能重写接口中的静态方法和默认方法呢? 能重写默认,不能重写静态
3. 接口中抽象方法修饰符不能为protected。Private ,必须是public
4. 接口的使用方式:创建接口的实现类+匿名内部类 + lambda表达式
匿名内部类:
new Action(){
@Override
Public void show(){System.out.println(“hello”);}
}.show();
函数式接口
( (Action)()->System.out.println("hello")).show();
5.一个类实现类接口,那么就要实现接口中所有的抽象方法,否则这个类自己就必须声明为抽 象类
6.类是单一继承,接口是多实现,多继承,,一个类实现了多个接口,那么就需要把这多个接口中的抽象方法全都实现
7.实现多接口时,两个父类有同名的默认方法,则在实现类中调用方法时,要表明调用的哪个方法·
default void show2(){
System.out.println("这是Inter2中的默认方法");
}
public void show2() {
Inter1.super.show2();
}
8.接口和接口之间,类和类之间都有继承关系,类之间是单继承,接口之间是多继承
interface inter4 extends Inter3,Inter5{}
9.多态的前提是继承,必须要先有子父类关系,而类和接口之间的实现关系,也是继承的一种形式,所以在类和接口的实现关系中,也可以使用多态