今天我们来说一下在java中面向对象的3大特性中的继承(extends),所谓继承就是把父类的所具有的的一些特征传递给子类,使子类具有父类某些特征的方式,现在给大家非常正规的说一说!!
继承:继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
Animal类:
public class Animal {
private String name;
private int age;
public Animal(){
System.out.println("动物无参数");
}
public Animal(String name,int age){
this.name=name;
this.age=age;
System.out.println("动物有参数");
}
public void run(){
System.out.println("动物跑步");
}
public void eat(){
System.out.println("动物吃饭");
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void shouInFo(){
System.out.println("名字:"+name+"年龄:"+age);
}
}
狗类:
public class Dog extends Animal {
private String color;
public Dog(String name,int age,String color){
super(name,age);
//子类的构造方法被调用时,必须在构造方法的第一行调用父类任意的构造方法,使用super
this.color=color;
System.out.println("动物有参数");
}
}
哮天犬类:
public class xtq extends Dog {
public xtq(String name,int age,String color){
super(name,age,color);
System.out.println("哮天犬有参数");
}
public void fly(){
System.out.println("神狗会飞");
}
}
测试:
public class text {
public static void main(String[] args) {
xtq xt=new xtq("啸天犬",1000,"白色");
xt.shouInFo();
xt.fly();
}
}
运行结果:
1.子类继承父类的成员变量
当子类继承了某个类之后,便可以使用父类中的成员变量,但是并不是完全继承父类的所有成员变量。具体的原则如下:
1)能够继承父类的public和protected成员变量;不能够继承父类的private成员变量;
2)对于父类的包访问权限成员变量,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
3)对于子类可以继承的父类成员变量,如果在子类中出现了同名称的成员变量,则会发生隐藏现象,即子类的成员变量会屏蔽掉父类的同名成员变量。如果要在子类中访问父类中同名成员变量,需要使用super关键字来进行引用。
2.子类继承父类的方法
同样地,子类也并不是完全继承父类的所有方法。
1)能够继承父类的public和protected成员方法;不能够继承父类的private成员方法;
2)对于父类的包访问权限成员方法,如果子类和父类在同一个包下,则子类能够继承;否则,子类不能够继承;
3)对于子类可以继承的父类成员方法,如果在子类中出现了同名称的成员方法,则称为覆盖,即子类的成员方法会覆盖掉父类的同名成员方法。如果要在子类中访问父类中同名成员方法,需要使用super关键字来进行引用。
方法的重写(覆盖)
子类中出现与父类一模一样的方法时(除了权限修饰符,权限修饰符大于等于不包括private,返回值类型,方法名和参数列表相同),会出现覆盖操作,也称为重写或者复写。
父类私有方法,子类看不到,因此父类私有方法的重写也就无从谈起。
覆盖注意事项:
- 覆盖时,子类方法权限一定要大于等于父类方法权限;
- 静态只能覆盖静态。
覆盖的使用场景:
当子类需要父类的功能,而功能主体子类有自己特有内容时,可以复写父类中的方法,这样,既沿袭了父类的功能,又定义了子类特有的内容。
方法重写和重载有什么区别?
方法的重写用在子类方法与父类方法一模一样时,除权限修饰符,返回值类型,方法名和参数列表都是相同的。
重载用在同一个类中各方法方法名相同,参数列表不同(与返回值类型没有关系)的情况。
子父类中构造方法的用法:
- 子类的初始化过程中,首先回去执行父类的初始化动作。因为子类的构造方法中默认有一个super()。子类要使用父类的成员变量,这个初始化,必须在子类初始化之前完成。所以,子类的初始化过程中,会先执行父类的初始化。
- 如果父类没有无参构造方法
- 使用super调用父类的带参构造。推荐方式。
- 使用this调用本身的其他构造。
静态代码块、构造代码块,构造方法的执行顺序:
父类静态代码块→子类静态代码块→父类构造代码块→父类构造方法→子类构造代码块→子类构造方法
希望可以帮到大家!!