java 权限修饰符

256 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情

权限修饰符

概述

在Java中提供了四种访问权限,使用不同的访问权限修饰符修饰时,被修饰的内容会有不同的访问权限,

  • public:公共的。没有限制。在同一个包中同一个类中 或 在同一个包中不同类之间 或 不同包之间的子类中 或 不同包不同类之间都可以访问(简而言之-------》任何包中的类都可以访问);修饰成员变量 方法 构造方法 类

  • protected:受保护的。在本类中访问 或 同一个包中的其它类中访问 或 不同包中的子类访问

  • 默认的权限(空的):就是什么权限修饰符也不写。在本类访问或同一个包中的其它类中访问;

  • private:私有的。只能在本类(同一类)中访问。其它类(包含子类)都不能访问;修饰成员变量 方法 构造方法

    public > protected>默认的权限(空的)>private

不同权限的访问能力

publicprotected(空的)private
同一类中
同一包中(子类与无关类)
不同包的子类
不同包中的无关类

可见,public具有最大权限。private则是最小权限。

说明:关于protected(受保护权限)的演示,可以在不同包的子类中访问。

1、public访问权限:没有任何限制(权限最大)

代码举例:

需求:

1)定义一个com.fu包,在这个包中创建一个使用public关键字来修饰的Fu类,在这个父类中定义一个使用public修饰的method函数,在这个函数中随便打印一句话;

2)再重新定义一个com.zi包,在这个包中引入com.fu包下面的Fu类,定义一个使用public关键字来修饰的Zi类继承Fu类,在Zi类中定义一个public修饰的函数run,在这个函数中调用父类中method方法;

3)在重新定义一个com.test包,在这个包中引入com.fu包下面的Fu类和com.zi包下面的Zi类,定义一个测试类Test,在这个测试类中分别创建子父类对象,并使用对象分别调用各自中的函数;

父类:

package com.fu;
public class Fu 
{
    public void method()
    {
        System.out.println("父类中的方法....");
    }
}

子类:

package com.zi;
import com.fu.Fu;//导入Fu类
public class Zi extends Fu 
{
    public void run()
    {
        System.out.println("子类中的方法....");
        method();  //子类继承了父类 是可以直接去访问父类中的方法
    }
}

测试类:

package com.test;
import com.fu.Fu;//导入Fu类
import com.zi.Zi;//导入子类class Test 
{
    public static void main(String[] args) 
    {
        Zi z = new Zi();
        z.run();//子类对象调用子类中的方法
            /*
                测试类没有继承Fu这个类,但是可以创建对象,那么就可以调用Fu类中的method方法,
                  这样导致Fu类中的方法不仅仅子类可以直接去 访问,不是Fu的子类也可以访问了。
            */
        Fu f = new Fu();        
         f.method();
    }
}

问题:

com.test包中的Test类没有继承com.fu包中的Fu这个类,但是可以在com.test包中的Test类中创建Fu类对象,那么就可以在com.test包中的Test类中调用com.fu包中的Fu类中的method方法,这样导致Fu类中的方法不仅仅在com.zi包中的子类Zi可以直接去访问,而不是Fu的子类也可以访问了。

上述现象导致Zi类继承Fu类没有任何意义了。

在java中当定义一个类的时候,如果当前这个类中的方法只让自己的子类使用,而其他的类不让使用,这时可以在这个方法前面加上protected关键字。

protected访问权限:专门给子类使用的访问权限。

将上述Fu类中的method函数的修饰符public换成protected。

父类:

package com.fu;
public class Fu 
{
    protected void method()
    {
        System.out.println("父类中的方法....");
    }
}

子类:

package com.zi;
import com.fu.Fu;//导入Fu类
​
public class Zi extends Fu 
{
    public void run()
    {
        System.out.println("子类中的方法....");
        method();  //子类继承了父类 是可以直接去访问父类中的方法
    }
}

测试类:

package com.test;
import com.fu.Fu;//导入Fu类
import com.zi.Zi;//导入子类
class Test 
{
    public static void main(String[] args) 
    {
        Zi z = new Zi();
        z.run();//子类对象调用子类中的方法
          
        Fu f = new Fu();        
         f.method();//报错
    }
}

注意:

1)如果父类中的函数使用protected关键字修饰,那么这个函数可以被不同包下的子类访问,而不同包中的其他类不能访问。

2)protected只能修饰成员函数或成员变量,不能修饰类。

3) 四种访问权限,能够跨包访问的只有 public protected(必须是子类)

4)public修饰符和默认修饰符注意事项

package com.itheima.sh.demo_03;
/*
    1.public 修饰的类,要求当前.java源文件名必须和public修饰的类名一致
    2.如果一个类是默认修饰符,那么当前源文件名可以随便定义
    3.如果一个源文件中具有多个class类,那么只能有一个使用public修饰,并且源文件名必须是public修饰的类的名字
 */
class Demo02{
​
}
​
public class Demo01 {
}
​

编写代码时,如果没有特殊的考虑,建议这样使用权限:

  • 成员变量使用private ,隐藏细节。
  • 构造方法使用public ,方便创建对象。
  • 成员方法使用public ,方便调用方法。