Java拾贝第三天——面向对象2

Java拾贝不建议作为0基础学习,都是本人想到什么写什么

继承性

面向对象三大特性:封装性,继承性,多态性

继承的作用是避免出现大幅度的相同代码,提高代码的复用性。

//现有一个Person类,拥有name,age属性
class Person {
    private String name;
    private int age;
  //构造方法和setter,getter

现在有一个Student类,它和Person类的属性大幅度相同,仅多出一个grade属性

class Student {
    private String name;
    private int age;
    private int grade
  //构造方法和setter,getter

难道像上面一样又写一遍?如果不止Student类,Teacher类更多的...类呢?

为了提高代码复用性且解决上述问题,继承(extends)出现了!

继承格式如下:
class 子类 extends 父类{}

子类也叫拓展类,父类也叫超类,基类

相应的,子类会继承父类所有非私有的属性和方法

public class test3 {
    public static void main(String[] args) {
        Student s = new Student("小红", 20, 99);//报错,因为父类的属性private
    }

}
class Person {
    private String name;
    private int age;
  //构造方法和setter,getter
}
class Student extends Person {
//拥有父类的name和age属性吗?
    private int grade;

  public Student(String name, int age, int grade) {
       this.grade = grade;
    }
  //setter,getter
}

为了让子类可以访问父类属性,我们需要把属性或方法定义为protected

public class test3 {
    public static void main(String[] args) {
        Student s = new Student("小红", 20, 99);
    }

}
class Person {
    protected String name;
    protected int age;

  public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
  //setter,getter
}
class Student extends Person {
//拥有父类的name和age属性
    protected int grade;

  public Student(String name, int age, int grade) {
       this.grade = grade;
    }
  //setter,getter
}

运行上述代码,会出现无法调用Person的构造方法的错误。

这是因为在Java中,任何类的构造方法都会默认隐式的调用其父类的无参构造方法。

//所以Student类的构造方法实际上是这样
  public Student(String name, int age, int grade) {
       super();
       this.grade = grade;
    }

super关键字

但Person类定义了有参构造方法,无参构造方法被覆盖掉了,所以编译无法通过。

解决方法是使用super调用父类的有参构造方法。

public class test3 {
    public static void main(String[] args) {
        Student s = new Student("小红", 20, 99);
    }

}
class Person {
    protected String name;
    protected int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    //setter,getter
}
class Student extends Person {
    //拥有父类的name和age属性
    protected int grade;

    public Student(String name, int age, int grade) {
        super(name, age);//调用父类有参
        this.grade = grade;
    }
    //setter,getter
}

子类实例化过程

构造方法那里说到,任何类的实例化都会调用一次构造方法。

那么继承了父类的子类的实例化过程是怎么样的呢?

public class test3 {
    public static void main(String[] args) {
        Student s = new Student("小红", 20);
        System.out.println(s.getAge);
    }

}
class Person {
    protected String name;
    protected int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("父类构造方法");
    }
    //setter,getter
}
class Student extends Person {
    //拥有父类的非私有属性
    public Student(String name, int age) {
        super(name, age);
        System.out.println("子类构造方法");
    }
    //拥有父类的非私有方法
}
/*
父类构造方法
子类构造方法
20
*/

可以看到实例化子类时会优先实例化(也叫初始化)其父类。

Object
任何类都继承Object类,Java中不允许多继承

class Student extends Person1,Person2{}//这是错误的

但允许多层继承

class Person1{}

class Person2 extends Person1{}

class Student extends Person2{}

上述继承树关系如下:
image

posted @ 2023-10-16 16:26  rowbed  阅读(2)  评论(0编辑  收藏  举报