protected修饰符和clone方法
😊protected 引出问题
protected:翻译为受保护的。
- 子类在同一包的情况下是可以访问的,问题就是在不同包下的子孙类。当我们某些成员只想让子类访问,那肯定会选择
protected
修饰符。
问题:
1. 不同包的子类在类内部可以访问基类(父类)的protected
修饰的成员吗?
-
- 不同包的子类在类内部可以访问基类(父类)的
protected
修饰的成员吗?
- 不同包的子类在类内部可以访问基类(父类)的
-
可以的,子类继承了父类的成员,自然是可以使用的。调用 super 也是可以的。
package ly.pat.test;
import ly.pat.AParent;
public class AParent {
public String name = "xxx";
public String getName(){
return name;
}
}
public class Son1 extends AParent{
public void xx(){
System.out.println(super.getName());
System.out.println(getName());
}
public static void main(String[] args) {
new Son1().xx();// 编译正常
}
}
2. 不同包的子类实例化后可以访问基类的protected
修饰的成员吗(基类的实例化,子类的实例化异或是子类的向上转型)?
-
- 不同包的子类实例化后可以访问基类的
protected
修饰的成员吗(基类的实例化,子类的实例化异或是子类的向上转型)?
- 不同包的子类实例化后可以访问基类的
- 不可以的,
protected
修饰了的成员受保护,不同包的实例化对象是不可以访问它的。
package com.protectedaccess.parentpackage.sonpackage1;
import com.protectedaccess.parentpackage.Parent;
public class Son1 extends Parent{
public static void main(String[] args) {
Parent parent1 = new Parent();
// parent1.getMessage(); 错误
Parent parent2 = new Son1();
// parent2.getMessage(); 错误
}
}
3. 不同包的子类在内部创建父类对象是否可以访问(不是利用super)?
-
- 不同包的子类在内部创建父类对象是否可以访问(不是利用super)?
- 不可以的,同样是实例化了。
😊protected 修饰符总结
- 不同包下的子类使用基类的 protected 成员不可以通过实例化去调用,可以通过 super 和 在子类内部继承使用。
- 不同包不是子类不可以,同一包和当前类肯定是可以的。
😊Object 类中的 clone 方法
该clone
方法是被protected
修饰符修饰的。所以一般使用该方法去clone,都会报错的,虽然Object是所有类的‘爸’,但是实例化是访问不了 clone 的。
解决方法:
实现 Cloneable 接口
,重写 clone 方法
可以使用。重写的clone方法中也是使用 super 或者直接使用的 clone 。实现Cloneable接口是打开可以重写的通道。
如果不实现Cloneable接口,那么会报错。
😊数组使用 clone 方法
使用 clone ,其可分为两种,浅克隆和深克隆。
- 一维数组:深克隆;(重新分配空间,并将元素复制过去)
- 二维数组:浅克隆。(只传递引用)