继承
单继承
class 类名 extends 父类
父类中的属性子类都有,只是有的不能被访问
子类构造方法是无参的,不用写super();系统默认调父类无参
子类构造方法是有参的,要调用父类无参就必须写super();
类的加载
1.什么是类的加载 load (Node类的加载)
从硬盘中找到Node.class文件,解析该内容,生成Node类,把Node类的信息存放到内存的方法区,
直接和CPU打交道的是内存,数据都要在内存中,从硬盘上把文件提取到内存上,
2.什么情况下触发类的加载,并且该类不在内存中
1)按需加载(懒加载过程)
1.实例化该类的一个对象 new Node(1);
2.使用该类的静态属性或静态方法 ;
3.要用子类,必须要有父类,要加载父类
3其他规则
静态属性初始化顺序:
按照代码的书写顺序,执行
1.静态属性定义时的初始化
2.静态代码块(静态初始化器)
对象的构造/实例化 new Node
规则:
1.优先初始化父类的属性
2.按照下面的顺序执行初始化
1.按照代码书写顺序,执行定义时和构造代码块
2.再去执行构造方法
1.定义时初始化
2.构造代码块初始化
3.构造方法初始化
abstract关键字有什么作用?
1.修饰类,该类是抽象类,无法被实例化的类,等着被继承的类
abstract class A {} //new A();是错的
2.修饰方法,该方法是抽象方法,没有被实现的方法
abstract void method();
包含抽象方法的类一定是抽象类
抽象类不一定包含抽象方法
final关键字有什么作用?
1.修饰变量,该变量的值只能被初始化一次,无法再修改
2.修饰类,该类无法被继承
3.修饰方法,该方法无法被覆写
final类中可以有abstract方法吗?
两者是对立的,final不能被继承,abstract类必须要被继承,若不被继承,它本身又不能实例化,没啥用
final类与final没啥关系,完全独立
重载Overload和覆写Override(重写)
1.方法签名:方法名+形参列表
重载:方法名相同,形参列表不同
2.覆写,发生在子类继承父类 或者 类接口实现
1.方法名和形参列表相同
2.方法的返回类型和比父类的返回类型小
Animal find() { }
Brid find() {}
3.访问限定符 访问限定符只能比父类的大,或相同
但父类方法的访问限定符要是private则在子类中方法不能被覆写
4.@Override注解
接口:
interface 接口名 extends A,B,C {
// 合同/契约
void method();
// 1.public
// 2.abstract
public abstract void method();
}
1.引用只能指向对象,或者什么都不指向
2.数组引用,类类型引用,接口类型的引用
3.对象:数组对象,非抽象类类型的对象
interface I {}
class P {}
class A extends implements I {}
那些引用 可以指向该对象
I i=new A();
P p=new A();
A a=new A();
P method() {
return new P();
return new A();
}
返回的是P类型的引用,可以指向A或者P的对象,因为A是P的子类