继承
学生类
class Student{ private String name ; private int age ; //提供对外公共访问方法 setXXX()/getXXX() ... }
老师类
class Teacher{ private String name ; private int age ; //提供对外公共访问方法 setXXX()/getXXX() ... }
通过上述代码:
每一个类中都有姓名,年龄,提供对外的公共访问方法,随着开发过程,有很多很多类,每个类中都有这样的属性,开发过程
中代码量大,后期维护麻烦.
能不能将这多个类的共有的属性和共有的方法抽取出来,形成一个独立的类,让当前该类和其他类产生一种关系?
Java提供了一个 技术
继承 :extends synchronized(多线程中讲:同步)
格式:
class Fu{…}
class Zi extends Fu{…}
将刚才的学生类,老师类改进
//定义一个Person类:人类 class Person{ private String name; private int age; public Person(){} public Person(String name,int age){ this.name= name; this.age =age; } public void setName(String name){ this.name = name; } public void setAge(int age){ this.age = age; } public String getName(){ return name; } public int getAge(){ return age; } } class Student extends Person{ public Student (){} public Student (String name,int age){ super(name,age); } } class Teacher extends Person{ public Teacher (){} public Teacher (String name,int age){ super(name,age); } }
子类(存在无参/有参构造)继承父类,父类中有有参构造方法,但是没有提供无参构造方法,
会出现什么现象?如何解决?
编译不通过,
原因:因为子类中的无参或者有参构造默认访问父类无参构造方法…
解决方案:
1)手动给出父类的无参构造方法
2)通过super(传参);访问父类的有参构造方法
3)通过this(),调用本类中无参构造,在通过无参构造方法的super(传参);访问父类的有参
this(…)/super(…);语句都必须在构造方法中的第一条语句; 防止可能出现初始化过多…
public Student(){
//第一条语句
//super() ;
System.out.println("…") ;
}
多态的概念:
一个事物在不同时刻的体现; 多态的前提条件: 1)必须有继承关系 保证当前代码的维护性 2)必须有方法重写 因为每一个具体的事物,功能不一样,应该父类的进行扩展 3)必须有父类引用指向子类对象 父类名 对象名 = new 子类名() ; (向上转型)
多态的成员访问特点:
成员变量: 编译看左,运行看左 成员方法: 编译看左,运行看右(由于存在方法重写) 静态的成员方法:(静态跟类有关系) 编译看左,运行看左 构造方法: 父类创建对象是通过new 子类名() ;也是先对父类数据进行初始化
多态的好处:
1)提高的代码维护性(继承保证) 2)提高的扩展性(多态) Animal a = new 任务具体动物类();
多态的弊端:
无法访问子类的特有功能.
解决方案:
1)通过子类名 对象名 = new 子类名() ; 直接创建子类对象 能用,但是从内存角度考虑,不断在堆内存开辟空间,消耗内存资源... 2)将父类的引用强制转换为子类引用(向下转型) 前提条件:必须有父类引用(必须存在向上转型) 子类名 对象名 = (子类名)父类引用; 向下转型使用不当:会出现一个异常(ClassCastException:类转换异常) 运行时期异常; Animal a = new Cat() ;//猫是动物,内存是猫 //还原成猫 Cat c = (Cat)a; a = new Dog() ; //内存是狗 //Cat c2 = (Cat)a; //编译可以通过,因为符合强转的语法 运行时候发生异常:ClassCastException:类转换异常