Java基础:第三十五讲 访问权限

本文详细介绍了Java中的访问权限概念,包括类及成员的访问控制符种类及其适用范围,并通过实例展示了不同访问控制符如何影响代码的可访问性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

    访问权限指的是是否运行访问类以及类的成员,通过访问控制符来实现,包括类的访问控制符和成员的访问控制符。

1、类的访问控制符

     类的访问控制符包括public和缺省的。

public访问控制符:

public class Person{

...

}

缺省的访问控制符:

class Person(){

...

}

    public修饰的类可以在任何地方访问,而缺省的访问控制符只运行同一个包中使用。看下面的代码:

----------------源文件:A.java-------------------------

package ch11;

public class A{

   ...

}

----------------源文件:B.java-------------------------

package ch11;

class B{

   ...

}

----------------源文件:Test.java-------------------------

package ch11;

public class Test{

    public static void main(String[] args){

         A a = new A();  // 正确,public运行访问

         B b = new B();  // 正确,同一个包允许访问

   }

}

----------------源文件:ch12包下的Test.java-------------------------

package ch12;

import ch11.A;

import ch11.B;  //  错误,不同包不能访问

public class Test{

    public static void main(String[] args){

         A a = new A();  // 正确

         B b = new B();  // 错误,不同包不能访问

   }

}

    通常类的访问控制符都写成public,如果你希望对他的访问进行限制,可以使用缺省的访问控制符。

2、访问类型划分

    在我们讨论访问权限的时候,我们会说允许外部类访问,允许子类访问,允许同包中的类访问等等,这些访问是什么意思呢?这既是访问类型,只有理解了这些访问类型,才能理解访问权限。

     首先我们要清楚访问发生在什么地方,访问实际上是对某个对象(有时候会是类)的成员的访问,这些访问的代码肯定是在某个方法中。访问类型实际上是要访问的代码与被访问的代码所在位置的关系。下面对这些访问类型进行分析。

     下面的例子展示了4中访问类型:

package ch11;

public class A{

    public String id;

    public String getId(){

       return id; // 在类内部访问成员变量id,实际上是类自己的方法

    }

}

package ch11;

public class B{

    public String getInf(A a){

       return a.id;  // 同包中的类B中的方法访问类A的成员

    }

}

package ch11;

public class C extends A{

      public String getId(){

         return id;  // 子类直接调用父类的方法或者属性

      }
}

package ch12;

public class D{

    public String getInf(A a){

       return a.id;  // 不同包中的类D中的方法访问类A的成员

    }

}

3、成员的访问控制符

     成员的访问控制符有4种:public 缺省的 protected 和private。

    如果访问控制符是public,则上卖弄的4种情况都可以。

    如果访问控制符是缺省的,则第一种情况可以,同包的情况也可以。

    如果访问控制符是protected,第一种情况可以,子类的情况也可以。

    如果访问控制符是private,则只有第一种情况可以。

    下面的表格是显示了具体的访问是否允许的情况:

 

 类自身子类同包不同包非子类
publicOKOKOKOK
缺省的OK同包OKOK 
protectedOKOKOK 
privateOK   

 下面的例子展示了各种情况:

package ch11;
 
public class A {
    public int i_public;
    protected int i_protected;
    int i_default;
    private int i_private;
   
    // 类自己的方法 , 可以访问所有类型的成员变量
    public void f(){
       i_public = 10;
       i_protected = 20;
       i_default = 30;
       i_private = 40;
    }
}
 
package ch11;
 
public class B_same_package {
    // 同包不能访问 private
    public void f(A a){
       a.i_public = 10;
       a.i_default = 20;
       a.i_protected = 30;
    }
}
 
package ch11;
 
public class Child_same_package extends A{
    // 同包子类不可以访问 private 成员
    public void f(){
       i_public = 10;
       i_protected = 20;
       i_default = 30;
    }
}
 
package ch12;
import ch11.A;
public class B_different_package {
    // 不同包只能访问 public
    public void f(A a){
       a.i_public = 10;
    }
}
 
package ch12;
import ch11.A;;
public class Child_different_package extends A{
    // 不同包子类可以访问 public protected 成员
    public void f(){
       i_public = 10;
       i_protected = 20;
    }
}

下一次介绍成员变量的继承。

上一次:第三十四讲 包 
李绪成 优快云 Blog: http://blog.youkuaiyun.com/javaeeteacher
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值