继承
学生类
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:类转换异常