java 访问控制修饰符

参考文档

https://www.runoob.com/java/java-modifier-types.html#protected-desc

访问控制修饰符

Java中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。

  • default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。

  • private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

  • public : 对所有类可见。使用对象:类、接口、变量、方法

  • protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)

我们可以通过以下表来说明访问权限:

访问控制
修饰符当前类同一包内子孙类(同一包)子孙类(不同包)其他包
publicYYYYY
protectedYYYY/N(说明N
defaultYYYNN
privateYNNNN

默认访问修饰符-不使用任何关键字

使用默认访问修饰符声明的变量和方法,对同一个包内的类是可见的。接口里的变量都隐式声明为 public static final,而接口里的方法默认情况下访问权限为 public。

1.类上的访问修饰符为public ,或者不写,不能加其他访问修饰符(除非有些内部类)。

如:public class People {
  private static String name="xiaMing";
}
则项目中的所有类中都可以去访问,如 new People(), People.name, extends People的访问操作;
如果去掉public 则只能在同胞类中进行上述访问。

2.通常设计的类访问修饰符都为public,下面的对类成员访问权限的描述也这样默认。

   访问权限的范围为,从近到远,本类,同包类(包括同包子类),非同包类。

  从上表可以看出,public,protected,default,修饰的成员(包括方法,属性)如果在同一个包里,是可以相互访问的。而privated只在本类中可以访问。

什么叫做属性的可访问?

首先privated 就最容易测试出来,

public class People {
 private int age = 999;
}

通过由于被private修饰,new People().age的方式无法访问。可以通过People另外提供的非private方法获取。

3.protected 测试

下面做两个测试,分别对protectied 的非同包子类,和非同包非子类做测试。

protected 需要从以下两个点来分析说明:

  • 子类与基类在同一包中:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问;

  • 子类与基类不在同一包中:那么在子类中,子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法。

基类

package java_basic.stuInnerClass;//注意基类包名 public class People {
public class People {
    protected String showMessage(){
        return "say good by";
    }
}

 eg1:子类与基类在同一包中,的问题直接归并为protect 的同胞类中。

子类
package java_basic.stuInnerClass;//注意包名与基类是相同的
public class Main extends People {
    public void method() {
     new People().showMessage();
     new Main().showMessage();
    }
}
eg2: 子类与基类不同包,且基类目标方法被protected 访问修饰符修饰。  

 子类
package java_basic.other;//注意包名与基类是不同的
import java_basic.stuInnerClass.People;
public class Main extends People {
    public void method() {
        //new People().showMessage();//报错 不能访问基类实例的protected方法
        new Main().showMessage();//可访问
    }
}

  其实属性的访问,要么就是根据对象,要么就是根据类名点。一般情况这个类指的是被访问的属性(方法)的类,对象指的是被访问属性(方法)的对象。

  再测试一下default,基类成员默认,则非同包类(包括子类非同包类)中是没有访问权限的。

基类
package java_basic.stuInnerClass;//主要包名
public class People {
    static void md(){//默认defalt,//类名点的访问方式
        System.out.println("protected 方法");
    }
}

非同包类

public class Main extends People {
    public void method() {
        People.md();//报错
        Main.md();//报错
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值