代码解释多态 转型问题:
public class Polymorphic {
public static void main(String [] args){
//多态-----动态绑定(后期绑定)
//程序运行时根据具体参数地址找到内存对象 从而能够正确执行对应的方法。
ShapeController objShapeController = new ShapeController();
Shape objShape = new Circle();
objShapeController.doActive(objShape); // 结果:Circle.draw Circle.move
objShape = new Square();
objShapeController.doActive(objShape); // 结果:Square.draw Square.move
//向上转型:安全的 但可能会丢失子类数据
Shape objShape11 = new Circle();//向上转型
objShape11.draw();//结果:Circle.draw . objShape11引用指向 new Circle()的地址。
//objShape11.ping(); //此方法掉不通。----方法丢失
//向下转型:不安全 必须知道确切的类型 并且执行过程中是程序效率降低(执行类型检查)
Shape objShape22 = new Circle();//向上转型
((Circle)objShape22).ping();//向下转型。 必须知道具体的子类类型 执行强制转换
objShape22 = new Square();
//((Circle)objShape22).ping();//结果:ClassCastException
//((Circle)objShape22).draw();//结果:ClassCastException
}
}
class ShapeController{
void doActive(Shape objShape){
objShape.draw();
objShape.move();
}
}
class Shape{
void draw (){};
void move (){};
}
class Circle extends Shape{
@Override
void draw() {
System.out.println("Circle.draw");
}
@Override
void move() {
System.out.println("Circle.move");
}
void ping(){
System.out.println("Circle.ping");
}
}
class Square extends Shape{
@Override
void draw() {
System.out.println("Square.draw");
}
@Override
void move() {
System.out.println("Square.move");
}
void tt(){
System.out.println("Square.tt");
}
}
分享到:
相关推荐
JAVA多态思维导图,便捷整理思路,多态的好处、多态的语法格式、多态中的两种类型转换:向上转型、向下转型
但向下转型需要确保子类对象确实是该子类的实例。因此,在 `<插入代码>` 处,只有 `p0 = p1;` 和 `p0 = p3;` 是合法的,因为 `p1` 和 `p3` 都是 `ClassB` 类型的对象,可以向上转型为 `ClassA` 类型。因此,正确答案...
若要访问子类中同名的属性,需要将对象强制转换为子类类型,然后通过子类引用进行访问,这被称为向下转型。 在实际编程中,应尽量避免在父子类之间定义同名属性,因为这可能导致混淆和难以维护的代码。如果确实需要...
3. 类型转换:多态还体现在对象的类型转换上,向上转型(父类引用指向子类对象)是自动的,而向下转型(子类引用指向父类对象)需要显式进行,并且需要注意可能抛出`ClassCastException`。 在实际应用中,继承和...
2. **向下转型**:将父类引用强制转换为子类类型,这是不安全的,因为如果父类引用实际上指向的是另一个子类的对象,那么强制转换会导致`ClassCastException`。例如: ```java Animal a = new Dog(); Cat c = ...
而向下转型(Downcasting)需要显式进行,需要注意的是,只有真正的子类对象才能安全地向下转型。 ### 封装 **1. 封装的原理** 封装是面向对象编程的三大特性之一,它保护了类的数据不受外界非法访问。通过封装,...
- 向下转型(如将`Animal`转为`Cat`)需要显式转换,并且需要确保类型安全。 3. **动态绑定** - 在运行时确定调用哪个方法的过程称为动态绑定。 - 对于非静态方法和非final方法,Java会根据对象的实际类型来...
本篇将深入探讨Java多态中的类型转换,包括向上转型(Upcasting)和向下转型(Downcasting),以及相关的注意事项。 1. **向上转型(Upcasting)** 向上转型是指将子类的对象引用赋值给父类的引用。在Java中,这是...
理解多态的关键在于“向上转型”和“向下转型”。向上转型是指将子类对象赋值给父类引用,这是自动进行的,无须额外操作。例如: ```java Animal animal = new Cat(); // 向上转型,猫是动物的一种 animal.speak(); ...
6. **向上转型与向下转型**:多态中的向上转型是指将子类对象赋值给父类引用,允许我们使用父类的所有非私有成员。向下转型则是将父类引用转换为子类引用,以访问子类特有的成员。需要注意的是,不正确的向下转型会...
- **定义**:将父类的引用转换为子类的引用,称为向下转型。 - **示例**: ```java Student s = (Student) p; ``` - **特点**: - 需要显式地使用类型转换操作符。 - 如果父类引用实际指向的是子类对象,则转换...
4. **向上转型(Upcasting)与向下转型(Downcasting)**:向上转型是指将子类对象赋值给父类引用,这是隐式的,编译器允许这么做,因为子类是父类的特例。而向下转型则是将父类引用转换为子类对象,需要显式进行,...
### Java多态经典讲解 #### 一、理解Java多态 多态,作为面向对象编程的三大特性之一,是继抽象和继承之后的关键概念。它允许我们以统一的接口处理不同类型的对象,增强了代码的灵活性和可扩展性。在Java中,多态...
向上转型是多态的基础,而向下转型则是在确保安全的情况下利用多态的进一步扩展。在设计和编写程序时,合理地运用这两种转型方式可以提高代码的可扩展性和可维护性。 **总结** 理解并熟练运用Java中的向上转型和向...
四、向上转型与向下转型 1. 向上转型(Upcasting):将子类对象赋值给父类引用,这是自动完成的,无需显式转换。 2. 向下转型(Downcasting):将父类引用转换为子类对象,需要进行强制类型转换,并且只有在确定对象...
5. **向上转型与向下转型**:在Java中,子类对象可以赋值给父类引用,这被称为向上转型。这种转型在编译时即可完成,因为所有子类都继承自父类。反之,将父类引用转换为子类对象的过程称为向下转型,但需要在运行时...
在Java中,多态主要体现在两个方面:**编译时类型与运行时类型的不同**以及**对象的向上转型和向下转型**。 #### 编译时类型与运行时类型 在Java中,每个引用变量都有两种类型:**编译时类型**和**运行时类型**。...
这是通过`instanceof`关键字和向下转型来实现的。 另外,Java中的方法默认都是虚拟的(相当于C++中的虚函数),这意味着即使方法没有被声明为`abstract`或`final`,在子类中也可以被重写,并在运行时根据对象的实际...
- **类型转换**:在Java中,我们可以进行向上转型(Upcasting)和向下转型(Downcasting)。向上转型是自动的,安全的,例如`Animal a = new Dog();`,而向下转型需要显式进行,如`Dog d = (Dog) a;`,并需要配合`...
本教程将深入探讨Java基础中的面向对象部分,特别是关于向下转型的几个常见问题。 1. **什么是向下转型?** 向下转型(Downcasting)是指将父类类型的引用或对象转换为子类类型的过程。在Java中,当一个父类引用...