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