java - Java从超类中的子类保存变量
问题描述
我正在尝试基于以下 UML 类图为分配设计一个 Java 程序,但我一直坚持为and类的 create 方法获取一个name
and并将其存储在其父类 ( ) 和接口 ( ) 中。xPosition
House
ApartmentBuilding
Building
Drawable
可绘制:
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;
}
}
我是编程新手,并尽力学习,但不幸的是,我陷入了困境。
解决方案
这个:
private final String name;
private final double xPosition;
public Building(){
this.name = " ";
this.xPosition = 0.0;
}
可能会为您搞砸。因为name
andxPosition
被声明final
,所以给出Building
一个默认构造函数,一个不带参数并且设置name
和xPosition
默认(和无用)值的构造函数,这意味着除非您注意确保子类显式调用另一个超级构造函数,否则需要参数并且将上述字段的值设置为合理的值,上述字段对您来说毫无用处。
我建议您取消上面的默认构造函数,而允许 Building 只有一个构造函数,即需要一个String
和一个double
参数的构造函数:
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
推荐阅读
- javascript - react-native-web 如何配置 webpack
- python - Pandas:基于跨 2 列的条件按组进行行比较
- css - 增加移动 shopify 上的横幅宽度
- r - 使用“tidyverse”在重复测量设计中有效去除“NAs”
- reactjs - 我究竟做错了什么?- Uncaught TypeError: Object(...) is not a function - React GraphQL
- java - 在Android中使用绝对路径获取内部和外部存储中所有文件(每个文件)的列表
- sql - postgresql中的非重复列
- firebase - 仅为 Firebase 中的新用户运行 A/B 实验
- ios - 每次加载视图时是否只能调用一次 layoutIfNeeded - 例如 viewDidLoad?
- javascript - 无法到达 POST RESPONSE json - ReactJS、NodeJS