Object在其子类中,为啥不能调用clone()???
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Object在其子类中,为啥不能调用clone()???相关的知识,希望对你有一定的参考价值。
package test;
public class C extends Object
void test()
Object object = new Object();
object.clone();//The method clone() from the type Object is not visible
因为Java中并不是所有的类都可以被克隆(而且JDK中还描述说不能保证某些类clone的结果x.clone()!=x绝对成立),所以Object类对象无法调用clone()...
还有super不是指Object而是指其父类的引用。
由于clone是object类的一个protected方法,代码中不能直接调用它
子类只能受保护的clone方法克隆他自己,为此必须重新定义clone方法,
并将其设为public,一般情况下,建议实现cloneable标记接口,并通过调用super.clone()方法。 参考技术A protected修饰,只能在该类中或同包类中调用,你这里是在你的C类中!!当然看不见Object类的clone。另外,Object对象好像是不能克隆的,因为Object类的克隆方法只能在Object类或同包类中调用,但你不能在jdk里面乱写 参考技术B 你要用clone()方法,必须将C实现Cloneable标记接口才可以,我觉得你应该这个测试
public class C extends Object implements Cloneable
void test()
C c= new C();
C c2=(Object) c.clone();//The method clone() from the type Object is not visible
参考技术C 因为你的例程不是在java.lang包中,protected类型只能在本包和子类中访问。 参考技术D 可以参考这个问题:
http://stackoverflow.com/questions/1138769/why-is-the-clone-method-protected-in-java-lang-object
为啥不能在 PHP 中从抽象类中调用抽象函数?
【中文标题】为啥不能在 PHP 中从抽象类中调用抽象函数?【英文标题】:Why can't you call abstract functions from abstract classes in PHP?为什么不能在 PHP 中从抽象类中调用抽象函数? 【发布时间】:2011-02-21 00:35:36 【问题描述】:我已经建立了一个抽象父类和一个扩展它的具体类。为什么父类不能调用抽象函数?
//foo.php
<?php
abstract class AbstractFoo
abstract public static function foo();
public static function getFoo()
return self::foo();//line 5
class ConcreteFoo extends AbstractFoo
public static function foo()
return "bar";
echo ConcreteFoo::getFoo();
?>
错误:
致命错误:无法在第 5 行的 foo.php 中调用抽象方法 AbstractFoo::foo()
【问题讨论】:
LOL...静态摘要... :D: 很酷的问题 【参考方案1】:这是一个正确的实现;为了使用late static bindings,您应该使用静态而不是自我:
abstract class AbstractFoo
public static function foo()
throw new RuntimeException("Unimplemented");
public static function getFoo()
return static::foo();
class ConcreteFoo extends AbstractFoo
public static function foo()
return "bar";
echo ConcreteFoo::getFoo();
给出预期的“bar”。
请注意,这并不是真正的多态性。静态键只是解析到调用静态方法的类中。如果你声明一个抽象静态方法,你会收到一个严格的警告。如果子(子)类中不存在,PHP 只会从父(超)类复制所有静态方法。
【讨论】:
生病了...谢谢!自我和静态有什么区别?编辑:显然该关键字不存在(可能是版本)。 是的,这仅适用于 PHP 5.3。 LSB 是使用 PHP 5.3 的主要原因。与在设计模式中使用时实现的任何其他功能相比,它节省了更多的内存。 我遇到了一个 PHP 未能在我的类中实现抽象静态方法的案例(在子类中实现) - 用“static::”解决了它。 我从子类和抽象类中删除了function
旁边的 static
词。 return static::foo();
有正确答案。所以超类可以绑定到抽象函数的子类实现。 PHP 5.6 版。【参考方案2】:
你注意到self
这个词了吗?
那是指向AbstractClass。因此它调用的是 AbstractClass::foo(),而不是 ConcreteClass::foo();
我相信 PHP 5.3 会提供后期静态绑定,但如果你不在那个版本上,self 将不会引用扩展类,而是函数所在的类。
见:http://us.php.net/manual/en/function.get-called-class.php
【讨论】:
在 5.3+ 中使用static
代替 self
的关键字来引用 ConcreteClass
【参考方案3】:
abstract
和static
关键字不能同时用于一个方法。
带有abstract
关键字的方法意味着子类必须实现它。将静态添加到类的方法中可以让我们在不实例化的情况下使用该方法。
这就是错误发生的原因。
【讨论】:
而且,它们仍然可以使用。一个例子是使用 PHPUnit 的静态 setUpBeforeClass() ,其值取决于子类 - 你需要一个抽象(所以子类首先实现它并且也不同)静态(所以你可以从 setUpBeforeClass() 调用它)方法。以上是关于Object在其子类中,为啥不能调用clone()???的主要内容,如果未能解决你的问题,请参考以下文章
201521123040 《Java程序设计》第6周学习总结
为啥 Object.clone() 在 Java 中是原生的?