有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java会删除多态性中的额外变量吗?

public abstract class car{
   protected String carA,carB,carC;
}

public class car_A{
   car_A(){
       carA = "carA";
   }
}

public class car_B{
   car_B(){
       carB = "carB";
   }
}

public class car_C{
   car_C(){
       carC = "carC";
   }
}

public class test{
   public static void main(String args[]){
      Car[] a = new Car[3];
      Car[0] = new carA();//Will carB & carC be delete?
      Car[1] = new carB();//Will carA & carC be delete?
      Car[2] = new carC();//Will carA & carB be delete?
   }
}

垃圾回收会删除对象中的另一个字符串吗

额外的问题:在允许我使用多态性的子类中是否可能有唯一的变量声明


共 (2) 个答案

  1. # 1 楼答案

    Will garbage collection delete the other String in the object?

    我想你是说。。。有什么东西可以消除这些变量吗

    答案是否定的。所有三个变量都存在于所有三个子类中

    询问是否有东西会删除字符串是没有意义的。您所指的字符串对象不存在:它们永远不会被创建。示例子类中未初始化的字段将包含null而不是String对象。此外,只有当GC(如果启用了“转义分析”,则编译器)推断出对象变得不可访问时,对象才会被删除


    Extra question: Are there any way for me to have unique variable declare in a subclass and it also accept me to use polymorphism?

    如果您公开了这些变量,则不会

    如果将它们设置为私有,并使用getter和setter提供访问权限,那么有一种黑客方法可以做到这一点:

    public abstract class X {
       public abstract String getA();
       public abstract String getB();
    }
    
    public class Y extends X {
       private String a;
    
       public String getA() { 
          return a; 
       }
    
       public String getB() { 
          throw new UnsupportedOperationException("no b"); 
       }
    
       // or ...
       public String getB() { 
          return null;
       }
    }
    

    但是,不建议这样做,因为这些黑客行为违反了可替代性原则

  2. # 2 楼答案

    • 当存在继承时,我们讨论多态性,因此您应该像public class CarA extends Car{那样更改代码以进行继承

    • Car类和CarA类之间存在继承时,子类CarA将继承超类CarString carA,carB,carC)的所有属性,当你在CarA构造函数中初始化这样的carA = "carA";时,结果是(carA将有"carA"carB将有nullcarC将有null

    那么,您问题的另一个答案是java会删除多态性中的额外变量吗不是