学习内容:
Java中权限修饰符:protected和default的区别
学习总结:
修饰符 | 本类 | 同一包的类 | 不同包的继承类 | 非继承类 |
---|---|---|---|---|
public | √ \surd √ | √ \surd √ | √ \surd √ | √ \surd √ |
protected | √ \surd √ | √ \surd √ | √ / X \surd/\Chi √/X | X \Chi X |
default | √ \surd √ | √ \surd √ | X \Chi X | X \Chi X |
private | √ \surd √ | X \Chi X | X \Chi X | X \Chi X |
- 当在同一包下,protected和default的作用是一样的(不管是同一包下的类或者是同一包下的继承类都能成功调用),当main方法所在的类和调用的类在同一个包下时,调用类中的方法或者属性,不管是protected或者是default修饰,main方法所在的类都能正常调用。
- protect修饰符比较复杂,如果子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法或属性,而不能访问基类实例的protected方法或属性。
protect\default修饰的属性,在同一包下不同类中可以访问;
package com.company.test1; //同一包下
public class TestOne {
protected String usrName = "ycc";
}
package com.company.test1; //同一包下
public class TestTwo{
public static void main(String[] args) {
TestOne testOne = new TestOne();
System.out.println(testOne.usrName);
}
}
运行结果
- 在不同包下,protected和default的作用是不一样的,当main方法所在的类和调用的类不在同一个包下时,default或者protected修饰的方法或者属性都不能被成功调用,如果main方法所在的类继承了调用类,如果调用类中的方法或者属性使用protected修饰,那么可以成功掉用,如果是用default修饰,那么没有办法被调用; 5. protected比deault的范围更广,多的范围是不同包下的继承类,如果使用protected,那么也能被成功访问。不同包下,使用protected或者default修饰的属性不能被访问;
package com.company.test1; //不同一包下
public class TestOne {
protected String usrName = "ycc";
}
package com.company.test2; //不同一包下
public class TestTwo{
public static void main(String[] args) {
TestOne testOne = new TestOne();
System.out.println(testOne.usrName);
}
}
运行结果
当不同包下,main所在的类继承了调用类,调用类中的属性拥protected修饰,便可以成功访问
package com.company.test1; //不同一包下
public class TestOne {
protected String usrName = "ycc";
}
package com.company.test2; //不同一包下
public class TestTwo extends TestOne{
public static void main(String[] args) {
TestTwo testTwo = new TestTwo();
System.out.println(testTwo.usrName);
}
}
运行结果
当不同包下,main所在的类继承了调用类,调用类中的属性拥protected修饰,如果在继承类中创建父类实例,父类实例无法访问protected属性
//UserDaoImpl中的ans是用protected修饰的,并且User类和UserDaoImpl类在不同包中
public class User extends UserDaoImpl {
public void main(String[] args) {
User user = new User();
UserDaoImpl userDao = new UserDaoImpl();
System.out.println(user.ans);//可以成功访问
System.out.println(userDao.ans);//无法成功访问
}
}