基本概念:当多个类都有相同的特征行为时,我们可以将这些类中相同的内容提取出来组成公共类,然后从公共类中派生出新的类,新的类能继承已有类的数据属性和行为,并能扩展新的能力。
java中使用extends关键字来表示继承
例如:
//Teacher类继承自Person类 public class Teacher extends Person{ }
这里的Person就叫做父类、基类、超类,Teacher就叫做子类、派生类、孩子类。
注意:
1.子类可以继承父类的成员变量和成员方法,其中私有成员变量可以继承但不能直接使用,子类不可以继承父类的私有成员方法和构造方法。
理解:①子类不能继承父类的构造方法,因为构造方法名要与类名相同,而子类和父类的类名不 同,所以子类也就不能继承父类的构造方法。
②私有成员(成员=变量+方法)按理说都不能继承,但是这里的私有成员变量是一个特例,可 以被继承,但是私有成员方法就不能被继承。
2.子类在构造对象时编译器会自动在被调用的子类构造方法的第一句加上super();所以如果我们在调用子类的构造方法创建对象时,如果在父类之中我们只定义了有参构造方法而没有定义无参空构造方法,这个时候编译器会报错,所以在使用继承时,在子类的无参构造方法中的第一行调用父类的无参构造方法,在子类的有参构造方法中的第一行调用父类的有参构造方法。
通俗的说就是在子类无参构造方法的第一句加上super(),在子类的含参构造方法的第一句加上super(size,color),这里的size和color只是举了一个例子。
3.JAVA不支持多继承,一个类只能有一个直接父类,继承后子类就可以使用父类中非私有的成员,在子类中可以扩展子类特有的属性和方法。
4.继承之后子类可以调用父类的所有非私有属性和非私有方法。
何时使用继承?
满足is-a的关系时使用(也就是不能滥用继承)
例如:狗继承动物,是同一类,什么是什么。
继承的形式
class 父类{ 成员变量、成员方法 } class 子类 extends 父类{ 类体 }
当一个类没有显示的继承某个类,那么这个类默认继承Object,Object这个类是所有类的基类。
例如:
定义一个父类Animal:
//public class Animal extends Object{
public class Animal{
//成员变量
private String name;
private int age;
//构造方法
public Animal(){
super();
System.out.println("Animal类中的无参构造方法");
}
public Animal(String name){
super();
this.name = name;
System.out.println("Animal类中的有参构造方法");
}
//成员方法,是类的功能
public void eat(){
System.out.println("动物吃东西");
}
//为私有属性对外提供的操作入口
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
定义一个子类Dog类继承父类Animal:
public class Dog extends Animal{
private String color;
public Dog(){
super();
System.out.println("狗类中的无参构造方法");
}
public Dog(String name){
super(name);
System.out.println("狗类中的有参构造方法");
}
public void play(){
System.out.println("狗会玩");
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
}
继承具有传递性
C继承B ,B继承A,那么C类就具有A,B类中非私有的属性和方法。
super():表示调用父类中无参构造,默认存储在,必须放在第一行
this()和super()不能同时出现在同一个构造方法中,因为this()和super()调用构造方法时都要在构造方法中的第一行语句。
例如:定义一个xiaotianquan类继承Dog类,xiaotianquan类既有Dog类又有Animal类的非私有属性和方法。
public class XiaoTianQuan extends Dog{
public XiaoTianQuan(){
//super()表示调用了父类中无参构造方法,默认存储,必须放在第一行,避免在super语句上面就用到了父类的方法,所以先得保证初始化父类
super();
System.out.println("哮天犬类中的无参构造方法");
}
public XiaoTianQuan(String name){
super(name);
System.out.println("哮天犬类中的有参构造方法");
}
//哮天犬它是神犬,它的吃、玩与父类中的实现方式不同,父类中吃、玩不能满足哮天犬需求.
/*在子类中对父类中的方法进行重写(覆盖)
具体语法:
方法名相同,参数列表,返回值类型相同
访问权限修饰符等于或者大于父类的权限
@Override 这java中提供的一个注解标签(是一种标记、记号),
添加此注解的标签表示此方法是从父类重写过来的,就会对其进行语法验证
Override(重写) overload(重载)*/
@Override
public void eat(){
System.out.println("神犬坐着吃饭");
}
public void play(){
System.out.println("神犬飞着玩");
super.eat();
}
public void fly(){
System.out.println("哮天犬会飞");
//super.play(); //误区: super表示父类对象
}
}
new XiaoTiaoQuan();在创建子类对象后,调用构造方法时,从上向下调用,先初始化父类信息:
继承中的构造方法:
1.子类构造方法会先调用父类构造方法
2.使用super关键字调用父类任意一个构造方法,必须写在构造方法的第一行
3.如果子类的构造方法中没有显式地调用基类构造方法,则系统默认调用基类无参数的构造方法。