在子类创建对象时,发现父类的构造方法也运行了,为什么呢?
在子类的构造函数中第一行有一个隐式语句super();
class Fu{
Fu(){
System.out.println("Fu is running");
}
}
class Zi extends Fu(){
Zi(){
//super(); 隐式语句 空参数构造函数
System.out.println("Zi is running ")
}
}
如果父类没有空的构造函数,子类必须用super()明确调用哪个构造函数。
一个对象实例化的过程
Person person=new Person();
- JVM会读取指定路径下的Person.class文件,并加载进内存,并会先加载父类
- 在堆内存中开辟空间,分配地址
- 并在对象空间中给成员属性默认初始化
- 调用对应的构造函数进行初始化
- 在构造函数中第一行调用的是父类的构造函数
- 父类构造函数的调用完后,对子类的属性进行显式初始化
- 在进行子类构造函数的特定初始化
- 初始化完毕后,将地址值赋给引用变量
final关键字(继承弊端,打破了封装性)
- final是一个关键字,可以修饰类,方法,变量
- final修饰的类不可以被继承
- final修饰的方法不可以被覆盖
- final修饰的变量是一个常量,只能赋值一次
为什么要用final?
其实如果一个数据是固定的,直接使用这个数据就行了,但是这样阅读性差 ,所以给该数据起个名字,且不能变化,加上final
抽象类abstract
- 方法只有声明而没有实现时,该方法是抽象方法需要用abstract修饰,抽象方法必须定义在抽象类中,该类也必须用abstract修饰
- 抽象类不可以被实例化,因为调用抽象方法没有意义
- 抽象类必须有子类覆盖其所有抽象方法后,其子类才可以实例化,否则该子类还是抽象类。
抽象类有关问题
- 抽象类中有构造方法吗?
有,给子类进行初始化
- 抽象类可以不定义抽象方法吗?
可以,但是很少见,目的就是不让该类创造对象,AWT适配器就是这种类。通常这个方法中有方法体但是没有内容
abstract class Demo{
public void show(){}
public void show2(){}
}
- 抽象类关键字不可以与哪些关键字使用
- private 因为抽象方法需要被覆盖
- static 抽象方法的调用没有意义
- final 抽象类需要被继承,抽象方法需要被覆盖
- 抽象类和一般类的异同点
一般类有足够的信息描述
抽象类的信息可能不足
一般类中不能定义抽象方法
抽象类中可以定义抽象方法和非抽象方法
一般类可以被实例化
抽象类不可以被实例化
抽象类继承练习
abstract class Employee{
private int id;
private String name;
private doublie pay;
Employee(int id,String name,doublie pay){
this.id=id;
this.name=name;
this.pay=pay;
}
public abstract void work();
}
class Programmer extends Employee{
Programmer(int id,String name,doublie pay){
super(id,name,pay);
}
public void work(){
System.out.println("code...");
}
}
class Manager extends Employee{
private double bouns;
Manager (int id,String name,doublie pay,double bouns){
super(id,name,pay);
this.bouns= bouns;
}
public void work(){
System.out.println("check...");
}
}
接口
当一个抽象类中的所有方法都为抽象方法时,这是可以通过接口来表示。
接口中常见的成员都有固定的修饰符
全局常量 public static final
抽象方法 public abstract
接口中的成员都是公共权限
interface Demo{
public static final int num=4;
public abstract void show();
}
类与类之间是继承关系,类与接口之间是实现关系,接口与接口是继承关系,接口可以多继承
接口不可以实例化
只有实现了接口的子类覆盖了所有抽象方法后该子类才可以实例化,否则该子类是一个抽象类
interface Demo{
public static final int num=4;
public abstract void show();
}
class Demo1 implements Demo{
public abstract void show(){}
}
在java中不支持多继承,因为会出现不确定性,因为父类的方法都含有方法体,java进行了改良成多实现,不会出现调用的不确定性,因为接口都为抽象方法没有方法体需要实现
interface Demo1{
public static final int num=4;
public abstract void show();
}
interface Demo2{
public abstract void show();
}
class Demo3 implements Demo1,Demo2{
public abstract void show(){}
}
抽象类与接口的区别
1、抽象类需要被继承,只能单继承
接口需要被实现,可以多实现
2、抽象类可以定义非抽象方法,子类继承后可以使用非抽象方法
接口只能定义抽象方法
3、抽象类的继承是 is a关系,是体系中的共性内容
接口是 like关系,是体系中的额外内容(扩充)