Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将对象从类转换为超类_Java_Class_Inheritance - Fatal编程技术网

Java 如何将对象从类转换为超类

Java 如何将对象从类转换为超类,java,class,inheritance,Java,Class,Inheritance,我必须模拟防波堤,控制某些海岸的许可。我的解决方案实现了一个类“Ship”和类“OilShip”、“FishingShip”和“careship”,我使用了继承和 public class OilShip extends Ship{ ... } public class FishingShip extends Ship{ ... } public class CarriageShip extends Ship{ ... } 在另一类我有船=新船(…);我想用某种方式把一艘油船改造成一艘

我必须模拟防波堤,控制某些海岸的许可。我的解决方案实现了一个类“Ship”和类“OilShip”、“FishingShip”和“careship”,我使用了继承和

public class OilShip extends Ship{
 ...
} 
public class FishingShip extends Ship{
 ...
}
public class CarriageShip extends Ship{
 ...
}
在另一类我有船=新船(…);我想用某种方式把一艘油船改造成一艘船,也就是说

public Class Abcd{
  Ship ship;

  public Abcd(OilShip oship){
  ship=oship; //*************
  }
}

代码似乎有问题,请告诉我。

确保在子类的构造函数中调用超类的构造函数

这个解决方案对我来说很好:

public class Ship {
    private String name;
    private int weight;

    public Ship(String name, int weight) {
        this.name = name;
        this.weight = weight;
    }
}

class OilShip extends Ship {
    private int oilCapacity;

    public OilShip(int oilCapacity, String name, int weight) {
        super(name, weight);
        this.oilCapacity = oilCapacity;
    }
}

class FishingShip extends Ship {
    private int fisherMen;

    public FishingShip(int fisherMen, String name, int weight) {
        super(name, weight);
        this.fisherMen = fisherMen;
    }
}

class CarriageShip extends Ship {
    private int containers;

    public CarriageShip(int containers, String name, int weight) {
        super(name, weight);
        this.containers = containers;
    }
}
如前所述,Java类应该总是有一个名称,其中第一个字符是大写的,每个新词-->CamelCase都是大写的

您不需要不同的构造函数。这里使用继承背后令人敬畏的一点是,无论您在“abcd”中将超类“Ship”中的哪个子类放入构造函数,它都会被接受:

public class Abcd {
    private Ship ship;

    public Abcd(Ship ship){
        this.ship = ship;
    }
}

那很好。您遇到了什么问题?您能解释一下您的问题吗?如果您使用IDE,屏幕上是否出现任何错误或警告?如果您使用命令行编译java类,您是否得到任何编译错误?您添加的代码将使
类中的成员
ship
通过ship class界面指向油船的实例。您声明您有一个ship
ship ship=new ship(…)的实例这个实例永远不会是一个油船,我正在使用Netbeans,当我尝试这样做时,它说“不兼容的类型:油船不能转换为船”,那么油船不会扩展船。或者它在不同的包中扩展了另一个Ship类。请遵守Java命名约定:类的大小写相同。您的课程应命名为
OilShip
FishingShip
careship
。谢谢,CamelCase已经更正。我想要这样的东西:
public Abcd(OilShip oship){this.ship=oship;}
或者类似的东西。这不可能吗?