Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何更改一个类的超链接?_Java_Inheritance - Fatal编程技术网

Java 如何更改一个类的超链接?

Java 如何更改一个类的超链接?,java,inheritance,Java,Inheritance,我将在一个代码示例中解释我的问题。我有一个名为getNewBaby()(我无法更改)的静态方法,它只返回一个Animal类。我需要想办法把那个动物变成狗。以下是我迄今为止的两次失败尝试: public static class Animal { public void eat(){} } public static class Dog extends Animal { public Dog(Animal animal) { super = animal;

我将在一个代码示例中解释我的问题。我有一个名为
getNewBaby()
(我无法更改)的静态方法,它只返回一个
Animal
类。我需要想办法把那个动物变成狗。以下是我迄今为止的两次失败尝试:

public static class Animal
{
    public void eat(){}
}

public static class Dog extends Animal
{
    public Dog(Animal animal)
    {
        super = animal; // <-- error 1
    }
    public void bark(){}
}

公共静态类动物
{
公共无效eat(){}
}
公共静态类狗扩展动物
{
公犬(动物)
{

super=animal;//您尝试执行的操作是不可能的:您无法重新初始化super

但是,也有其他选择(假设您无法修改
getNewBaby
):

  • try
    /
    catch
    语句中包含您的下一步,然后捕获
    ClassCastException
  • 使用
    instanceof
    检查实际类型,是否为
    动物
    等,并以此为逻辑基础
  • 最佳选择
    Animal
    中声明可在所有子类上重写的方法,从而实现解耦
编辑

这里有几个额外的主题-有点离题/泛泛,但可能对您的设计有所帮助

  • Java与铸造
  • Java中的
  • 爪哇

我可以告诉你为什么有些事情是错误的,但是如果没有更多关于你要去哪里的信息,我们无法帮助你重新组织代码

错误的构造函数模式 以下是继承方面的错误:

public Dog(Animal animal) {
    //...
}
不需要创建
动物
,因为它是一种
动物
,这在这里很有意义。 这样的构造更符合,但在这里不合适,您需要删除
Dog
类上的
extensedanimal

super的矫揉造作
以下内容在Java中是不可能的,因为
super
只是将
对象作为超类中的对象引用的一种方式。您也不能影响
,因为您当前是此对象

super = animal; // <-- error 1

super=animal;//假设我正确理解了您的需求,您可以执行以下操作。不要尝试将
animal
对象分配给
super
,而是将
animal
对象中的值分配给Dog的super类中的相应变量

public static class Animal
{
    public Animal() {}
    public int parameter1 =0;

    public Animal(int param1){
        this.parameter1 = param1;
    }

    public void eat(){}
}

public static class Dog extends Animal
{
    public Dog(Animal animal) //This is not nice
    {
        super.parameter1 = animal.parameter1;
    }
    public void bark(){}
}


对于您刚刚发布的作为评论的新信息(确实需要强调),这里可能是一个适合您的解决方案

此解决方案使用组合而不是继承。这意味着您的自定义类不会扩展原始类,而是包含其实例,并在内部使用它

我曾经劝阻你不要使用构图,因为动物狗的例子在概念上是错误的,但这里有一个不同的用例,所以答案不同;-)

然后,当您收到
套接字
对象时:

Socket socket = someServerSocket.accept();
EasySocket easySocket = new EasySocket(socket);
// use easySocket

public static class Animal
public static class Dog extends Animal
这些是内部类吗?你想做什么?如果你不控制
getNewBaby()
,你怎么能这么肯定它是一只
?@最重要的是不,我有错误
动物不能被扔给狗
,等等。@Joffrey它不是狗,但我想把它变成一只,如何转换它除非动物和其他类是静态的内部类,为什么你在这些类声明上使用
静态的
?如果不是,你是作为第一步,应该从
公共静态类
和所有其他类声明中删除
静态
。@Omoro如果所有这些类都在同一个文件中声明(我想是Main),它们最好是静态的。当然,对于更大规模的程序,OP需要将它们分开,并删除
static
。OPs类都是公共静态的,我想他/她也需要更改签名:)。@TheLostMind变化不大。这只意味着它们绑定到它们声明到的任何类。@TheLostMi这并不意味着它们是最终的,我并没有说静态使它们成为最终的。@TheLostMind,你好像说最后的解决方案是不可能的,如果这不是你的意思,我的错;-)谢谢你用我能理解的非常简单的词解释它!你的意思是,在Java中创建一个dog,具有动物类的精确副本?(精确,如,相同引用等)如果您在某处编写
new dog()
,那么您将有一个
dog
对象,它也是一个
animal
对象(您将能够从它的两个类中调用方法)但是你不能从新动物(…)
创建的
动物中获得
对象。是的,但是,我想让狗包裹现有的动物。不可能?没有可能的办法?一切都是可能的,你所说的听起来像构图(见我答案中的链接)但是构图更适合于有-有关系。你认为狗有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有关系吗?有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-有-w、 谢谢。我认为OP希望新的
狗有相同的参考,但这是无法实现的。尽管,您的“复制”解决方案动物是解决OP问题的一个很好的方法,我认为这里有一个更大的设计问题,如果不更好地了解OP的目标,我们就无法改进它。好主意。遗憾的是,它对我不起作用,因为我需要它来包装一个更复杂的套接字类和更多的依赖项。动物/狗示例帮助我说明iss我正面临着更好的解释哈!这正是我最终所做的!唯一的缺点是
public static Animal getNewBaby()
{
    return new Animal( 4 /*Some integer value for parameter1*/ );
}

public static void main()
{
    Dog puppy2 = new Dog(getNewBaby());
}
public class EasySocket {

    private Socket socket;

    public EasySocket(Socket socket) {
        this.socket = socket;
    }

    /* 
     * Here are your helper methods that use socket's methods: for instance, use 
     * socket.getInputStream() instead of simply getInputStream(), since you don't inherit
     * from the Socket class anymore. 
     */
}
Socket socket = someServerSocket.accept();
EasySocket easySocket = new EasySocket(socket);
// use easySocket