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{}
上述继承树关系如下: