修饰符 | 类内部 | 同一个包 | 子类 | 任何地方 |
private | yes | |||
package | yes | yes | ||
protected | yes | yes | yes | |
public | yes | yes | yes | yes |
权限修饰符主要用来修饰成员变量、方法和类;而类只能用public和package(默认什么修饰词都不写)这两种权限来限定访问。说得通俗些,权限修饰符就是用于指定成员变量、方法和类的访问权限的。java
一、修饰成员变量和方法:spa
注:pak1包下有Person和Student两个类;pak2包下有Student类code
package pak1; public class Person { private int i = 0; int j = 0; protected int k = 0; public int m = 0; public void pub() { System.out.println(i); System.out.println(j); System.out.println(k); System.out.println(m); } private void pri() { System.out.println("private"); } protected void pro() { System.out.println("protected"); } void def() { System.out.println("default"); } }
package pak1; public class Student { public void m() { Person p = new Person(); System.out.println(p.i); //报错,i为private System.out.println(p.j); System.out.println(p.k); System.out.println(p.m); p.pri(); //报错,pri()为private p.def(); p.pro(); p.pub(); } }
package pak2; import pak1.Person; public class Student { //这里Student类并未继承Person类 public void m() { Person p = new Person(); System.out.println(p.i); //报错 i为private System.out.println(p.j); //报错 j为package System.out.println(p.k); //报错 k为protected,Student非同包,非子类 System.out.println(p.m); p.pri(); //报错 pri()为private p.def(); //报错 def()为package p.pro(); //报错 pro()为protected,Student非同包,非子类 p.pub(); } }
package pak2; import pak1.Person; public class Student extends Person { //这里Student继承了Person父类 public void m() { Person p = new Person(); Student s = new Student(); System.out.println(p.i); //报错 System.out.println(p.j); //报错 System.out.println(p.k); //报错:在子类中经过父类对象引用不能访问父类中用protected修饰的k System.out.println(p.m); System.out.println(s.i); //报错 System.out.println(s.j); //报错 System.out.println(s.k); //注意:在子类中经过子类对象引用则能访问父类中用protected修饰的k System.out.println(s.m); System.out.println(i); //报错 System.out.println(j); //报错 System.out.println(k); //注意:在子类中能直接访问父类中用protected修饰的k System.out.println(m); p.pri(); //报错 p.def(); //报错 p.pro(); //报错:在子类中经过父类对象引用不能访问父类中用protected修饰的pro() p.pub(); s.pri(); //报错 s.def(); //报错 s.pro(); //注意:在子类中经过子类对象引用则能访问父类中用protected修饰的pro() s.pub(); pri(); //报错 def(); //报错 pro(); //注意:在子类中能直接访问父类中用protected修饰的pro() pub(); } }
固然,权限修饰符也能够用来修饰某类的构造方法,效果等同普通方法。对象
二、修饰类(public或package修饰外部类,可用全部权限修饰内部类):继承
使用包权限修饰的外部类不能被导入(import)。ci
注:pak1包下有Animal和Cat两个类;pak2包下有Cat类table
package pak1; class Animal { //用包权限修饰Animal类 public void speak() { System.out.println("wangwangwang~miaomiao"); } }
package pak1; public class Cat { public void m() { Animal a = new Animal(); a.speak(); } }
package pak2; import pak1.Animal; //报错,用包权限修饰的Animal类不能被导入 import pak1.*; public class Cat { Animal a = new Animal(); //报错,因为用包权限修饰的Animal类不能被导入,因此不能建立此类对象 }