一、四种访问控制权限
Java面向对象中的封装性是通过对成员变量和成员方法进行访问控制所实现的,访问控制分为4个级别,级别从高到低依次为:(公有)public、(保护)protected、(默认)default、(私有)private。
- public:公有型访问权限,访问级别最高,被该级别修饰的成员方法和成员变量可以在任何类中被访问到。
- protected:保护型访问权限,所谓的保护型,其实就是为了保证某个类的子类无论是在同包还是不同包情况下,都能够自继承父类中的protected所修饰的成员变量和成员方法。
- default:默认权限修饰符,一般省略不写。默认级别修饰的成员变量和成员方法,可以在当前类内部和同一个包下的类(即同包下的子类和无关类)都能被访问到。
- private:私有权限修饰符,访问权限最低,被该权限修饰的成员变量和成员方法只能在当前类的内部被访问到,若外部类想要访问或修改它的private修饰的成员变量,那么它必须通过其所提供的setX/getX方法才行。
如下表格:
二、代码实现
包结构图如下:
1、访问权限修饰符----同一个类中:
四种访问权限都能访问到。
package com.zhuenmin.extends03.aaa;
/**
* @author pro_art
* @date 2020/11/10 15:30
* 访问权限修饰符----同一个类中
**/
public class Student {
public String name;
protected String id;
String tel;
private String address;
public void publicMethod(){
System.out.println("当前类中公有方法");
}
protected void protectedMethod(){
System.out.println("当前类中保护型方法");
}
void defaultMethod(){
System.out.println("当前类中默认方法");
}
private void privateMethod(){
System.out.println("当前类中私有方法");
}
public static void main(String[] args) {
/*
* 在当前类中,任何修饰符的成员变量和成员方法都能访问
*/
Student student = new Student();
//成员变量的访问
String address = student.address;
String id = student.id;
String tel = student.tel;
String name = student.name;
//成员方法的访问
student.publicMethod();
student.protectedMethod();
student.defaultMethod();
student.privateMethod();
}
}
2、访问修饰符----同包下的子类
- 在同包子类下创建父类对象,父类对象能访问自己的public、protected、default修饰符的成员变量或方法
- 在同包子类下创建子类对象,子类能继承父类的public、protected、default修饰符的成员变量或方法,无法继承父类的private的成员变量或方法。
- 父类
package com.zhuenmin.extends03.aaa;
/**
* @author pro_art
* @date 2020/11/10 15:30
* 访问修饰符----同包下的父类
**/
public class Fu {
public int id;
protected int age;
String name;
private String sex;
public void publicMethod(){
System.out.println("父类公有方法");
}
protected void protectedMethod(){
System.out.println("父类保护型方法");
}
void defaultMethod(){
System.out.println("父类默认方法");
}
private void privateMethod(){
System.out.println("父类私有方法");
}
}
- 子类
package com.zhuenmin.extends03.aaa;
/**
* @author pro_art
* @date 2020/11/10 15:30
* 访问修饰符------同包下的子类
**/
public class Zi extends Fu{
public static void main(String[] args) {
/*
在同包子类下创建父类对象,父类对象能访问自己的public、protected、default
修饰符的成员变量或方法
*/
Fu fu = new Fu();
//成员变量
int id = fu.id;
int age = fu.age;
String name = fu.name;
String sex = fu.sex; //报错,在这里无法访问父类对象自己的private成员变量
//只能在父类本身java文件中才可以访问
//成员方法
fu.publicMethod();
fu.protectedMethod();
fu.defaultMethod();
fu.privateMethod(); //报错,在这里无法访问父类对象自己的private方法,
//只能在父类本身java文件中才可以访问
/*
在同包子类下创建子类对象,子类能继承父类的public、protected、default
修饰符的成员变量或方法,无法继承父类的private的成员变量或方法。
*/
Zi zi = new Zi();
//成员变量
int id1 = zi.id;
int age1 = zi.age;
String name1 = zi.name;
String sex1 = zi.sex; //报错 在这里子类对象无法继承父类的private成员变量
//成员方法
zi.publicMethod();
zi.protectedMethod();
zi.defaultMethod();
zi.privateMethod(); //报错,子类无法继承父类的的private成员方法
}
}
3、访问修饰符----同包下的无关类
- 在同包无关类下创建父类对象,父类对象能访问自己的public、protected、default修饰符的成员变量或方法。
- 在同包无关类下创建子类对象,子类能继承父类的public、protected、default修饰符的成员变量或方法,无法继承父类的private的成员变量或方法。
package com.zhuenmin.extends03.aaa;
/**
1. @author pro_art
2. @date 2020/11/10 15:30
3. 访问修饰符-----同包下的无关类
**/
public class ABC {
public static void main(String[] args) {
/*
在同包无关类下创建父类对象,父类对象能访问自己的public、protected、default
修饰符的成员变量或方法
*/
Fu fu = new Fu();
int id = fu.id;
int age = fu.age;
String name = fu.name;
String sex = fu.sex; //报错,同包无关类下无法访问父类对象自己的private成员变量
//只能在父类本身java文件中才可以访问
fu.publicMethod();
fu.protectedMethod();
fu.defaultMethod();
fu.privateMethod(); //报错,同包无关类下无法访问父类对象自己的private方法,
//只能在父类本身java文件中才可以访问
/*
在同包无关类下创建子类对象,子类能继承父类的public、protected、default
修饰符的成员变量或方法,无法继承父类的private的成员变量或方法。
*/
Zi zi = new Zi();
int id1 = zi.id;
int age1 = zi.age;
String name1 = zi.name;
String sex1 = zi.sex; //报错 同包无关类下子类对象无法继承父类的private成员变量
zi.publicMethod();
zi.protectedMethod();
zi.defaultMethod();
zi.privateMethod(); //报错,同包无关类下子类无法继承父类的的private成员方法
}
}
4、访问权限修饰符----不同包下子类
- 不同包下子类创建当前子类对象时,该当前子类对象只能继承父类的public、protected修饰符的成员变量和方法,无法继承default、private修饰符的成员变量和方法。
- 不同包下子类创建父类对象时,该当前父类对象只能访问自己的public修饰符的成员变量和方法,无法访问protected、default、private修饰符的成员变量和方法。
package com.zhuenmin.extends03.bbb;
import com.zhuenmin.extends03.aaa.Fu;
/**
1. @author pro_art
2. @date 2020/11/10 15:30
3. 访问权限修饰符----不同包下子类
**/
public class Zi extends Fu{
public static void main(String[] args) {
/*
不同包下子类创建当前子类对象时,该当前子类对象只能继承父类的public、protected修饰符的
成员变量和方法,无法继承default、private修饰符的成员变量和方法。
*/
Zi zi = new Zi();
int id = zi.id;
int age = zi.age;
String name = zi.name; //不同包下子类创建的子类对象,无法访问父类的default修饰符成员变量
String sex = zi.sex; //不同包下子类创建的子类对象,无法方位父类的private修饰符成员变量
zi.publicMethod();
zi.protectedMethod();
zi.defaultMethod(); //报错,不同包下子类创建的子类对象,无法继承父类的的private成员方法
zi.privateMethod(); //报错,不同包下子类创建的子类对象,无法继承父类的的private成员方法
/*
不同包下子类创建父类对象时,该当前父类对象只能访问自己的public修饰符的成员变量和方法,
无法访问protected、default、private修饰符的成员变量和方法。
*/
Fu fu = new Fu();
int id1 = fu.id;
int age1 = fu.age; //报错,不同包下子类创建的父类对象,无法访问自己的protected成员
String name1 = fu.name; //报错,不同包下子类创建的父类对象,无法访问自己的default成员变量
String sex1 = fu.sex; //报错,不同包下子类创建的父类对象,无法访问自己的private成员变量
fu.publicMethod();
fu.protectedMethod(); //报错,不同包下子类创建的父类对象,无法访问自己的protected成员方法
fu.defaultMethod(); //报错,不同包下子类创建的父类对象,无法访问自己的default成员方法
fu.privateMethod(); //报错,不同包下子类创建的父类对象,无法访问自己的private成员方法
}
}
4、访问权限修饰符----不同包下无关类
- 在不同包无关类下创建父类对象,父类对象只能访问自己的public修饰符的成员变量或方法,无法访问protected、default、private修饰符的成员变量和方法。
- 在不同包子类下创建子类对象,子类能继承父类的public、protected、default修饰符的成员变量或方法,无法继承父类的private的成员变量或方法。
package com.zhuenmin.extends03.bbb;
import com.zhuenmin.extends03.aaa.Fu;
/**
* @author pro_art
* @date 2020/11/10 15:30
* 访问权限修饰符----不同包下无关类
**/
public class BCA {
public static void main(String[] args) {
/*
在不同包无关类下创建父类对象,父类对象只能访问自己的public修饰符的成员变量或方法,
无法访问protected、default、private修饰符的成员变量和方法。
*/
Fu fu = new Fu();
int id = fu.id;
int age = fu.age; //报错,不同包下无关类下无法访问父类对象自己的protected成员变量
String name = fu.name; //报错,不同包下无关类下无法访问父类对象自己的default成员变量
String sex = fu.sex; //报错,不同包下无关类下无法访问父类对象自己的private成员变量
fu.publicMethod();
fu.protectedMethod(); //报错,不同包下无关类下无法访问父类对象自己的protected成员方法
fu.defaultMethod(); //报错,不同包下无关类下无法访问父类对象自己的default成员方法
fu.privateMethod(); //报错,不同包下无关类下无法访问父类对象自己的private成员方法
/*
在不同包子类下创建子类对象,子类能继承父类的public、protected、default
修饰符的成员变量或方法,无法继承父类的private的成员变量或方法。
*/
Zi zi = new Zi();
int id1 = zi.id;
int age1 = zi.age; //报错 不同包无关类下子类对象无法继承父类的protected成员变量
String name1 = zi.name; //报错 不同包无关类下子类对象无法继承父类的default成员变量
String sex1 = zi.sex; //报错 不同包无关类下子类对象无法继承父类的private成员变量
zi.publicMethod();
zi.protectedMethod(); //报错,不同包下无关类下无法访问父类对象自己的protected成员方法
zi.defaultMethod(); //报错,不同包下无关类下无法访问父类对象自己的default成员方法
zi.privateMethod(); //报错,不同包下无关类下无法访问父类对象自己的private成员zi
}
}
总结
private修饰符常用于对类内部进行封装,对类内部成员和数据起到一个很好的保护作用。
说明
第一次写博客,当作学习笔记用,希望也能够带给有需要的小伙伴们一点小帮助,有错误之处烦请各位前辈大佬们批评指正,感谢。