一、static、
1、用static修饰的变量叫类变量,静态变量;
类加载时 初始化一次当前变量并赋值 再次调用赋值会改变值(未赋值默认为0)
修饰的变量作用在所有该类的具体实例上
调用: 类名.变量 可更改值
2、调用父类的构造方法不能使用静态修饰的方法,
静态修饰的方法不存在父类里,不存在构造器里,没有权力重写。
静态的方法 只可以调用静态变量,不可以使用成员变量;
实例的方法 可以调用静态和非静态的。
3、static、final 修饰的方法不能被重写
abstract 必须重写
运行顺序:静态变量和静态代码块 成员变量和代码块快 构造方法 静态方法 实例方法
二、接口、
1、为了解决单继承问题,不想用也被调用的问题
是方法级别的抽象,必须有重写
接口不是类,没有构造器,不能被实例化;
2、默认为公有的静态常量;public static final
默认为公有的抽象的方法;public abstructor
可以同时继承和接口实现
3、 interface +接口名 =接口 物理接口 可以使用不同的能力 可以使用多种方法
implements(实现):接口继承
接口隔离原则: 两个方法没有关系放在两个接口里
4、jdk 1.8之后,新加了default 、static两个方法:
JDK8开始,接口中可以定义有方法体的方法,方法必须被default和static修饰。除此之外,其 他方法都是抽象方法。
5、接口和抽象类的相同点:都必须重写;不能实例化,设计与实现相分离
接口和抽象类的区别:
接口 | 抽象类 |
interface | abstract |
方法级别的抽象,没有构造方法 | 类级别的抽象,有构造方法 来完成属于抽象类的初始化 操作 |
implements可加多个接口 | 单继承 |
默认为公有的抽象方法 | 可有非抽象 |
默认为公有的静态常量
只能包含抽象方法,静态方法和默认方法 完全可以包含普通方法
不能包含初始化块 完全可以包含初始化块
类可以实现接口,接口不可以实现类,但是可以继承接口,相当于能力的累加,而且支持多重继承
a instanceof B 判断a属不属于B类
三、上转型对象(小转大)
编译看左边,运行看右边。
1、编译的时侯认为对象是父类的,所以不能显示调用子类的
2、运行时认为是子类的
3、占用子类的内存空间
4、拥有父类的基本属性
编译看左边,运行看右边。 父类型引用指向子类型对象,无法调用只在子类型里定义的方法
子类中的方法覆盖父类的方法以后,由于向上转型,父类调用的方法实际上是子类的。
里氏代换原则:父类出现的地方子类一定出现
子类出现父类不一定可以出现