Java向上转型的结果解析与意义

相信很多初学者学到向上转型时,都是一头雾水,而我当时也有同样的疑问:

Fatherclass obj = new Sonclass();

???这是什么东西?到底是子类对象还是父类对象?

再来看一个例子:

class Quadrangle{ //Quadrangle:四边形
public static void draw(Quadrangle obj){
System.out.println(" 画了一个四边形");
}
}
public class Parallelogram extends Quadrangle{//Parallelogram:平行四边形
public static void main(String[] args){
Parallelogram p = new Parallelogram();
draw(p);
}
}

是可以run,没有异常出现的。
p是一个平行四边形对象,四边形类存在draw()方法,参数类型为四边形类型。而在主方法中调用draw()时传入的参数却是平行四边形类型的。
**平行四边形也是一种四边形,所以可以吧平行四边形对象看做成一个四边形对象。
这就相当于:
Fatherclass obj = new Sonclass();
**
把子类对象赋值给父类类型对象,这种技术被称为:“向上转型”。

那这些对象在调用方法和属性时,会怎么样呢?

class Animal{
	String name = "Animal";
	public Animal() {
		System.out.println("Animal类的构造方法");
	}
	public void eat() {
		System.out.println("父类Animal的eat方法");
	}
}

class Bird extends Animal{
	int age = 5;
   String name = "Bird";
	public Bird() {
		System.out.println("Bird类的构造方法");
	}
	public void eat() {
		System.out.println("子类Bird的eat方法");
	}

    public void fly() {
    	System.out.println("子类Bird的fly方法");
    }
}

定义父类Animal和子类Bird,Animal类有一个成员变量name(“Animal”),构造方法和eat方法。
Bird类有两个成员变量name(“Bird”)&age(5)构造方法和继承重写的eat方法和独有的fly方法。
实现代码:

public class Main {
	public static void main(String[] args) {
		Animal Nancy = new Bird();
		System.out.println(Nancy.name);
		Nancy.eat();
	}
}

run结果:

Animal类的构造方法
Bird类的构造方法
Animal
子类Bird的eat方法


在newNancy这个对象时,子类Bird和父类Animal的构造方法都被执行。
输出Nancy的属性name,结果是父类的成员变量name。
Nancy执行eat方法,结果是子类继承后重写的eat()方法。
可以看出:这样的一个对象,在创建时会把子类和父类的构造方法都执行一遍;若父类和子类有同名不同值的成员变量,则向上转型的对象的该同名属性是父类的;执行重名的方法执行的是子类的。

如果子类独有的方法和变量呢?

class Animal{
	String name = "Animal";
	
	public Animal() {
		System.out.println("Animal类的构造方法");
	}
	public void eat() {
		System.out.println("父类Animal的eat方法");
	}
}

class Bird extends Animal{
	int age = 5;
	String name = "Bird";
	public Bird() {
		System.out.println("Bird类的构造方法");
	}
	public void eat() {
		System.out.println("子类Bird的eat方法");
	}

    public void fly() {
    	System.out.println("子类Bird的fly方法");
    }
}
public class Main {
	public static void main(String[] args) {
      Animal Nancy = new Bird();
        Nancy.fly();
        System.out.println(Nancy.age);
		}
}

程序抛出异常:

Exception in thread "main" java.lang.Error: Unresolved compilation problems: 
	The method show() is undefined for the type Animal
	age cannot be resolved or is not a field

	at Main.main(Main.java:30)

也就是说,向上转型后的对象,无法调用子类独有的方法和属性。
目前为止我们没有发现任何向上转型的好处,反而处处蛋疼。那么他的作用到底在哪呢?
其实Fatherclass obj = new Sonclass();*用不大,重要的是向上转型的思想:
吧子类对象看作是父类对象。

class Animal{
}
class Bird extends Animal{
}
class Dog extends Animal{
}
public class Main {
	public static void eat(Animal obj) {
		System.out.println("eat");
	}
	public static void main(String[] args) {
       eat(new Bird());
       eat(new Dog());
	}
}

参数为Animal obj的eat方法,可以让Bird和Dog对象成为参数。可以少写很多方法,提高代码简洁性。

//新人第一次写文章第一次发表文章!多多支持!谢谢大家!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值