public class test {
public static void main(String[] args) {
/*****①*****/
AClass classVar = new BClass();
//classVar.printVal(); 不能调用子类的新增方法
//classVar.b = 4; 不能调用子类的新增成员
classVar.print(); //调用的是子类重写的函数 ***
System.out.println("a=" + classVar.a); //调用父类中的a ***
/*****②*****/
((BClass) classVar).printVal();
((BClass) classVar).print();
System.out.println("a=" + ((BClass) classVar).a); //子类中的a
/*****③*****/
AClass var = new AClass();
var.print(); //调用AClass的方法
}
}
class AClass {
int a = 1;
void print() {
System.out.println("AClass");
}
}
class BClass extends AClass{
int a = 2;
int b = 3;
void print() {
System.out.println("BClass");
}
void printVal() {
System.out.println("a=" + a);
}
}
①中父类声明的变量保存的是子类变量的引用。牢记,当其调用被子类重写的方法时,其调用的是子类的方法;当其调用与子类同名的成员时,其调用的仍是父类中的成员。
另一种抽象类的情况如下,相对上面来讲容易理解一些。
public class test {
public static void main(String[] args) {
/*****①*****/
AClass classVar = new BClass();
//classVar.printVal(); 不能调用子类的新增方法
//classVar.b = 4; 不能调用子类的新增成员
classVar.print(); //调用的是子类实现的函数
System.out.println("a=" + classVar.a); //调用父类中的a
/*****②*****/
((BClass) classVar).printVal();
((BClass) classVar).print();
System.out.println("a=" + ((BClass) classVar).a); //子类中的a
}
}
abstract class AClass {
int a = 1;
abstract void print();
}
class BClass extends AClass{
int a = 2;
int b = 3;
void print() {
System.out.println("BClass");
}
void printVal() {
System.out.println("a=" + a);
}
}