一,继承
继承:将多个类中的公共部分提取出来作为独立的一个类,而这个独立的类与多个类之间存在着一种关系,这种关系我们称之为继承关系.
a.继承的特点:
1:java中只支持单继承不支持多继承,也就是说一个子类只能有一个父类.
例如:A类继承了B类,A类就不能同时在继承其他类
2:java支持多层继承.
例如:B类继承A类然后C类继承B类这样子称之为多层继承.
b.继承的优点:
1:提高了代码的复用性
2:提高了代码的维护性
3:继承使得类与类之间产生了一中关系,这种关系时多态的前提
c.继承的缺点:
1:继承使得代码之间的耦合性增强
2:违背了java遵守的"低耦合","高内聚"的开发原则
低耦合:指的是类与类之间的联系的紧密程度,两个类的关系越深,耦合性越高.
高内聚:指的是单个类独立处理事件的能力,能力越强内聚程度越高.
d.继承中this与super的区别:
this:代表的是当前类的引用,或者说是当前类的对象
super:代表的是父类的引用,或者说是父类的对象
下面是几个在继承中常见类型的实例代码:
package javaSE_day07;
/*
* 继承的注意事项:
* 1:子类不能继承父类的私有成员(方法/变量)
* 2:子类不能直接访问父类中的构造方法,但是可以通过super()
* 间接访问父类的构造方法
* 什么时候使用继承:
* 1:当某个类和另一个类满足 is a 的关系时就可以使用继承
* 例如:
* Person 类
* student 类
* 由于student 类 是 Person 类的一种 因此可以利用继承关系
* */
class Father2{
public int num = 100;//成员变量
private int num1 = 200 ;//私有成员变量
public void method(){//成员方法
System.out.println("我是爸爸");
}
//私有成员方法
private void method1(){
System.out.println("我是私有方法");
}
}
class Son2 extends Father2{
public int num3 = 333;
public void fun(){
System.out.println(num3);
// System.out.println(num1);子类无法访问父类中的私有成员
}
}
public class ExtendsDemo3 {
public static void main (String [] args){
Son2 son2 = new Son2();
son2.fun();//333
son2.method();//子类可以访问父类中的非私有成员方法
// son2.method2(); 无法访问父类的私有成员方法
System.out.println(son2.num);//子类对象调用父类的成员变量 100
System.out.println(son2.num3);//调用自己的成员变量333
}
}
执行结果:
我是爸爸
我是儿子
30
20
10
package javaSE_day07;
/**
* Created by 杨凯 on 2017/10/26.
*/
/*
* 继承中构造方法之间的关系:
* 1:不管是子类中的有参构造还是无参构造都要默认的访问父类中文档无参构造
* 2:子类在进行初始化的时候,必须父类先要初始化完毕后,子类才开始初始化
* 3:子类中的构造方法中的super()被隐藏
* 为什么子类的构造方法要默认的访问父类中的无参构造呢?
* 原因是子类继承父类初始化,当子类进行初始化的时候,此时父类还没有初始化
* 所以必须等到父类初始化完毕时,子类才能初始化
* */
class Fu3{
public Fu3(){
System.out.println("我是父类的无参构造");
}
public Fu3(String name){
System.out.println("我是父类的有参构造");
}
}
class Zi3 extends Fu3{
public Zi3(){
//省略了super();
System.out.println("我是子类的无参构造");
}
public Zi3(String name){
//省略了super();
System.out.println("我是子类的有参构造!");
}
}
public class ExtendsDemo6 {
public static void main(String [] args){
Zi3 zi3 = new Zi3();
//当new一个子类对象的时候此时默认调用父类中的无参构造
Zi3 zi31 = new Zi3("尹阳");
}
}
执行结果:
我是父类的无参构造
我是子类的无参构造
我是父类的无参构造
我是子类的有参构造!
package javaSE_day07;
/**
* Created by 杨凯 on 2017/10/26.
*/
/*
* 问题:
* 在继承中父类中没有给出无参构造时,子类的构造函数就无法访问父类中
* 的无参构造这样会出现什么问题?
* 子类构造报错
* 解决方案:
* 1:父类添加无参构造
* 2:子类的构造通过super关键字显式的去访问父类中的有参构造
* super(..)写在子类构造方法的第一行
* 3:子类可以通过this关键字去调用其他的构造方法去间接地访问父类中的有参构造
* */
class Father3{
public Father3(String name){
System.out.println("我是父类中的有参构造");
}
}
class Son3 extends Father3{
public Son3(){
this("尹阳");//通过this访问本类中有参构造函数间接访问父类的构造函数
System.out.println("我是子类的无参构造");
}
public Son3(String name) {
super(name);
System.out.println("我是子类的有参构造");
}
}
public class ExtendsDemo7 {
public static void main(String [] args){
Son3 s3 = new Son3("尹阳");
Son3 son3 = new Son3();
}
}
执行结果:
我是父类中的有参构造
我是子类的有参构造
我是父类中的有参构造
我是子类的有参构造
我是子类的无参构造