Java面向对象——继承 和 super关键字

1、基本实例

class FatherClass{
    public void eat(){
        System.out.println("这是父类中的吃饭方法!");
    }
    public void sleep(){
        System.out.println("这是父类中的睡觉方法");
    }
}
class ChildClass extends FatherClass{ //子类继承父类
    public void play(){
        System.out.println("这是子类中的玩方法");
    }
    public void eat(){//在子类中构成了方法的重载
        System.out.println("这是子类中的吃饭方法");
    }
}
public class Test{
    public static void main(String[] args){
        ChildClass t1 = new ChildClass();//子类的初始化
        t1.sleep();//输出:这是父类中的睡觉方法
    }
}
  • 多个类存在相同的属性和方法时,可以将这些属性和方法单独放到一个类中
  • 使用 extends 关键字
  • 提高了代码的复用性和维护性

2、特点

  • Java只支持单继承,不支持多继承(也就是一个子类只能有一个父类)

    class child extends father{} //对
    class child extends father1,father2{} //错

  • Java支持多层继承

    class A{}
    class B extends A{}
    class C extends B{}

3、注意事项

  • 子类只能继承父类的非私有方法和成员变量
  • 子类不能继承父类的构造方法,可以通过 super 关键字去访问父类的构造方法
  • 不要为了部分功能而继承

4、super 关键字

  • super 关键字和 this 关键字的区别

this :代表本类对应的引用
super:代表父类引用

this.成员变量:调用本类的成员变量
super.成员变量:调用父类的成员变量

this.成员方法:调用本类的成员方法
super.成员方法:调用父类的成员方法

this(…):调用本类的构造方法
super(…):调用父类的构造方法

例如:

class FatherClass{//父类
    public int num = 10;//父类变量
}
class ChildClass extends FatherClass{//子类继承父类
    public int num = 20;//子类变量
    public void show(){//子类方法
        int num = 30;//局部变量
        System.out.println(num);//输出30
        System.out.println(this.num);//调用本类中的成员变量,输出20
        System.out.println(super.num);//调用父类中的成员变量,输出10
    }
}
public class Test{
    public static void main(String[] args){
        ChildClass t = new ChildClass();//实例化子类
        t.show();//调用子类中的show方法
    }
}

5、子类中所有的构造方法默认访问父类中空参数的构造方法,子类初始化之前一定会完成父类的初始化。
例:

class Fu{
    public Fu(){
        System.out.println("父类中的无参构造方法");
    }
    public Fu(String name){
        System.out.println("父类中的有参构造方法,参数:"+name);
    }
}
class Zi extends Fu{
    public Zi(){
        //super();//系统默认自带super关键字
        System.out.println("子类中的无参构造方法");
    }
    public Zi(int age){
        //super();//系统默认自带super关键字
        System.out.println("子类中的有参构造方法,参数:"+age);
    }
}
public class Test{
    public static void main(String[] args){
        Zi t1 = new Zi();//系统默认先访问父类的无参构造函数,然后访问子类的无参构造函数
        System.out.println("-------------------------");
        Zi t2 = new Zi(18);//系统默认先访问父类的无参构造函数,然后访问子类的有参构造函数
    }
}

运行结果:
在这里插入图片描述
6、父类没有无参构造方法时

  • 在父类加一个无参构造方法
  • 通过 super 关键字调用父类有参构造方法
  • 子类通过 this 去调用本类中的其他构造方法

7、方法的重载与方法的重写

  • 方法的重载:本类中出现方法名相同,参数列表不同的方法,与返回值无关
  • 方法的重写:子类中出现和父类中方法声明一模一样的方法

8、方法重写的注意事项:

  • 父类中私有方法不能被重写。(因为私有方法不能被继承)
  • 子类重写父类方法时,访问权限不能更低
  • 父类静态方法,子类也必须通过静态方法进行重写

猜你喜欢

转载自blog.csdn.net/weixin_43860260/article/details/90763526