JavaSE—8.继承_权限控制_方法重写

类的继承与权限控制

  • Java中使用extends关键字实现类的继承机制
  • 通过继承,子类自动拥有了基类的所有成员(成员变量和方法)
  • Java只支持单继承,不允许多继承
    • 一个子类只能有一个基类,一个基类可以派生出多个子类

内存分析

class Person {
	private String name;
	private int age;
	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;
	}
}

class Student extends Person {
	private String school;
	public String getSchool() {
		return school;
	}
	public void setSchool(String school) {
		this.school = school;
	}
}

public class test {
	public static void main(String[] args) {
		Student student = new Student();
		student.setName("john");
	}
}

在这里插入图片描述

访问控制

  • Java权限修饰符public、protected、private置于类的成员定义前,用来限定其他对象对该类对象成员的访问权限。

    修饰符 类内部 同一个包 子类 任何地方
    private Yes
    default Yes Yes
    protected Yes Yes Yes
    public Yes Yes Yes Yes
  • 对于class的权限修饰只可以用public和default。

    • public类可以在任意地方被访问。
    • default类只可以被同一个包内部的类访问。
  • 没有任何修饰符的变量,默认的是default权限(包权限)

方法的重写

  • 在子类中可以根据需要对从基类中继承来的方法进行重写。
  • 重写方法必须和被重写方法具有相同方法名称、参数列表和返回类型。
  • 重写方法不能使用比被重写方法更严格的访问权限。

super关键字

  • 在Java类中使用super来引用基类的成分
class FatherClass {
    public void value;
    public void f() {
        value = 100;
        System.out.println("FatherClass.value=" + value);
    }
}

class ChildClass extends FatherClass {
    public int value;
    public void f() {
        super.f();
        value = 200;
        System.out.println("ChildClass.value=" + value);
        System.out.println(value);
        System.out.println(super.value);
    }
}

public class TestInherit {
    public static void main(String args[]) {
        ChildClass cc = new ChildClass();
        cc.f();
    }
}

​ 执行ChildClass cc = new ChildClass();时,栈内存为cc分配一块区域,堆内存为new ChildClass分配一块内存区域,而ChildClass类继承自FatherClass类,所以ChildClass类中应该有FatherClass类中的所有成员(value),此时value的值为0,ChildClass类也有一个成员变量value,此时的值为0。当new一个对象的时候,this引用指向自身,如果是子类对象,则还有一个super引用指向父类。

​ 执行cc.f();时,进入ChildClass类的f方法,先调用父类的f方法,父类的f方法把100赋父类的value然后输出,子类的f方法将200赋子类的value。

在这里插入图片描述

继承中的构造方法

  • 子类的构造的过程中必须调用其基类的构造方法。
  • 子类可以在自己的构造方法中使用super(argument_list)调用基类的构造方法。
    • 使用this(argument_list)调用类的另外的构造方法。
    • 如果调用super,必须写在子类的构造方法的第一行。
  • 如果子类的构造方法中没有显示地调用基类构造方法,则系统默认调用基类无参构造方法。
  • 如果子类构造方法中既没有显示调用基类构造方法,而基类中又没有无参构造方法,则编译出错。

猜你喜欢

转载自blog.csdn.net/qq_32661327/article/details/83218635