[英]Encapsulation with Java
我正在嘗試在程序中實現封裝,這是一些課程的一部分,但是我遇到了一個錯誤,我似乎無法用我有限的知識來解決這個問題,而我的老師/講師沒有幫助他。非常擅長於他所做的事情,但是實際上在交流信息時卻做得不太好,因此有人可以幫助我解決以下程序中顯示的錯誤,並向我解釋為什么它無法按預期工作。
class TwoDShapeEncap{
double width, height;
//Width
void setWidth(double w){
width = w;
}
double getWidth(){
return width;
}
//Height
void setHeight(double h){
height = h;
}
double getHeight(){
return height;
}
}
class Triangle extends TwoDShapeEncap{
String type;
private double sideA, sideB, sideC, adjacent, opposite;
//Side A
void setsideA(double a){
sideA = a;
}
double getsideA(){
return sideA;
}
//Side B
void setsideB(double b){
sideB = b;
}
double getsideB(){
return sideB;
}
//Side C
void setsideC(double c){
sideC = c;
}
double getsideC(){
return sideC;
}
//Adjacent
void setadjacent(double a){
adjacent = a;
}
double getadjacent(){
return adjacent;
}
//Opposite
void setopposite(double o){
width = o;
}
double getopposite(){
return opposite;
}
double getPerimeter(){
if(getsideB() == 0.0 && getsideC() == 0.0){
type = "equilateral";
return getsideA() * 3;
}
else if (getsideC() == 0.0){
type = "isosceles";
return getsideA() + getsideB() * 2;
}
else{
type = "scalene";
return getsideA() + getsideB() + getsideC();
}
}
//*******************************************************************************************
//* Paste the perimeter() and hypotenuse() methods from your previous class into this class *
//*******************************************************************************************
//***************************************
//* add an area method()into this class *
//***************************************
double area(double a, double b){
getWidth();
getHeight();
return (getWidth() * getHeight()/2);
}
}
class Rectangle extends TwoDShapeEncap{
boolean issquare;
private double height, width;
//Height
void setHeight(double h){
height = h;
}
double getHeight(){
return height;
}
//Width
void setWidth(double w){
width = w;
}
double getWidth(){
return width;
}
double perimeter(double h, double w){
getHeight();
getWidth();
return getHeight() * 2 + getWidth() * 2;
}
double area(double a, double b){
//getWidth();
//getHeight();
return (getWidth() * getHeight()/2);
}
boolean testSquare(double h, double w){
//getHeight();
//getWidth();
if (getHeight() == getWidth())
issquare = true;
else issquare = false;
return issquare;
}
//*********************************************
//* add area and perimeter methods this class *
//*********************************************
//*************************************************************************
//* add a testSquare method to test if a particular rectangle is a square *
//*************************************************************************
}
//Add a circle class which includes area and circumference methods
class Circle extends TwoDShapeEncap{
double radius, diameter;
double area (double r){
radius = r;
return Math.PI * (radius * radius);
}
double perimeter (double r){
radius = r;
return 2 * (Math.PI * radius);
}
}
class TwoDShapeEncapDemoNew {
public static void main(String args[]) {
//Triangle
Triangle t = new Triangle();
t.setsideA(5.7);
System.out.println("The perimeter is " + t.getPerimeter());
System.out.println("If sideA is " + t.getsideA() );
System.out.println("The type is " + t.type);
System.out.println();
t.setsideB(7.3);
System.out.println("The perimeter is " + t.getPerimeter());
System.out.println("If sideA is " + t.getsideA() );
System.out.println("If sideB is " + t.getsideB() );
System.out.println("The type is " + t.type);
System.out.println();
t.setsideC(2.7);
System.out.println("The perimeter is " + t.getPerimeter());
System.out.println("If sideA is " + t.getsideA());
System.out.println("If sideB is " + t.getsideB());
System.out.println("If sideC is " + t.getsideC());
System.out.println("The type is " + t.type);
System.out.println();
//Rectangle
Rectangle r = new Rectangle();
r.setHeight(7.8);
r.setWidth(4.2);
System.out.println("The perimeter is " + r.perimeter());
System.out.println("The");
}
}
錯誤信息:
Main.java:186:錯誤:類Rectangle中的方法范圍不能應用於給定類型; System.out.println(“周長為” + r.perimeter()); ^必填:double,double found:無參數原因:實際參數和形式參數列表的長度不同1錯誤–
你打電話時:
System.out.println("The perimeter is " + r.perimeter());
在r.perimeter中,您必須傳遞兩個參數(如您的簽名所希望)
您在Rectangle類中的方法:
double perimeter(double h, double w){
getHeight();
getWidth();
return getHeight() * 2 + getWidth() * 2;
}
因此修復:
System.out.println("The perimeter is " + r.perimeter(r.getHeight(), r.getWidth()));
您還可以固定不帶參數的方法范圍,因為在主體中使用getHeigth()和getWidth()屬性
所以你可以這樣寫:
double perimeter(){
return getHeight() * 2 + getWidth() * 2;
}
Rectangle
類中的方法perimeter
需要兩個參數,並且您不會傳遞任何參數。 您可以這樣稱呼它:
r.perimeter(7.8,4.2);
或重新定義方法,使其看起來像這樣:
double perimeter(){
return getHeight() * 2 + getWidth() * 2;
}
那是因為您正在定義perimeter
功能,如下所示:
double perimeter(double h, double w){
getHeight();
getWidth();
return getHeight() * 2 + getWidth() * 2;
}
並調用System.out.println("The perimeter is " + r.perimeter());
沒有參數。
由於您並沒有真正使用double h
和double w
,因此只需將它們從方法定義中刪除
double perimeter(){
return getHeight() * 2 + getWidth() * 2;
}
由於每個人都只是面對參數問題,所以我將面對這個問題:如果您不在類的外面,則使用Getter獲取私有字段的值! 如果您使用的是類中的方法,則不必使用getter,您可以自己使用變量:
例:
public class SomeClass {
private int a;
public void setA(int anotherA) {
a = anotherA;
}
public int getA() {
return a;
}
public int getSquareOfA() {
// You don't use getA() to get the value now
// but you use a itself!
return a*a; // instead of 'return getA() * getA();'
}
}
您的代碼中確實有幾個問題!
根據您的問題:
您的問題是您要調用的方法具有2個參數,而沒有任何輸入參數!
您可以刪除方法的參數(在您的情況下,這樣做在邏輯上是正確的), 或者您可以傳遞一些參數。
在您的特定情況下,請按以下方式更改您的perimiter()
方法:
double perimiter() {
return (height + width) * 2;
// or if you want to impress your teacher ;) :
// return (height + width) << 1
}
另外,您應該將該方法getPerimiter()
更改為getPerimiter()
以符合您自己的命名約定!
修改您的簽名以刪除參數。
class Rectangle extends TwoDShapeEncap{
///...
double perimeter(double h, double w){
getHeight();
getWidth();
return getHeight() * 2 + getWidth() * 2;
}
應該
class Rectangle extends TwoDShapeEncap{
///...
double perimeter(){
//Notice that you don't need to pass in these arguments
//as this function gets these arguments by itself.
return getHeight() * 2 + getWidth() * 2;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.