向上转型子类的成员变量的调用

本文通过一个简单的Java程序示例介绍了类继承的基本概念,展示了如何使用向上转型来实现多态性,并解释了对象调用属性时所遵循的原则。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package StringDemo1;
class Heihei
{ int x;
	
}
class Xixi extends Heihei
{ int x=7;
	Xixi()
	{
		super();
		System.out.println(x);
	}
public int getx()
{
return this.x;	
}
}
public class TestDemo2 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        Heihei lol=new Xixi();
		System.out.println(lol.x);//输出的是0
	    Xixi vov=(Xixi)lol;
	    System.out.println(vov.x);//输出的是7
	}

}//对象调用属性,输出的为声明类型的属性,而不是实际对象的属性。<pre name="code" class="java"> Heihei lol=new Xixi();  向上转型 lol.x输出的是0,而不是7;


### Java中子类向上转型的用法和原理 #### 一、什么是向上转型? 在Java中,当一个子类对象被赋值给父类类型的变量时,这种操作被称为**向上转型**(Upcasting)。这是由于继承关系的存在,使得子类可以看作是父类的一种特殊形式。因此,任何子类对象都可以通过父类的引用访问。 例如,在以下代码片段中,`Bird` 是 `Animal` 的子类,而 `b` 被声明为 `Animal` 类型却指向了一个 `Bird` 对象[^2]: ```java public class Main { public static void main(String[] args) { Animal b = new Bird(); // 向上转型 b.eat(); } } ``` 这里的关键在于,虽然 `b` 声明为 `Animal` 类型,但它实际上指向的是 `Bird` 实例。这意味着可以通过该引用调用由 `Bird` 定义并覆盖的方法,比如 `eat()` 方法[^3]。 --- #### 二、向上转型的特点 1. **方法调用行为** 当通过父类引用调用某个方法时,如果此方法已被子类重写,则会执行子类中的实现版本;如果没有重写,则默认使用父类的实现[^4]。 ```java class Animal { public void eat() { System.out.println("动物进食..."); } } class Bird extends Animal { @Override public void eat() { System.out.println("鸟儿进食..."); } public void fly() { System.out.println("鸟儿飞翔..."); } } public class Test { public static void main(String[] args) { Animal a = new Bird(); // 向上转型 a.eat(); // 输出: 鸟儿进食... // 下面这行代码无法编译成功,因为 'a' 只知道它是 Animal 类型 // a.fly(); // 编译错误 } } ``` 2. **字段访问特性** 如果存在同名成员变量的情况,无论是否发生向上转型,始终优先访问当前实际对象所属类内的属性值。然而需要注意的是,对于静态成员而言,其解析完全依赖于引用类型而非运行时刻的实际类型[^5]。 --- #### 三、为什么需要向上转型? 主要目的是为了提高程序设计灵活性以及增强代码可维护性和扩展能力。具体表现在以下几个方面: - 提供统一接口:允许不同种类的具体实现共享相同的基类或接口; - 支持多态机制:利用动态绑定技术让相同的操作能够适用于多种数据类型; - 减少重复劳动:避免针对每种派生类别单独编写相似逻辑。 --- #### 四、注意事项 尽管向上转型简化了许多场景下的开发工作量,但也带来了一些局限性需特别留意: - 父类引用仅能识别属于自己的那些成员函数或者属性,即使这些功能可能已经被子类所扩充也无法直接触及新增部分[^2]。 - 若想恢复完整的子类特征则需要用到向下转型技巧,但这一步骤存在一定风险可能会引发异常情况如 ClassCastException[^5]。 --- ### 示例代码展示 下面给出一段综合性的例子来演示如何运用向上转型概念完成基本业务需求处理流程: ```java // 动物抽象层定义通用行为规范 abstract class Animal { abstract void makeSound(); } class Dog extends Animal { @Override void makeSound() { System.out.println("汪汪!"); } void fetchStick(){ System.out.println("去捡木棍回来"); } } class Cat extends Animal { @Override void makeSound() { System.out.println("喵呜~"); } void climbTree(){ System.out.println("爬树技能满级"); } } public class ZooKeeper{ public static void main(String []args){ List<Animal> animals = Arrays.asList(new Dog(),new Cat()); for(Animal creature :animals ){ creature.makeSound();// 多态体现之处 /* * 此处不能简单地尝试像这样调用特定物种独有动作, * ((Dog)creature).fetchStick(); 或者 ((Cat)creature).climbTree(); */ if(creature instanceof Dog){ ((Dog)creature).fetchStick(); }else if(creature instanceof Cat){ ((Cat)creature).climbTree(); } } } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值