Java 中对象类型之间的类型转换(前提是两个类是父子关系)
1.向上转型:把子类对象直接赋给父类引用,自动进行类型转换。
静态方法/成员变量(包括静态变量和实例变量)同“父类引用”所声明的类型的方法/变量绑定,例如,animal.staticEat()、animal.name 和 animal.staticName 都是与 Animal 类进行绑定。
使用向上转型不能调用子类中特有方法和变量
使用向上转型调用的是子类覆盖或继承父类的方法
2.向下转型:将一个指向子类对象的父类引用赋给一个子类的引用,必须进行强制类型转换(父类拥有的成员子类肯定也有,而子类拥有的成员,父类不一定有)。
向下转型必须转换为父类引用指向的真实子类类型,不是任意的强制转换,否则会出现 ClassCastException
向下转型时可以结合使用 instanceof 运算符进行判断
向下转型调用的是子类的方法和变量、可以调用继承于父类的方法和变量
当我们使用经典多态写法 Father f=new Son()时,如果子类和父类存在同名的成员变量和静态变量时,是什么情况呢?
class Animal{
static String name = "animal";
int num = 1;
public void run() {
System.out.println("animal run");
}
public static void sleep() {
System.out.println("animal sleep");
}
}
class Cat extends Animal{
static String name = "cat";
int num = 2;
public void run() {
System.out.println("cat run");
}
public static void sleep() {
System.out.println("cat sleep");
}
}
public abstract class test4 {
public static void main(String args[]) {
Cat cat = new Cat();
System.out.println(cat.num);
System.out.println(cat.name);
cat.run();
cat.sleep();
System.out.println("=================");
Animal animal = new Cat();
System.out.println(animal.num);
System.out.println(animal.name);
animal.run();
animal.sleep();
}
}
输出结果如下所示
二、解释 对于多态中的静态变量、静态方法、成员变量来讲,编译看左,运行也看左。无论右边是当前类还是当前类的子类,编译和运行期间执行的都是当前类中的方法。 对于多态中的非静态方法,编译看左,运行看右。也就是在编译期间看左边的类中有无该方法/属性,而实际在运行时执行的是右边类的方法/属性。如果编译期间没有在左边的类找到该非静态域,则会报编译错误。
上述问题的解释:
static name: 此为静态变量,运行都看左边,所以cat输出cat,animal输出animal num: 成员变量,运行看左边,所以cat输出2,animal输出1 run(): 非静态方法,看右边,cat和animal都使用Cat类的方法,即输出cat run static sleep(): 静态方法,看左边,故cat输出cat sleep,animal输出animal sleep
标签:System,子类,转型,cat,sleep,animal,println,向下,向上 From: https://www.cnblogs.com/GO8k/p/17092511.html