【问题标题】:Java saving variable from subclass in superclassJava从超类中的子类保存变量
【发布时间】:2021-10-04 16:57:19
【问题描述】:

我正在尝试基于以下 UML 类图为分配设计一个 Java 程序,但我一直坚持为 HouseApartmentBuilding 类的 create 方法获取 namexPosition 和将其存储在其父类(Building)和接口(@98​​7654328@)中。

可绘制
import javafx.scene.canvas.GraphicsContext;



 interface Drawable {

   void draw(GraphicsContext canvas);

   public double getXPosition();
   
}
建筑
import javafx.scene.canvas.GraphicsContext;

public class Building implements Drawable {


    private final String name;

    private final double xPosition;

        public Building(){

            this.name = " ";
            this.xPosition = 0.0;

    }

    public Building(String name, double xPosition){

            this.name = name;
            this.xPosition = xPosition;
    }




    public String getName(){
        return name;
    }


    public void draw(GraphicsContext canvas) {

    }


    public double getXPosition() {
        return xPosition;
    }
    @Override
    public String toString(){
            return "Type... Building:  " + "name= " + name + ", xPosition= " + xPosition + "\n";}
    }
房子
import javafx.scene.canvas.GraphicsContext;

import java.util.Scanner;

public class House extends Building implements Dwelling  {

    int bedrooms;
    int occupants;

    House(int bedrooms, int occupants){
        this.bedrooms = bedrooms;
        this.occupants = occupants;
    }
    public static House create() {
        Scanner scan = new Scanner(System.in);
        House a;


        System.out.println("Enter name of the House: ");
        String name = scan.nextLine();
        System.out.println("Enter XPosition of the House: ");
        int xPosition = scan.nextInt();
        System.out.println("Enter number of bedrooms: ");
        int bedrooms = scan.nextInt();
        System.out.println("Enter number of occupants: ");
        int occupants = scan.nextInt();

        a = new House(bedrooms, occupants);


        return a;

    }
    public void draw(GraphicsContext canvas){


    }



    @Override
    public String toString(){
        return "House: " + "bedrooms= " + bedrooms + " occupants= " + occupants + "\n" + super.toString();
    }


    @Override
    public int getNumberOfOccupants() {
        return occupants;
    }
}
公寓楼
import javafx.scene.canvas.GraphicsContext;

import java.util.Scanner;

public class ApartmentBuilding extends HighRise implements Dwelling{

    int occupantsPerFloor;
    int numberOfFloors;

    ApartmentBuilding(int numberOfFloors, int occupantsPerFloor){
        this.occupantsPerFloor = occupantsPerFloor;
        this.numberOfFloors = numberOfFloors;

    }

    public static ApartmentBuilding create() {
        Scanner scan = new Scanner(System.in);
        ApartmentBuilding a;


        System.out.println("Enter name of the Apartment Building: ");
        String name = scan.nextLine();
        System.out.println("Enter XPosition of the Apartment Building: ");
        int xPosition = scan.nextInt();
        System.out.println("Enter number of floors: ");
        int numberOfFloors = scan.nextInt();
        System.out.println("Enter number of occupants per floor: ");
        int occupantsPerFloor = scan.nextInt();

        a = new ApartmentBuilding(numberOfFloors, occupantsPerFloor);


        return a;
    }


    public void draw(GraphicsContext canvas){

    }
    @Override
    public String toString(){

        return "Apartment Building: " + "occupantsPerFloor= " + occupantsPerFloor + "\n" + super.toString() + "\n";
    }

    @Override
    public int getNumberOfOccupants() {
        return 0;
    }
}

我是编程新手,正在努力学习,但不幸的是,我陷入了困境。

【问题讨论】:

  • House 的构造函数可以采用 create 然后在构造函数调用 super(name, xPosition) 中读取的所有四个参数(包括名称和 XPOsition)

标签: java interface polymorphism abstract-class super


【解决方案1】:

这个:

private final String name;
private final double xPosition;

public Building(){
    this.name = " ";
    this.xPosition = 0.0;
}

可能会让你搞砸了。由于namexPosition 被声明为final,因此给Building 一个默认构造函数,它不接受任何参数并将namexPosition 设置为默认(和无用)值,这意味着除非你采取注意确保子类显式调用另一个超级构造函数,即需要参数并将上述字段的值设置为合理值的超级构造函数,上述字段将证明对您毫无用处。

我建议您取消上面的默认构造函数,而允许 Building 只有一个构造函数,即需要 Stringdouble 参数的构造函数:

public Building(String name, double xPosition){
    this.name = name;
    this.xPosition = xPosition;
}

然后确保子类在它们自己的构造函数中调用这个超级构造函数,并传入适当的值。

例如,

public class House extends Building implements Dwelling  {
    private int bedrooms;
    private int occupants;

    House(String name, double xPosition, int bedrooms, int occupants) {
        super(name, xPosition);
        this.bedrooms = bedrooms;
        this.occupants = occupants;
    }
    

这样您可以强制House 实例填充适当的超类字段,这些值可用于House 实例,并在.getName().getXPosition()House 实例调用时适当地返回。

【讨论】:

    猜你喜欢
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多