Java中的访问控制修饰符总结

作者:冯老师,华清远见教育科技集团讲师。

Java中在类、类的属性以及类的方法前面加修饰符可限定其访问权限,实现其在一定范围内的信息隐藏。共有四种情况:private、 缺省、 protected、public。为了验证这四种情况,对代码的影响,设计了如下的工程。

1.工程结构如下:

2.工程中涉及的Java源文件如下:

1)包com.jicheng下的父类Animal的代码如下:

//------------animal.java---------------
  package com.jicheng;
  public class Animal {
  public String name = "猫";
  public int age = 2;
  public void eat() {
  System.out.println("动物都要吃东西....age=" + age);//1.本类方法
  }
  }

2)包com.jicheng下的Animal的子类Cat的代码如下:

//---------------cat.java---------------
  package com.jicheng;
  public class Cat extends Animal{
  public void show() {
  System.out.println("Cat show() name=" + name );
  System.out.println("Cat show() age=" + age );//3.同包下的子类方法
  }
  }

3)包com.jicheng下的main函数代码如下:

//-----------Demo.java------------
  package com.jicheng;
  public class Demo {
  public static void main(String[] args) {
  Animal animal = new Animal();
  System.out.println("Animal animal " + animal.age);//2.本类对象
  Cat cat = new Cat();
  cat.show();
  System.out.println("Cat cat age=" + cat.age );//4.同包下的子类对象
  }
  }

4)另外一个包com.dog下的Animal的子类Dog的代码如下:

//-----------------dog.java-----------------
  package com.dog;
  import com.jicheng.Animal;
  public class Dog extends Animal{
  public void show() {
  name = "狗";
  System.out.println("com.dog Dog show :name=" + name);
  System.out.println("com.dog age show :age=" + age); //5.不同包下的子类方法
  }
  }

5)另外一个包com.dog下的main函数的代码如下:

//-------------demo.java---------------
  package com.dog;
  public class Demo {
  public static void main(String[] args) {
  Dog dog = new Dog();
  System.out.println("com.dog Dog dog :age=" + dog.age); //6.不同包下的子类对象
  dog.show();
  }
  }

验证过程:重点观察包com.jicheng下Animal类的age方法,改变其权限,观察上面代码中的1~6句编译效果。

结论:

 private被称为类访问修饰符,只有本类内的方法可以访问;
?  default被称为包访问修饰符,同包下子类的方法及同包下子类的对象都可以访问;
?  protected被称为子类访问修饰符,不同包下的子类的方法可以访问,但不同包下的子类的对象不可以访问;
?  public被称为公有访问修饰符,都可以访问。

备注:类中的protected成员,在 类外(比如main函数)声明类对象,可以访问,这点和C++不同;default是表示一种不加任何修饰符时的状态,和C++不同(C++中默认为私有)。