昏黄烛火轻摇晃
2017-07-15 14:46
采纳率: 61.5%
浏览 3.1k
已采纳

JAVA 所有类都是Object的子类 ,那么子类的对象为什么不能直接调用Clone()方法

虽然是Clone()在Object里面是protected权限,即使Person类是和Object不同包,但是protected定义的不同包的子类也可以继承父类的方法啊?
class Person implements Cloneable
{
private String name ;
private int age ;
public Person(String name,int age){
this.name = name ;
this.age = age ;
}
public String toString(){
return "姓名:"+this.name+",年龄:"+this.age ;
}
public Object clone() throws CloneNotSupportedException{
return super.clone() ;
}
}
public class TestDemo
{
public static void main(String args[]) throws Exception
{
Person p1 = new Person("张三",30) ;
Person p2 = (Person)p1.clone() ;
p2.name = "李四" ;
System.out.println(p1) ;
System.out.println(p2) ;
}
}

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • blownewbee 2017-07-16 02:14
    已采纳

    Clone必须交给实现这个类的程序员去实现。否则从逻辑上说,别人很难写出真正的Clone方法。看这个代码
    class A
    {
    public A a;
    public A()
    {
    a = this;
    }
    }
    这样的代码如果自动克隆,就会无限递归。

    点赞 评论
  • SonOfWind0311 2017-07-17 02:07

    问题简化一下就是: A是B的子类,B有一个protected的方法C, A的对象是否能够直接调用C方法,跟Object,clone没有什么关系:
    protected方法在子类中可用,指的是子类的代码中可以用,不是子类的对象。

    点赞 3 评论
  • lzl_Avery 2017-07-16 16:40

    首先指出你的说法有问题 你说protected定义的,class Person implements Cloneable 而你这个是默认的并不是protected定义的 protected是protected
    默认是默认 两者有区别 其次不用说了 你已经做了实现Cloneable接口

    点赞 评论
  • Jack_windows 2017-07-16 01:10

    只能说语法就是这么规定的,必须重写clone函数并且需要实现Cloneable接口才行。
    顺便提一下,你的p2.name属性是无法访问到的。

    点赞 评论
  • cloudyzhao 2017-07-17 01:15

    jdk文档描述:
    类内部 package内 子类 其他
    protected 允许 允许 允许 不允许
    default 允许 允许 不允许 不允许
    default就是没有显示的指明方法或者成员变量的具体声明
    可以看出protected描述的方法或者成员变量 子类是完全可以使用的 即使是不在一个包内
    谢谢

    点赞 评论

相关推荐 更多相似问题