类(实现接口)和接口在同一个文件中,并从不同包中的主类访问类

时间:2014-09-17 14:16:39

标签: java

我正在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()构造函数。我希望我已明确指出。

- 依禅

4 个答案:

答案 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()


如果您真的想将FlyCantFly保留在同一个文件中,可以让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 modifiersItFlys类也是如此。

此外,您尚未在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不是一个类的方法。