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个回答

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

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

sharplight_l
sharplight_l 正解这是,下面的别杠了,子类可以调用父类protect方法,指的是在子类自己的代码里,你一个子类对象指不定在哪去调的
4 个月之前 回复
SonOfWind0311
SonOfWind0311 回复singsongshare: 是在一个package内吧?
9 个月之前 回复
Sam_bol
singsongshare 我照着Java核心技术卷1,分别写了一个Employee类和它的子类Manager,然后在Employee类中定义了一个protected方法,亲测Manager的对象也可以调用这个保护方法,所以你的说法是错的。
11 个月之前 回复
weixin_42266066
林洋洋 你怎么学的java
一年多之前 回复
qq_43443626
  1 1=∽ 回复yishuihanxun: 该好好重学的学的是你,人家讲的巨对无比
一年多之前 回复
yishuihanxun
yishuihanxun 你怎么学的java
一年多之前 回复

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

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

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

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐