用Java进行封装
我试图在一个程序中实现封装,作为一些课程的一部分,但是我遇到了一个错误,我似乎无法用我有限的知识来解决这个问题,这没有得到我的老师/讲师的帮助。我的老师/讲师非常擅长他所做的,但在实际交流信息方面做得并不好,因此,有人可以帮助我修复以下程序中出现的错误,并向我解释为什么它不能按预期工作用Java进行封装,java,oop,encapsulation,Java,Oop,Encapsulation,我试图在一个程序中实现封装,作为一些课程的一部分,但是我遇到了一个错误,我似乎无法用我有限的知识来解决这个问题,这没有得到我的老师/讲师的帮助。我的老师/讲师非常擅长他所做的,但在实际交流信息方面做得并不好,因此,有人可以帮助我修复以下程序中出现的错误,并向我解释为什么它不能按预期工作 class TwoDShapeEncap{ double width, height; //Width void setWidth(double w){ width =
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");
}
}
错误消息:
java:186:错误:类矩形中的方法周长不能应用于给定的类型;System.out.println(“周长为”+r.permiture());^必需:双精度,双精度找到:无参数原因:实际参数列表和正式参数列表长度不同1错误-
当你打电话时:
System.out.println("The perimeter is " + r.perimeter());
在r.Permiture中,您必须传递两个参数(根据您的签名需要)
矩形类中的方法:
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;
}
当你打电话时:
System.out.println("The perimeter is " + r.perimeter());
在r.Permiture中,您必须传递两个参数(根据您的签名需要)
矩形类中的方法:
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
中的方法permiture
需要两个参数,您不需要传递任何参数。你可以这样称呼它:
r.perimeter(7.8,4.2);
double perimeter(){
return getHeight() * 2 + getWidth() * 2;
}
double perimeter(double h, double w){
getHeight();
getWidth();
return getHeight() * 2 + getWidth() * 2;
}
或者重新定义该方法,使其如下所示:
r.perimeter(7.8,4.2);
double perimeter(){
return getHeight() * 2 + getWidth() * 2;
}
double perimeter(double h, double w){
getHeight();
getWidth();
return getHeight() * 2 + getWidth() * 2;
}
类
Rectangle
中的方法permiture
需要两个参数,您不需要传递任何参数。你可以这样称呼它:
r.perimeter(7.8,4.2);
double perimeter(){
return getHeight() * 2 + getWidth() * 2;
}
double perimeter(double h, double w){
getHeight();
getWidth();
return getHeight() * 2 + getWidth() * 2;
}
或者重新定义该方法,使其如下所示:
r.perimeter(7.8,4.2);
double perimeter(){
return getHeight() * 2 + getWidth() * 2;
}
double perimeter(double h, double w){
getHeight();
getWidth();
return getHeight() * 2 + getWidth() * 2;
}
这是因为您是这样定义
周长函数的:
r.perimeter(7.8,4.2);
double perimeter(){
return getHeight() * 2 + getWidth() * 2;
}
double perimeter(double h, double w){
getHeight();
getWidth();
return getHeight() * 2 + getWidth() * 2;
}
并调用System.out.println(“周长为”+r.permiture())代码>不带参数
由于您并不是无缘无故地使用double h
和double w
,因此您只需将它们从方法定义中删除即可
double perimeter(){
return getHeight() * 2 + getWidth() * 2;
}
这是因为您是这样定义周长函数的:
r.perimeter(7.8,4.2);
double perimeter(){
return getHeight() * 2 + getWidth() * 2;
}
double perimeter(double h, double w){
getHeight();
getWidth();
return getHeight() * 2 + getWidth() * 2;
}
并调用System.out.println(“周长为”+r.permiture())代码>不带参数
由于您并不是无缘无故地使用double h
和double w
,因此您只需将它们从方法定义中删除即可
double perimeter(){
return getHeight() * 2 + getWidth() * 2;
}
修改签名以删除参数
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;
}
修改签名以删除参数
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;
}
因为每个人都面临着参数的问题,所以我将面临这个问题:如果你在你的类之外,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();'
}
}
在代码中的几个点上确实存在这个问题
根据您的问题:
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
}
double perimiter(){
返回(高度+宽度)*2;
//或者如果你想给老师留下深刻印象;):
//return(height+width)因为每个人都面临参数的问题,所以我将面临这个问题:如果你在类的“外部”,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();'
}
}
在代码中的几个点上确实存在这个问题
根据您的问题:
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
}
double perimiter(){
返回(高度+宽度)*2;
//或者如果你想给老师留下深刻印象;):
//return(height+width)几乎忘了提到错误消息:Main.java:186:error:classrectangle中的方法periment不能应用于给定的类型;System.out.println(“periment是”+r.periment());^required:double,double found:no arguments原因:实际参数列表和形式参数列表长度不同1 errorDear,发布错误Joe的答案是正确的,但您的IDE肯定会注意到这一点,不是吗?几乎忘了提到错误消息:Main.java:186:error:class Rect中的方法周长角度不能应用于给定的类型:System.out.println(“周长为”+r.Permiture());^required:double,double found:no arguments原因:实际参数列表和正式参数列表长度不同1 errorDear,发布错误Joe的答案是正确的,但您的IDE肯定会注意到这一点,不是吗?perimiter方法中不需要前2行,也不需要不使用直接初始化字段!如果您有一个矩形类,并且您使用setWidth()
和setHeight()
定义了宽度和高度,那么为什么不需要呢?至于getWidth()和getHeight()我删除了它们,因为width和height的值已经存储在width和height类变量中!您的意思是我应该使用this.width
而不是