(1).成员变量的继承与隐藏
基于父类创建子类时,子类可以继承父类的成员变量和成员方法。但是,如果在父类和子类中同时声明了一个同名变量,则这两个变量在程序运行时同时存在。也就是说,子类在使用父类的同名变量时,父类的同名变量只是被隐藏了。
代码示例:
class Person {
String name;
int age;
public Person(String name,int age) {
this.name=name;this.age=age;
}
public Person() {
this.name="person name";this.age=23;
}
void pprint() {
System.out.println("class:Person; "+"Name: "+this.name+"; age:"+this.age);
}
}
class Student extends Person{
String name;
int classno;
public Student() {
this.name="student name";this.age=20;
}
public Student(String name,int age,int classno) {
this.name=name;this.age=age;this.classno=classno;
}
void sprint() {
System.out.println("class:Student; "+"Name: "+this.name+"; age"+this.age+"; classno: "+this.classno);
}
}
public class VarInherit{
public static void main(String args[]) {
Student obj1 = new Student();
Student obj2 = new Student("LIXiao",18,1);
obj1.pprint();obj2.pprint();
obj1.sprint();obj2.pprint();
}
}
运行结果:
class:Person; Name: person name; age:20
class:Person; Name: person name; age:18
class:Student; Name: student name; age20; classno: 0
class:Person; Name: person name; age:18
解释说明:
1.由于Student子类中未定义成员变量age,因此该成员变量源自父类,这说明子类可以继承父类的成员变量。
2.name变量同时在父类和子类中进行了声明。当我们通过Student obj1 = new Student();语句创建obj1时,系统会首先调用父类的无参构造方法,然后在调用子类的无参构造方法,所以父类中的name被赋值为person name,子类中的name被赋值为student name,公共成员age先被赋值为23,然后被赋值为20。又子类成员classno没有被显式赋值,则输出系统自动初始化为默认值的0。
(2).方法的继承和覆盖
子类可以继承父类中所以可以被子类访问的成员方法,但是如果子类重新定义了从父类继承的方法,那么父类的这个方法在子类中将不复存在,此时称子类方法覆盖了父类的方法,简称方法覆盖。
代码示例:
class Parentclass {
void pprint() {
this.print();
this.print1(0);
}
void print() {
System.out.println("父类:同类型、同名、同参数成员方法!");
}
void print1(int a){
System.out.println("父类:同类型、同名但参数不同成员方法!");
}
}
class Subclass extends Parentclass{
void sprint() {
this.print();
this.print1();
}
void print() {
System.out.println("子类:同类型、同名、同参数成员方法!");
}
void print1() {
System.out.println("子类:同类型、同名但参数不同成员方法!");
}
}
public class MethodInherit{
public static void main(String args[]) {
Subclass obj=new Subclass();
obj.pprint();
obj.sprint();
}
}
运行结果:
子类:同类型、同名、同参数成员方法!
父类:同类型、同名但参数不同成员方法!
子类:同类型、同名、同参数成员方法!
子类:同类型、同名但参数不同成员方法!
解释说明:
1.所以子类创建对象时,可以直接引用父类中的方法,如:obj.pprint();
2.子类和父类中的两个方法print中方法的类型,名字和参数完全相同所以子类覆盖了父类中的print方法,父类的print方法不复存在。
继承注意事项:
1.子类可以继承父类的成员变量,包括私有的成员变量,但不能直接访问。
2.构造子类对象时会自动调用父类的构造方法来初始化从父类继承的成员变量。
3.java中的类只能单继承,即一个子类只能继承一个父类。