我正在YouTube上浏览一些设计模式视频,但我对一些基本的Java概念有一点疑问。我试图寻找解决方案,但无法找到解决方案。以下是我的询问。
我有一些类 Animal.java , Dog.java ,一个接口 Fly.java ,它也有一个名为CantFly的类文件。一个主要方法CheckAnimal.java。以下是代码
Animal.java
package com.classification.pojo;
public class Animal {
public Fly flyingType;
public String tryToFly() {
return flyingType.fly();
}
public void setFlyingAbility(Fly newFlyType) {
flyingType = newFlyType;
}
}
Dog.java
package com.classification.pojo;
public class Dog extends Animal {
public Dog() {
super();
flyingType = new CantFly();
}
public void digHole() {
System.out.println("I am digging hole!");
}
}
Fly.java
package com.designpattern.strategy;
public interface Fly {
String fly();
}
class CantFly implements Fly {
public String fly() {
return "Can't fly";
}
}
class ItFlys implements Fly {
public String fly() {
return "I can fly";
}
}
CheckAnimal.java
package com.designpattern.main;
import com.classification.pojo.Animal;
import com.classification.pojo.Dog;
import com.classification.pojo.Fly;
public class CheckAnimals {
public static void main(String[] args) {
Animal doggy = new Dog();
System.out.println(doggy.tryToFly());
doggy.setFlyingAbility(new ItFlys());
System.out.println(doggy.tryToFly());
}
}
在 CheckAnimal.java 中,对于doggy对象正确调用 setFlyingAbility()方法,Animal.java,Dog.java和Fly.java需要在同一个包中。如果我将Fly.java保存在不同的包中,我就无法访问 CantFly()构造函数。我希望我已明确指出。
- 依禅
答案 0 :(得分:1)
那是对的。您可以让CantFly
类 public 在其软件包之外访问它,但请注意,这样做需要您将其放在自己的文件中。
即:使用以下内容创建CantFly.java
:
package whatever.package.you.want;
import com.designpattern.strategy.Fly;
class CantFly implements Fly {
public String fly() {
return "Can't fly";
}
}
此外,它不应该是new Fly.CantFly()
(因为您还没有在 CantFly
接口内定义Fly
。它应该只是new CantFly()
。
如果您真的想将Fly
和CantFly
保留在同一个文件中,可以让CantFly
成为内部类:
interface Fly {
...
class CantFly {
...
}
}
然后使用new Fly.CantFly()
对其进行实例化。如果您对此不满意,我建议您考虑使用枚举:
enum FlyCapability {
CANT_FLY {
@Override
public String fly() {
return "Can't fly";
}
},
CAN_FLY {
@Override
public String fly() {
return "Can fly";
}
};
public abstract String fly();
}
答案 1 :(得分:1)
您已声明CantFly
没有任何访问修饰符:
class CantFly
...这意味着它只能在同一个包中访问。只需将其公开,然后您就可以在其他包中使用它。有关详细信息,请参阅Java tutorial on access modifiers。 ItFlys
类也是如此。
此外,您尚未在CheckAnimal.java
文件中导入正确的包。您应该导入com.designpattern.strategy.ItFlys
。您无需在Fly
中导入CheckAnimal.java
,因为您从未在该文件中直接引用该接口。
答案 2 :(得分:0)
这是因为类的默认修饰符是package-private,这意味着它只能由同一个包中的类可见。
您可以简单地将CantFly
定义为在其自己的Java文件中定义的公共类。
CantFly
未嵌套在Fly
界面中,因此您需要使用new CantFly()
而不是new Fly.CantFly()
来调用其构造函数。
答案 3 :(得分:0)
首先,Fly
是一个无法实例化的接口,您正在CheckAnimal
类中进行实例化。
试试这个: -
package com.designpattern.main;
import com.classification.pojo.Animal;
import com.classification.pojo.Dog;
import com.classification.pojo.Fly;
public class CheckAnimals {
public static void main(String[] args) {
Animal doggy = new Dog();
doggy.setFlyingAbility(new CantFly());
}
}
和CantFly
不是一个类的方法。