Java的访问控制符

在Java里面又三种访问控制权限,分别是public  protected  privated意思分时是共有的,受保护的,以及私有的。这三种权限,下面我们来看看这三种权限的比较和区别.

首先来看看public该权限的限制是最广的,基本是最大的权限,任何人都可以访问。Protected是受保护的,介于共有和私有之间

Privated是私有的。只有本类可以访问和使用,其他的类是不容许使用的.下面来看看代码.

package ooJect;

/**
 * @author hackbase   Java的访问权限控制.首先我们来得出结论.
 * java的访问控制权限,一致困扰着我很多年,今天来深入的理解下访问控制权限的问题
 * java的访问控制权限又三个分别是public  protected,private还有一个默认的default
 * 一共四个访问控制权限。
 * privated---->default----protected----->public   访问权限依次从小到大.
 * 图中4个访问控制级别中的default并没有对应访问控制符,当不使用任何访问控制符来修饰类或类成员时,
 * 系统默认使用该访问控制级别。这4个访问控制级别的详细介绍如下。
 * <p>
 * 1.•private(当前类访问权限):如果类里的一个成员(包括成员变量、方法和构造器等)
 * 使用private访问控制符来修饰,则这个成员只能在当前类的内部被访问。
 * 很显然,这个访问控制符用于修饰成员变量最合适,使用它来修饰成员变量就可以把成员变量隐藏在该类的内部
 * <p>
 * 2.•default(包(package)访问权限):
 * 如果类里的一个成员(包括成员变量、方法和构造器等)
 * 或者一个外部类不使用任何访问控制修饰,就称它为包访问权限的,
 * default访问控制的成员或外部类可以被相同包下的其他类访问。
 * <p>
 * 3.•protected(子类访问权限):
 * 如果一个成员(包括成员变量、方法和构造器等)
 * 使用protected访问控制符修饰,那么这个成员既可以被同一个包中的其他类访问,
 * 也可以被不同包中的子类访问。在通常情况下,
 * 如果使用protected来修饰一个方法,通常是希望其子类来重写这个方法
 * 4.
 * •public(公共访问权限):这是一个最宽松的访问控制级别,
 * 如果一个成员(包括成员变量、方法和构造器等)或者一个外部类使用public访问控制符修饰,
 * 那么这个成员或外部类就可以被所有类访问,
 * 不管访问类和被访问类是否处于同一个包中,是否具有父子继承关系。
 * <p>
 * <p>
 * 来看看Java的访问权限控制说明
 * 1.public 在自己包自己类,自己包别的类,别的包,别的类同时又继承关系,别的包别的类没有继承关系都可以都可以访问
 * 用public修饰的成员属性,成员方法,以及构造方法.
 * 2.Protected自己包,自己累,自己包,别的类,别的包,别的类,但是iyou继承关系可以继承,但是不能访问成员变量或者成员方法
 * 3.default自己包自己类,自己包,别的类都可以访问,其他的都不能访问
 * 4.privated自己包自己类可以访问,别的一概不得访问。
 */
public class ProtectedProteryTest {
    public static void main(String[] args) {
        Father t1 = new Father("jack", 12, 25);
        System.out.println("输入人的信息为:");
        System.out.println("输入的年龄为:" + t1.age);
        System.out.println("输入的id数值为" + t1.id);
        System.out.println("输入的名字为:" + t1.name);

    }

    static class Father {
        private String name;
        private int age;
        private int id;

        private Father(String name, int age, int id) {
            this.id = id;
            this.age = age;
            this.name = name;

        }
    }
}
/**
 * 访问的对象在同一个类里面,直接访问就可以了。
 * class A {
 * int a = 10;
 * <p>
 * void printA() {
 * System.out.println(a);
 * }
 * }
 * printA()要访问a,因为它们在同一个类,所以可以通过a直接访问。
 * 访问对象在不同类(假设访问对象在类B),
 * 此时可以通过声明、初始化B的一个对象,通过[对象名.成员变量/方法的名字]进行访问。
 * <p>
 * ps:这种情况仅限于成员方法访问成员变量/方法
 * class A {
 * void printB() {
 * B ob = new B();
 * System.out.println(ob.b);
 * }
 * }
 * <p>
 * class B {
 * int b = 10;
 * }
 * A中的printB()要访问B中的b,因为它们不在同一个类,
 * 所以可以在printB()中声明、初始化B的一个对象ob,通过ob.b进行访问。
 * <p>
 * 此外,当访问对象为静态变量/方法时,
 * 可以通过[访问对象所在类的类名.成员变量/方法的名字]进行访问。
 * <p>
 * class A {
 * static int a = 10;
 * <p>
 * int doubleA = A.a * 2;
 * <p>
 * void printB() {
 * System.out.println(B.b);
 * }
 * }
 * <p>
 * class B {
 * static int b = 10;
 * }
 * <p>
 * doubleA要访问a,由于a为静态变量,因此可以通过A.a进行访问。
 * <p>
 * A中的printB()要访问B中的b,由于b为静态变量,因此可以通过B.b进行访问。
 * <p>
 * <p>
 * 2.结论中提到了包,我们来看一下Java中包的定义和作用。
 * 包的作用
 * •1 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。
 * •2 如同文件夹一样,包也采用了树形目录的存储方式。同一个包中的类名字是不同的,
 * 不同的包中的类的名字是可以相同的,当同时调用两个不同包中相同类名的类时,
 * 应该加上包名加以区别。因此,包可以避免名字冲突。
 * •3 包也限定了访问权限,拥有包访问权限的类才能访问某个包中的类。
 * <p>
 * Java使用包(package)这种机制是为了防止命名冲突,访问控制,
 * 提供搜索和定位类(class)、接口、枚举(enumerations)和注释(annotation)等。
 * <p>
 * <p>
 * 3.结论中还提到了继承,我们来看一下Java中继承的定义。
 * class A extends B {
 * void printB() {
 * B ob = new B();
 * System.out.println(ob.b);
 * A ob2 = new A();
 * System.out.println(ob2.b);
 * }
 * }
 * <p>
 * class B {
 * int b = 10;
 * }
 * <p>
 * A继承B,因此A继承B的成员变量b。由于A在printB()中,
 * 声明、初始化B的一个对象ob后,可以通过ob.b访问b,
 * 则声明、初始化A的一个对象ob2后,可能通过ob2.b访问b。(可以访问则可以继承)。
 * <p>
 * 然而,在不同包里,子类继承父类时,
 * 子类只能访问父类的public型成员变量/方法,却能继承父类的protected和public型成员变量/方法
 * /* Stark.java
 * <p>
 * <p>
 * package winter.is.coming;
 * <p>
 * public class Stark {
 * private boolean ned;
 * boolean robb;
 * protected boolean sansa;
 * public boolean arya;
 * <p>
 * void howIsNed() {
 * System.out.println(ned);
 * }
 * }
 * <p>
 * class Snow {
 * void whoseBastard() {
 * Stark stark = new Stark();
 * // System.out.println(stark.ned); 不可访问
 * System.out.println(stark.robb);
 * }
 * }
 * <p>
 * <p>
 * <p>
 * import winter.is.coming.Stark;
 * <p>
 * public class Greyjoy extends Stark {
 * void betray() {
 * <p>
 * Stark stark = new Stark();
 * // System.out.println(stark.robb); 不可访问
 * // System.out.println(stark.sansa); 不可访问
 * <p>
 * Greyjoy greyjoy = new Greyjoy();
 * // System.out.println(greyjoy.robb); 不可访问
 * System.out.println(greyjoy.sansa);
 * <p>
 * }
 * }
 * <p>
 * <p>
 * <p>
 * import winter.is.coming.Stark;
 * <p>
 * public class Bolton {
 * void flay() {
 * Stark stark = new Stark();
 * System.out.println(stark.arya);
 * }
 * }
 * <p>
 * <p>
 * <p>
 * package winter.is.coming;
 * <p>
 * public class Stark {
 * private boolean ned;
 * boolean robb;
 * protected boolean sansa;
 * public boolean arya;
 * <p>
 * void howIsNed() {
 * System.out.println(ned);
 * }
 * }
 * <p>
 * class Snow {
 * void whoseBastard() {
 * Stark stark = new Stark();
 * // System.out.println(stark.ned); 不可访问
 * System.out.println(stark.robb);
 * }
 * }
 * <p>
 * <p>
 * <p>
 * import winter.is.coming.Stark;
 * <p>
 * public class Greyjoy extends Stark {
 * void betray() {
 * <p>
 * Stark stark = new Stark();
 * // System.out.println(stark.robb); 不可访问
 * // System.out.println(stark.sansa); 不可访问
 * <p>
 * Greyjoy greyjoy = new Greyjoy();
 * // System.out.println(greyjoy.robb); 不可访问
 * System.out.println(greyjoy.sansa);
 * <p>
 * }
 * }
 * <p>
 * <p>
 * <p>
 * import winter.is.coming.Stark;
 * <p>
 * public class Bolton {
 * void flay() {
 * Stark stark = new Stark();
 * System.out.println(stark.arya);
 * }
 * }
 * <p>
 * <p>
 * 得出重要的结论:
 * ① 自己包自己类 -- private可访问
 * ② 自己包别的类 -- default可访问
 * ③ 别的包别的类有继承关系 -- protected可继承,不可访问
 * ④ 别的包别的类无继承关系 -- public可访问
 */

/**


 package winter.is.coming;

 public class Stark {
 private boolean ned;
 boolean robb;
 protected boolean sansa;
 public boolean arya;

 void howIsNed() {
 System.out.println(ned);
 }
 }

 class Snow {
 void whoseBastard() {
 Stark stark = new Stark();
 // System.out.println(stark.ned); 不可访问
 System.out.println(stark.robb);
 }
 }



 import winter.is.coming.Stark;

 public class Greyjoy extends Stark {
 void betray() {

 Stark stark = new Stark();
 // System.out.println(stark.robb); 不可访问
 // System.out.println(stark.sansa); 不可访问

 Greyjoy greyjoy = new Greyjoy();
 // System.out.println(greyjoy.robb); 不可访问
 System.out.println(greyjoy.sansa);

 }
 }



 import winter.is.coming.Stark;

 public class Bolton {
 void flay() {
 Stark stark = new Stark();
 System.out.println(stark.arya);
 }
 }


 得出重要的结论:
 ① 自己包自己类 -- private可访问
 ② 自己包别的类 -- default可访问
 ③ 别的包别的类有继承关系 -- protected可继承,不可访问
 ④ 别的包别的类无继承关系 -- public可访问
 */



其实访问控制权限不是那么的重要,大家只需要记住结论姐可以了。大家也可以写下代码自己测试一下.这里我就不再写代码了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值