“继承”是Java 面向对象的三大特性之一。
概念:“继承”是为了解决代码复用问题而产生的,是指一个类的定义可以基于另外一个已存在的类,即子类继承父类。父类与字类的关系,父类拥有子类的全部属性与方法,而子类除了拥有父类的属性和方法之外还可以增加自己特有的属性或者方法。
上面大概讲解了一下概念,下面上代码理解一下。
public class Test11 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Pupil p=new Pupil("小花",25,4000.50f);
p.PrintName();
}
}
//抽象出公共属性,做一个父类->stu
class Students {
String name;
int age;
float fee;
// public Students(String name, int age, float fee) {
// this.name = name;
// this.age = age;
// this.fee = fee;
// }
protected void PrintName(){
System.out.println("我的名字是:"+this.name);
}
}
//做子类————小学生
class Pupil extends Students{
public Pupil(String name, int age, float fee) {
this.name = name;
this.age = age;
this.fee = fee;
}
//小学生会交学费
public void pay(float fee){
this.fee=fee;
System.out.println("我已经缴学费:"+this.fee);
}
}
从以上栗子中讲几点:
1、在父类stu中的构造函数被我划掉,而在子类中我写了构造函数。原来我是有在父类中写构造的,但是发现在new对象的时候无法使用子类的构造函数。经过查询,发现子类确实无法继承父类的构造函数。
原因:看了几个地方,但是仍然讲解的不清楚。有一个说法是“构造函数必须和类同名,在父类中的构造函数名称和父类名称相同,如果子类继承父类的构造,但是构造函数名称又没有改变,这就违背了构造与类同名的原则”。
2、子类可以继承父类的那些属性、方法呢?其实这又涉及到了的访问控制范围,除了private 修饰的父类的属性、方法无法被继承。其他的都可以被继承。(构造函数除外)
子类是父类的特殊化。它除了拥有父类的属性之外,还拥有一些自己的特殊属性。例如猫会捉老鼠、爬树等其他动物不具备的属性,在继承关系中继承者可以替换被继承者,但是反之则不行。例如我们可以说猫是动物,但是不可以说动物是猫。这种关系我们称为“向上转型”