持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情
权限修饰符
概述
在Java中提供了四种访问权限,使用不同的访问权限修饰符修饰时,被修饰的内容会有不同的访问权限,
-
public:公共的。没有限制。在同一个包中同一个类中 或 在同一个包中不同类之间 或 不同包之间的子类中 或 不同包不同类之间都可以访问(简而言之-------》任何包中的类都可以访问);修饰成员变量 方法 构造方法 类
-
protected:受保护的。在本类中访问 或 同一个包中的其它类中访问 或 不同包中的子类访问;
-
默认的权限(空的):就是什么权限修饰符也不写。在本类访问或同一个包中的其它类中访问;
-
private:私有的。只能在本类(同一类)中访问。其它类(包含子类)都不能访问;修饰成员变量 方法 构造方法
public > protected>默认的权限(空的)>private
不同权限的访问能力
| public | protected | (空的) | 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,方便调用方法。