有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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()构造函数。我希望我已经把我的观点讲清楚了

- 伊山


共 (4) 个答案

  1. # 1 楼答案

    这是因为类的默认修饰符是包私有的,这意味着只有同一个包中的类才能看到它

    您可以简单地将CantFly变成一个在自己的Java文件中定义的公共类

    CantFly没有嵌套在Fly接口中,因此需要使用new CantFly()而不是new Fly.CantFly()调用其构造函数

  2. # 2 楼答案

    没错。您可以将CantFly公开,以便在其包之外访问它,但请注意,这样做需要将其放入自己的文件中

    即:使用以下内容创建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()(因为您还没有在Fly接口中定义CantFly)。应该是new CantFly()


    如果你真的想把FlyCantFly放在同一个文件中,你可以让CantFly成为一个内部类:

    interface Fly {
        ...
    
        class CantFly {
            ...
        }
    }
    

    然后用new Fly.CantFly()实例化它。如果你对此很满意,我建议你考虑使用EnUM:

    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();
    }
    
  3. # 3 楼答案

    您已声明CantFly,但没有任何访问修饰符:

    class CantFly
    

    。。。这意味着它只能在同一个包中访问。只要把它公之于众,你就可以在其他软件包中使用它。有关更多信息,请参见Java tutorial on access modifiers。对于ItFlys类也是如此

    此外,您还没有在CheckAnimal.java文件中导入正确的包。你应该导入com.designpattern.strategy.ItFlys。您根本不需要在CheckAnimal.java中导入Fly,因为您永远不会在该文件中直接引用该接口

  4. # 4 楼答案

    首先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不是一个方法,而是一个类