java类(实现接口)和接口位于同一文件中,并从不同包中的主类访问该类
我正在YouTube上浏览一些设计模式视频,但是我对一些基本Java概念有点怀疑。我试图寻找解决办法,但找不到。下面是我的问题
我有一些动物课。java,狗。java,一个接口。java在同一文件中还有一个名为CantFly的类。检查动物的主要方法。JAVA下面是代码
动物。java
package com.classification.pojo;
public class Animal {
public Fly flyingType;
public String tryToFly() {
return flyingType.fly();
}
public void setFlyingAbility(Fly newFlyType) {
flyingType = newFlyType;
}
}
狗。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!");
}
}
飞行。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";
}
}
检查动物。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());
}
}
在检查动物。java,用于doggy对象正确调用setFlyingAbility()方法,Animal。爪哇,狗。java和Fly。java需要在同一个包中。如果我继续飞。java在不同的包中,我无法访问CantFly()构造函数。我希望我已经把我的观点讲清楚了
- 伊山
# 1 楼答案
这是因为类的默认修饰符是包私有的,这意味着只有同一个包中的类才能看到它
您可以简单地将
CantFly
变成一个在自己的Java文件中定义的公共类CantFly
没有嵌套在Fly
接口中,因此需要使用new CantFly()
而不是new Fly.CantFly()
调用其构造函数# 2 楼答案
没错。您可以将
CantFly
类公开,以便在其包之外访问它,但请注意,这样做需要将其放入自己的文件中即:使用以下内容创建
CantFly.java
而且,它不应该是
new Fly.CantFly()
(因为您还没有在Fly
接口中定义CantFly
)。应该是new CantFly()
如果你真的想把
Fly
和CantFly
放在同一个文件中,你可以让CantFly
成为一个内部类:然后用
new Fly.CantFly()
实例化它。如果你对此很满意,我建议你考虑使用EnUM:# 3 楼答案
您已声明
CantFly
,但没有任何访问修饰符:。。。这意味着它只能在同一个包中访问。只要把它公之于众,你就可以在其他软件包中使用它。有关更多信息,请参见Java tutorial on access modifiers。对于
ItFlys
类也是如此此外,您还没有在
CheckAnimal.java
文件中导入正确的包。你应该导入com.designpattern.strategy.ItFlys
。您根本不需要在CheckAnimal.java
中导入Fly
,因为您永远不会在该文件中直接引用该接口# 4 楼答案
首先
Fly
是一个不能实例化的接口,您正在CheckAnimal
类中进行实例化试试这个:-
而且
CantFly
不是一个方法,而是一个类