使用多态时 子类如何调用特有的方法 使用转型(Java)

子类对象调用子类特有的方法(Java多态))

前言

 在使用多态时,可以通过重写父类成员方法实现提升代码效率,然而在实例化对象后,对父类或者子类的成员变量和方法的访问却并不是想象中的那么简单能直接使用,对于此问题我们通过此篇文章进行相关的讨论。


问题引入

 在使用多态时(即一般的向上转型),可以让我们把具有共同特性的多个类更加方便地使用,但是简单的多态使用会导致一个很严重的问题,就是子类对象只能调用子类中重写的父类方法,而不能调用子类特有的方法;并且对于成员变量,向上转型(也就是一般的多态)只能调用父类的成员变量,而不能访问子类的成员变量,这是很让人头疼的,Java多态提供了一种解决办法,就是多态的转型。

转型介绍

转型又分为两类,向上转型和向下转型。

  • 向上转型就是子类创建的对象转型为原本继承的父类对象,后面我们会拿代码进行具体解释;
  • 向下转型就是将向上转型反过来,是将父类对象强制转为子类对象,代码在下面进行具体解释;

代码

父类
类成员描述如下:成员有成员变量name和成员方法eat()方法;

public class Animal {
	public String name = "CSDN";
	public void eat() {
		System.out.println("动物吃饭");
	}
}

子类
类描述如下:继承了父类,成员有成员变量age、重写的eat()方法和自己特有的game()方法;

public class Cat extends Animal{
	public int age = 20;
	@Override
	public void eat() {
		System.out.println("小猫咪吃饭");
	}
	public void game() {
		System.out.println("小猫咪玩游戏");
	}
}

向上转型测试类

public class MainTest{
	public static void main(String args[]){
		Animal a = new Cat();//向上转型
		a.eat();
		//a.game(); 无法调用 注释掉
		System.out.println("名字:"+a1.name);
		//System.out.println(a1.age);  无法使用子类的成员变量 注释掉
	}
}

输出结果

小猫咪吃饭
名字:CSDN

 结论:测试中,通过多态的方式创建对象时其实就是向上转型,测试中调用了父类成员变量name和子类成员变量age,父类eat()方法和子类game()方法,结果显示父类成员变量调用成功,子类成员变量调用失败,父类eat()方法调用成功但无法调用子类中特有的game()方法;

向下转型测试类
类的描述如下:

public class MainTest{
	public static void main(String args[]){
		Animal a = new Cat();
		Cat c = (Cat)a;//向下转型
		c.eat();
		c.game(); //调用成功
		System.out.println("名字:"+c.name);
		System.out.println("年龄:"+c.age); //输出成功
	}
}

输出结果

小猫咪吃饭
小猫咪玩游戏
名字:CSDN
年龄:20

 结论:通过向下转型,我们成功地调用了子类和父类中的所有成员和子类特有的game()方法;

友情提示:可以近似地把转型理解为强转,但兼具了子类和父类的特征


结论

 通过多态转型后我们可以访问到子类的特有方法,并且可以访问到父类和子类的成员,如果向下转型,创建的对象在访问成员变量时,只能访问父类的成员变量与子类重写的父类的成员方法,而向下转型后可以访问到所有的成员变量和方法。

口诀来啦
向上转,变量方法都看父类,方法必须是子类重写的方法
向下转,无限制!

感谢阅读,希望我的文章能对你有所帮助~有什么疑问或者不对的地方欢迎在评论区留言评论。

Java利用多态实现编程可以通过以下步骤: 1. 创建一个父,定义一些通用的方法和属性。 2. 创建多个子类,继承父重写其中的部分方法,定义子类特有方法和属性。 3. 将子类对象转换为父对象,称之为上转型对象。这样做可以使子类对象被父引用。 4. 调用对象的方法,在运行会根据实际对象调用对应的子类方法,实现多态。 以下是一个示例代码: ```java class Animal { void makeSound() { System.out.println("This is animal's sound."); } } class Dog extends Animal { void makeSound() { System.out.println("The dog barks."); } } class Cat extends Animal { void makeSound() { System.out.println("The cat meows."); } } public class Main { public static void main(String[] args) { Animal animal = new Animal(); Dog dog = new Dog(); Cat cat = new Cat(); Animal animal1 = dog; Animal animal2 = cat; animal.makeSound(); // This is animal's sound. dog.makeSound(); // The dog barks. cat.makeSound(); // The cat meows. animal1.makeSound(); // The dog barks. animal2.makeSound(); // The cat meows. } } ``` 在这个示例中,Animal是父,Dog和Cat是子类。Dog和Cat继承了Animal的makeSound()方法,并且重写了该方法。 在main方法中,分别创建了Animal、Dog和Cat的对象。另外,将Dog、Cat分别赋值给了Animal型的变量animal1和animal2,这就是上转型对象。 当调用animal对象的makeSound()方法,会执行Animal中定义的makeSound()方法。而调用dog和cat对象的方法,会执行对应子类重写的makeSound()方法。当调用animal1和animal2对象的makeSound()方法,也会根据实际型去调用对应的子类方法。 通过这种方式,我们可以灵活地使用子类之间的继承和多态特性,实现更加可维护和可扩展的代码。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值