Java访问权限深入

1、访问控制权限修饰符可以修饰什么?
属性(四个都能)
方法(四个都能)
类(public 和默认能都) public class A 和 class A protected 和 private 不允许能用在类
接口()

2、重写的访问权限的范围(从小到大) (下面这个子类特指是属性自身类的子类,要继承父类然后才能访问父类属性)
在这里插入图片描述
public > protected > default > private

一、public
(1)定义:public是公共的,被public所修饰的成员可以在任何类中都能被访问到。

(2)修饰的成分:
【1】public能用来修饰类,在一个java源文件中只能有一个类被声明为public,而且一旦有一个类为public,那这个java源文件的文件名就必须要和这个被public所修饰的类的类名相同,否则编译不能通过。
【2】说到这里,穿插多一点知识。
①一个类作为外部类的时候只能被public或者默认访问修饰符所修饰,
②但是一个类如果作为内部类的时候,则可以被四种访问修饰符所修饰,因为一个类作为内部类的时候,就作为外部类的一个成员属性了,因此可以有四种访问修饰符修饰,这是内部类和外部类的一个区别。
String name ; private class User{ (实例内部类,不报错)
}

private class User{ (外部类,报错)
}

【3】public用来修饰类中成员(变量和方法),被public所修饰的成员可以在任何类中都能被访问到。通过操作该类的对象能随意访问public成员。

public在类的继承上的体现,被public所修饰的成员能被所有的子类继承下来。

二、protected
(1)定义:protected是受保护的,受到该类所在的包所保护。

(2)作用域:被protected所修饰的成员会被位于同一package中的所有类访问到。同时,被protected所修饰的成员也能被该类的所有子类继承下来。(注意:这里是指同一个package或者不同的package中的子类都能访问)

三、friendly/default(默认,缺省的)

(1)定义:friendly是友好的,即在成员的前面不写任何的访问修饰符的时候,默认就是友好的。所谓友好的,是对同一package的类友好。

(2)作用域:同一package中的所有类都能访问。被friendly所修饰的成员只能被该类所在同一个package中的子类所继承下来。(也就是说只有在同一个package中的子类才能访问到父类中friendly修饰的成员)

四、private (封装常用)
(1)定义:private是私有的,即只能在当前类中被访问到,它的作用域最小。


①同包自身类访问权限:
(四种权限都能访问)

package com.bjpowernode03.javaSE.访问权限1;
import com.bjpowernode.javaSE.包和导包机制.packageimport使用例子;  
//在包机制下得import导入包+类名,才可以直接访问其他包的类对象

public class 同包自身类访问权限 {

        String name ; private class User{

    }
        private int id;
        protected boolean gender;
        public double moneybalance;
    public static void main(String[] args) {
        packageimport使用例子 p1 = new packageimport使用例子();
        p1.dosome();


        //经过测试访问权限全部都可以在同包属性自身类中访问;
        同包自身类访问权限 f1 = new 同包自身类访问权限();
        System.out.println(f1.name);
        System.out.println(f1.gender);
        System.out.println(f1.id);
        System.out.println(f1.moneybalance);
    }
}

②同包其他类中访问权限测试:
只有protected 和 public 和 默认default可以在同包其他类中访问

package com.bjpowernode03.javaSE.访问权限1;

public class 同包其他类中访问权限测试 {
    public static void main(String[] args) {
        同包自身类访问权限 f2 = new 同包自身类访问权限();

        //经过测试,protected 和 public 和 默认default可以在同包其他类中访问
        System.out.println(f2.gender);
        System.out.println(f2.moneybalance);
        System.out.println(f2.name);
//        System.out.println(f2.id);

    }
}

③非同包子类权限测试:
只有protected ,public可以访问

package com.bjpowernode04javaSE.访问权限2;

import com.bjpowernode03.javaSE.访问权限1.同包自身类访问权限;//导入访问控制权限包名

public class 非同包子类访问权限测试 {
    public static void main(String[] args) {
        同包自身类访问权限 c1 = new 同包自身类访问权限();
           c1.moneybalance  = 12346;  //public可以随意访问
//         c1.name = "林瑞仪";  default出了包就不认识了
//         c1.id = 123;    报错private私有出了自身类无法访问
//         c1.gender;  报错,protected gender不能在非同包非子类中访问。


    }
}
//定义一个非同包子类,下面这个子类特指是属性自身类的子类,要继承父类然后才能访问父类属性
class protected权限测试 extends 同包自身类访问权限 { 
 //这里protected权限测试类 是非同包的子类
    public void doit(){

        //经过测试,非同包子类权限只有protected ,public可以访问
        this.moneybalance = 12345;
        this.gender = true;  //this表示当前protected权限测试类的对象

    }
}

④非同包非子类访问权限测试:
只有public能访问到

package com.bjpowernode04javaSE.访问权限2;

import com.bjpowernode03.javaSE.访问权限1.同包自身类访问权限;
public class 非同包非子类访问权限测试 {
    public static void main(String[] args) {
        同包自身类访问权限 f3 = new 同包自身类访问权限();
        //经过测试, 在非同包非子类访问权限测试,只有public能访问到
        System.out.println(f3.moneybalance); //
//        System.out.println(f3.id);
//        System.out.println(f3.name);
//        System.out.println(f3.gender);


    }
}

访问权限注意点:
1、覆盖的方法访问权限不能变低,可以更高。(即子类方法的访问权限得和父类一样或者更开放)原因:
【1】(先记住这个和多态的实现有关,比如子类覆盖方法中的权限public变为protected 则访问权限就会更低了,也就无法直接通过父类引用去多态进入到子类的方法,因为多态时,编译器会先去父类静态找到父类方法,找到了编译就通过然后才在运行时去动态去进入子类的方法。
【2】多态中,子类对象可以被当成父类对象使用。比如这样A a = new B(),B子继承了A父,假设现在重写A父类public方法s(),如果在B中变为了private/protected私有方法,那么调用a.s()会发生什么?会无法被调用,权限变低了。因为私有方法无法直接访问,也就无法实现多态了
【3】通俗说:Java希望儿子一代更比一代强, 没有说越传越差的 只有更好。
2、覆盖之后的方法,不能throws抛出更多的异常,只能更少。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值