类的继承与权限控制
- 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,必须写在子类的构造方法的第一行。
- 使用
- 如果子类的构造方法中没有显示地调用基类构造方法,则系统默认调用基类无参构造方法。
- 如果子类构造方法中既没有显示调用基类构造方法,而基类中又没有无参构造方法,则编译出错。