A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Huyaal 中级黑马   /  2016-7-15 13:33  /  1151 人查看  /  14 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

Java中有四个权限,分别为private,protected,default,public,不写即为default,每个权限分别为如下表格:


private
default
protected
public
本类可访问




本包非本类可访问




非本包的子类可访问




非本包的类




另外类成员的权限不得大于类的权限,如果大于,以类的权限为准。即如下的一个类:

class Test{
    public int i=0;
    public void fun()
    {
        System.out.println(i);
    }
}

则类成员i和fun虽然定义的权限为public,但是由于类的权限为default,所以i,fun的权限仍为default。

通过对象访问类成员时,也要遵守权限,如下:

class Test{
    public static void main(String[] args){
        Myclass a=new Myclass();
        a.fun1();//错误,因为fun1的权限为private
        a.fun2();
        System.out.println(a.i1);//错误,因为i1的权限为private
        System.out.println(a.i2);
    }
}
class Myclass{
    private int i1=0;
    int i2=0;
    private void fun1()
    {
        System.out.println("fun1()");
     }
     void fun2()
     {
         System.out.println("fun2()");
      }
}

权限在继承时,只能从小的范围到大的范围改变(或者权限不变),不得从大的权限到小的权限,如下例子:

class parent{
    public void test()
    {
        System.out.println("hello");
     }
}
class children extends{
     protected void test() //错误,test的权限变小了
     {
         System.out.println("hello");
     }
}

14 个回复

倒序浏览
学习了,谢谢楼主分享
回复 使用道具 举报
(⊙o⊙)哦(⊙o⊙)哦(⊙o⊙)哦
回复 使用道具 举报
理解的很不错,收藏了。
回复 使用道具 举报
谢谢楼主分享
回复 使用道具 举报
顶顶顶顶顶顶
回复 使用道具 举报
我想补充一下:关于不同包下的子类访问父类的protected权限,很多人都会忽略这一点.
举个例子:
父类Fu位于com.heima包下,Fu中有一个protected权限的print方法,
子类Zi位于com.heima2包下,通过导包,Zi继承Fu类
---------------------------------------------------
它的意思不是说Zi类就直接可以访问父类的print方法.大家可以做个小测试,在Zi里面,创建一个Fu类对象,然后调用print()方法,这样是不能通过编译的
正确的做法:protected是保护自己的子类,也就是在Zi里面创建自己的对象,然后再调用print方法,此时才是有效的
回复 使用道具 举报
张雨 中级黑马 2016-7-15 23:14:06
8#
可以。。。。
回复 使用道具 举报
楼主666666666
回复 使用道具 举报
全面到位,谢谢分享
回复 使用道具 举报
好复杂,好复杂啊,好复杂啊啊啊
回复 使用道具 举报
谢谢分享............................
回复 使用道具 举报
知道这么回事就行了
回复 使用道具 举报
知道这么回事就行了
回复 使用道具 举报
谢谢楼主分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马