创建另一个子类java的构造函数

创建另一个子类java的构造函数,java,inheritance,constructor,Java,Inheritance,Constructor,如果我有一辆高级轿车: public class Car { int weight; Car(){} public Car(int weight) { this.weight = weight; } } 和另一种继承自汽车的高级轿车: public class Sedan extends Car { public Sedan(int weight) { super(weight); } } pu

如果我有一辆高级轿车:

public class Car {

    int weight;
    Car(){}

    public Car(int weight) {
        this.weight = weight;
    }
}
和另一种继承自汽车的高级轿车:

 public class Sedan extends Car { 

     public Sedan(int weight) {
         super(weight);
     }
 }
public class Jeep extends Car {

    public Jeep(int weight) {
        super(weight);
    }
} 
还有一辆三等吉普车,也是从汽车上继承下来的:

 public class Sedan extends Car { 

     public Sedan(int weight) {
         super(weight);
     }
 }
public class Jeep extends Car {

    public Jeep(int weight) {
        super(weight);
    }
} 
当我说梅赛德斯车=新车(5000)时,我怎样才能做到这一点

建造师根据给定的重量创建一辆
新吉普车
新轿车
如果(重量>3000)
,创建一辆吉普车
梅赛德斯=新吉普车(重量),否则创建一辆轿车
梅赛德斯=新轿车(重量)

您似乎想使用。这意味着您要创建单独的类,该类负责构建并返回相应的
Car
对象

例如:

class CarFactory {
    public Car createCar(int weight) {
         if (weight < 3000) {
              return new Sedan(weight);
         } else {
              return new Jeep(weight);
         }
    }
}
这不仅可以帮助您解决问题,还可以帮助您以更好的方式组织代码。也就是说,免除了从类中创建car的责任,该类将使用类进行操作

注意:我强烈建议您仔细阅读

注2:
Car
似乎需要抽象,因为它是所有派生类型的通用基类,如果直接初始化(
公共抽象类Car{…}
),则没有意义。

您似乎想使用它。这意味着您要创建单独的类,该类负责构建并返回相应的
Car
对象

例如:

class CarFactory {
    public Car createCar(int weight) {
         if (weight < 3000) {
              return new Sedan(weight);
         } else {
              return new Jeep(weight);
         }
    }
}
这不仅可以帮助您解决问题,还可以帮助您以更好的方式组织代码。也就是说,免除了从类中创建car的责任,该类将使用类进行操作

注意:我强烈建议您仔细阅读


注2:
Car
似乎需要抽象,因为它是所有派生类型的通用基类,如果直接初始化(
公共抽象类Car{…}
),则没有意义。

您不能按照自己的意愿执行此操作。你要找的是

添加另一个选项(我不推荐,这是一种糟糕的形式)

您可以将工厂模式合并为委派模式:

public class Car {
    private Car car;
    protected Car() {

    }
    public Car(int weight) {
        if (weight>3000) {
            car=new Jeep(weight);
        } else {
            car=new Sedan(weight);
        }
    }
    public String getType() {
        return car.getType();
    }
}
Car类将构造一辆吉普车或轿车,并将所有调用委托给它

public class Jeep extends Car {
    int weight;

    public Jeep(int weight) {
        super();
        this.weight = weight;
    }
    public String getType() {
        return "JEEP";
    }
}

再说一次,这确实是人为的,不应该这样做。

你不能随心所欲地这样做。你要找的是

添加另一个选项(我不推荐,这是一种糟糕的形式)

您可以将工厂模式合并为委派模式:

public class Car {
    private Car car;
    protected Car() {

    }
    public Car(int weight) {
        if (weight>3000) {
            car=new Jeep(weight);
        } else {
            car=new Sedan(weight);
        }
    }
    public String getType() {
        return car.getType();
    }
}
Car类将构造一辆吉普车或轿车,并将所有调用委托给它

public class Jeep extends Car {
    int weight;

    public Jeep(int weight) {
        super();
        this.weight = weight;
    }
    public String getType() {
        return "JEEP";
    }
}

同样,这是人为的,不应该这样做。

请记住封装

public class Car{

    private int weight ;

    public Car(){

    }

   public Car(int weight){
       this.weight = weight; 
   }

}
如果要实例化一辆汽车,只需执行以下操作:

   Car someCar = new Car(Insert Weight Here);
你可以在任何地方打电话。不过,继承通常不是这样使用的。你可能想再澄清一点。通常你会做以下事情:

Car somecar = new Jeep(4000);


但它们最终都是汽车

请记住封装

public class Car{

    private int weight ;

    public Car(){

    }

   public Car(int weight){
       this.weight = weight; 
   }

}
如果要实例化一辆汽车,只需执行以下操作:

   Car someCar = new Car(Insert Weight Here);
你可以在任何地方打电话。不过,继承通常不是这样使用的。你可能想再澄清一点。通常你会做以下事情:

Car somecar = new Jeep(4000);


但它们最终都是汽车

不在建造商范围内。你需要的是一个工厂。(调用相应构造函数的方法)不在构造函数内。你需要的是一个工厂。(一个调用相应构造函数的方法)我知道工厂模式的事情。我想知道这是否可以直接在汽车制造商中完成。谢谢。@user120404您不能更改实例化对象的类型,如果调用了ctor,则表示该对象已实例化。我知道工厂模式的事情。我想知道这是否可以直接在汽车制造商中完成。谢谢。@user120404您不能更改实例化对象的类型,如果调用了ctor,则表示该对象已实例化。