【Java学习笔记】如何理解java中的“编译看左边,运行看右边”

java中的继承是面向对象程序设计的一大特征,子类继承了父类的所有方法和成员变量,如果不对方法进行重写或对成员变量进行重新赋值,那么子类可以直接调用父类中的方法或变量。同时,在实例化父类的时候,可以使用子类的构造器。

但是,在这种情况下,调用这个父类对象中的方法和变量时,到底是使用父类的呢还是子类的呢?我们首先来创建两个类:

public class Animal{
        static String name = "animal";	
        int num = 1;
	public static void sleep() {
		System.out.println("animal sleep");
	}
    public void run() {
		System.out.println("animal run");
	}
}
public class Cat extends Animal{
        static String name = "cat";	
        int num = 2;
	public static void sleep() {
		System.out.println("cat sleep");
	}
        public void run() {
		System.out.println("cat run");
	}
}

可以看到,Animal类中声明了静态成员变量name、成员变量num、方法run()和静态方法sleep(),同时子类Cat中也重写了这两个两个方法。下面,我们用Cat的构造方法来实例化一个Animal,再实例化一个Cat对象。

public static void main(String args[]) {
		
		Cat cat = new Cat();
		
		Animal animal = new Cat();
		
		System.out.println(cat.num);
		System.out.println(animal.num);
		System.out.println(cat.name);
		System.out.println(animal.name);
		cat.run();
		animal.run();
		cat.sleep();
		animal.sleep();
	}

 

运行后可以看到:

 

 

2

1

cat

animal

cat run

cat run

cat sleep

animal sleep

 

可以看到,在输出两个对象中的各个变量时,Animal对象并没有因为构造函数使用了其子类而输出子类中的成员变量值,但是,在调用成员变量的时候就不一样了,在调用run()方法时,Animal输出和Cat一样的结果,而在调用静态方法sleep()的时候,两个对象又分别输出了其各自的结果。

 

可以这样总结,在调用成员变量以及静态方法时,“编译看左边,运行看左边”,即程序编译时创建了一个Animal类型的对象,并且使用new Cat()对于这个Animal对象赋值,但最终得到的还是一个Animal类的对象,只需要看“=”左边的Animal animal即可。

 

但是要调用非静态方法时,由于Animal类的对象是用Cat()来实例化的,这个非静态方法在运行时会被重写,从而输出子类中方法重写后的结果。这就是“编译看左边,运行看右边”。

 

  • 18
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值