1. 继承的好处:
1.提高代码复用性。
2.让类与类之间产生关系,为面向对象的第三大特征 多态 提供了前提
2.java中支持单继承,不直接支持多继承,但对c++中多继承进行了改良。java通过多实现来解决,一个类可以实现多个接口。
单继承:一个子类只能有一个直接父类。
多继承:一个子类可以有多个直接父类,java中不允许,但进行了改良。因为多个父类如果有同名的成员,多继承会产生调用的不确定性。
3. 当本类的成员和局部变量重名,用this. 区分
当子类的成员和父类成员重名,用super. 区分
this代表一个本类对象的引用,super代表父类空间。
4.在子类构建对象时,父类的构造函数也运行了,为什么?
原因是子类构造函数的第一行有一个默认的隐式语句,super(),调用的就是父类空参的构造函数。如果父类没有空参的构造函数,就会报错,所以这时在子类中就要显示的调用比如:super("aa")
5.子类的实例化过程:
子类的实例化过程:子类中所有的构造函数默认都会去调用父类空参的构造函数,因为子类构造函数的第一行都有一个隐式的super。
为什么子类实例化过程中要访问父类的构造函数?因为子类继承了父类,获得了父类中的内容(属性),所以在使用父类内容之前 ,要先看父类是如何对自己的内容进行初始化的。所以就在子类构造函数中加入super语句。如果父类中没有定义空参的构造函数,那子类的构造函数中必须用super()指定参数来明确调用父类的哪个构造函数,否则报错。
注意:super语句必须定义在子类构造函数的第一行。因为父类的初始化要先完成。
如果子类的某个构造函数的第一行调用了this()即调用子类自己的构造函数,这时候,就不能在该构造函数内调用super,因为this和super都必须放第一行,
子类调用的this构造函数里会调用super,无论如何,子类都会调用父类的构造函数。
6. 子类构造函数调用父类的super时,子类还没有初始化,子类的值仍然是默认初始化值。父类初始化完后才初始化子类对象。
7.final修饰符,修饰类,方法,变量
继承的弊端:打破了封装性。不想被继承的类,可以使用final修饰。
final关键字:
1.final是一个修饰符,可以修饰类,方法,变量。
2.final修饰的类不能被继承。
3.final修饰的方法不能被重写。
4.final修饰的变量是一个常量,只能被赋值一次。
8. 抽象类
特点:
1。方法只有声明,没有实现时,就是抽象方法,需要被abstract修饰,抽象方法必须定义在抽象类中。该类也必须被abstract修饰
2.抽象类不能被实例化。因为调用抽象方法没意义,因为抽象方法没方法体。无法运行。
3.抽象类的子类必须重写了父类的所有的抽象方法,子类才可实例化,否则子类仍然是抽象类,也不能实例化。
abstract class Demo
{
abstract void show();//没有方法体{}
void show2()//非抽象方法
{
}
}
抽象类的几个问题:
1.抽象类中有构造函数吗?
有,抽象类中的构造函数用于给子类对象初始化。
2.抽象类中可以不定义抽象方法吗?
可以,但是比较少见,目的就是不让该类创建对象。AWT类就是这种
3.抽象关键字abstract不可以和哪些关键字共存?
private 不行:抽象方法要被重写,私有的方法子类重写不了。
static 不行:静态抽象方法可以被类名调用,抽象方法调用没意义。
final 不行:final修饰的类不能被继承,final修饰的方法不能被重写。
4.抽象类和一般类的异同点?
相同点:都是用来描述事物,都定义了成员
不同点:
一般类有足够的信息描述事物,抽象类描述信息不足。
一般类中不能定义抽象方法。抽象类中可以定义抽象方法,也可以定义非抽象方法。
一般类可以被实例化,抽象类不能被实例化。
5.抽象类一定是个父类吗?
是的。因为需要子类覆盖(重写)其中的抽象方法,才可以对子类实例化。
9.接口 interface
当一个抽象类中的所有方法都是抽象的时候,可以用接口来定义。
interface Demo
{
abstract void show1();
abstract void show2();
}
接口编译完生成的依然是.class文件,java中全部是用class文件来表示字节码。
接口中成员:都有固定的修饰符
1.全局常量 public static final ----接口中这三个都可以不显示写出,编译的时候也会加上。建议都写上
2.抽象方法 public abstract ----接口中 可以不显示写出,编译的时候也会加上。建议都写上
由此得出结论,接口中的成员都是公共的public,所以接口中的成员可以不显示写出修饰符
interface Demo
{
int num=4;--- public static final int num=4;
void show();--- public abstract void show();
void show();--- public abstract void show();
}
接口不能实例化,必须有实现该接口的子类重写了所有的方法后,该子类才能实例化,如果子类没有全部重写所有方法,该子类是抽象类,不能实例化。
在java中不直接支持多继承,java将多继承机制进行了改良,在java中变成了多实现。一个类可以实现多个接口。
10. 接口与抽象类异同点:
相同点:都是不断向上抽取而来,描述都不够具体。
不同点:
1.抽象类需要被继承,接口需要被实现
2.抽象类中可以定义抽象方法和非抽象方法,子类继承后可以直接使用非抽象方法,接口中必须全部是抽象方法,必须由子类全部重写。
3.抽象类的继承是 is a 关系,接口的实现是 like a 关系。