举例详解Java中的访问权限修饰符

作者:damotiansheng 时间:2023-01-18 08:52:17 

访问权限符:
(1)public:
对于成员来说:任何其他类都可以访问它们,不管在同一个包中还是在另外的包中。
对于类来说:    也是一样。
(2)friendly:
对于成员老说:如果一个类的成员没有任何权限修饰,那么它门就是缺省包访问权限,用friendly来表示,注

意friendly不是Java中的关键字,这里是个人喜欢的方式用它表示而已。同一个包内其它类可以访问,但包外

就不可以。对于同一个文件夹下的、没有用package的classes,Java会自动将这些classes初见为隶属于该目录

的default package,可以相互调用class中的friendly成员。如以下两个class分别在同一个文件夹的两个文件

中,虽然没有引入package,但隶属于相同的default package。


class Sundae{
//以下两个方法缺省为friendly
Sundae(){}
Void f() {System.out.println(“Sundae.f()”);
}
public class IceCream{
public static void main(String[] args){
Sundae x = new Sundae();
x.f();
}
}

对于类来说:同一个包中的类可以用。总之,类只可以声明为public或者friendly。
(3)private:
对于对于成员来说:只能在该成员隶属于的类中访问。


class Sundae{
private Sundae(){}//只能在Sundae class中被调用
Sundae(int i) {}
static Sundae makASundae() {
return new Sundae();
}
}
public class IceCream{
public static void main(String[] args){
// Sundae class中构造函数Sundae()是private,
// 所以不能用它进行初始化
//Sundae x = new Sundae();
Sundae y = new Sundae(1);//Sundae(int)是friendly,可以在此调用
Sundae z = Sundae.makASundae();
}
}

对于类来说:类不可以声明为private。

(4)protected:
对于对于成员来说:相同包中的类可以访问(包访问权限);基类通过protected把基类中的成员的访问权限赋予派生类不是所有类(派生类访问权限)。

(5)default(默认权限)
类,数据成员,构造方法,方法成员,都能够使用默认权限,即不写任何关键字。默认权限即同包权限,同包权限的元素只能在定义它们的类中,以及同包的类中被调用。

例子:package c05.local;


import pack1.Cookie;
//注意:在这里ChocolateChip继承了类Cookie,按道理bite()方法也在
//ChocolateChip中,可以用x.bite直接调用,但是不可以的,因为类ChocolateChip
//和Cookie类不在一个包中,各自具有包访问权限,为了能够使用x.bite()必须要把
//Cookie方法的访问权限换成public或者protected,但是一旦换成public所有的人就
//可以访问了,这样达不到隐私的要求,所以设置成protected最好,既可以顺利访问,也可以
//避免外面的类调用,保护好隐私的作用
public class ChocolateChip extends Cookie {

public ChocolateChip() {
  System.out.println("ChocolateChip constructor");
 }
 public static void main(String[] args) {
  ChocolateChip x = new ChocolateChip();
  x.bite(); // Can't access bite

}
} ///:~

package pack1;

public class Cookie {
public Cookie()
{
System.out.println("Cookie constructor");
}

protected void bite(){System.out.println("bite");}

}



对于类来说:类不可以声明为protected

 


对于类的权限修饰,下面有更好的解释:


Class类的访问权限:

public:可以供所有的类访问。

默认:默认可以称为friendly但是,java语言中是没有friendly这个修饰符的,这样称呼应该是来源于c++。默认的访问权限是包级访问权限。

         即如果写了一个类没有写访问权限修饰符,那么就是默认的访问权限,同一个包下的类都可以访问到,即使可以实例化该类

         (当然如果这个类不具有实例化的能力除外,比如该类没有提供public的构造函数)。


说明:

       1、每个编译单元(类文件)都仅能有一个public class

       2、public class的名称(包含大小写)必须和其类文件同名。

       3、一个类文件(*.java)中可以不存在public class。

        这种形式的存在的场景:如果我们在某个包内撰写一个class,仅仅是为了配合同包内的其他类工作,而且

       我们不想再为了撰写说明文档给客户(不一定是现实意义的客户,可能是调用这个类的类)看而伤脑筋,而且有可能过一段时间之后

       有可能会彻底改变原有的做法,并完全舍弃旧版本,以全新的版本代替。

       4、class不可以是private和protected。

       5、如果不希望那个任何产生某个class的对象,可以将该类得所有构造函数设置成private。但是即使这样也可以生成该类的对象,就是class的static的成员(属性和方法)可以办到。


综合示例:

First.java:




package Number;
import Test.*;

public class Frist extends Test
{
protected String s1 = "你好";
public static void main( String[] args)
{
String s2 = "java";
//System.out.println(s1);
System.out.println(s2);

Frist t = new Frist();
System.out.println(t.s);
t.show();
return;
}

}

Test.java:
package Test;

public class Test  
{
protected String s = "hello test"; //可以被同包中的类访问以及子类访问,该子类可以是与包Test不同
public void show()
{
Test1 t1 = new Test1();
return;
}

}

class Test1
{
Test1()
{
Test t = new Test();
System.out.println(t.s);
}
}

输出: 


java
hello test
hello test
标签:Java,访问权限
0
投稿

猜你喜欢

  • java实现列表、集合与数组之间转化的方法

    2023-11-29 10:17:38
  • SpringBoot2之PUT请求接收不了参数的解决方案

    2023-08-23 01:32:07
  • GSON实现Java对象的JSON序列化与反序列化的实例教程

    2023-11-23 12:39:02
  • C# SkinEngine控件 给窗体添加皮肤的方法

    2021-10-21 23:32:08
  • spring webflux自定义netty 参数解析

    2023-07-26 18:38:25
  • Spring boot创建自定义starter的完整步骤

    2023-05-08 08:08:53
  • C#实现简单记事本程序

    2022-07-20 23:52:37
  • Java使用BigDecimal进行运算封装的实际案例

    2023-06-20 02:22:26
  • 详解HDFS多文件Join操作的实例

    2023-09-20 07:44:14
  • Android 实现签到足迹功能

    2023-06-21 15:16:24
  • SpringBoot整合Elasticsearch7.2.0的实现方法

    2023-11-09 19:22:56
  • MyBatis中PageHelper不生效的解决方案

    2022-10-23 11:46:47
  • Java的SPI机制实例详解

    2021-08-15 08:47:41
  • 浅析C# 函数的传值与传址

    2023-11-22 04:46:57
  • flutter传递值到任意widget(当需要widget嵌套使用需要传递值的时候)

    2022-05-17 22:53:44
  • myeclipse安装Spring Tool Suite(STS)插件的方法步骤

    2023-02-22 00:56:02
  • GraphQL入门总体创建教程

    2022-10-16 12:29:09
  • Android如何设置圆角图片

    2021-12-06 23:35:31
  • 浅谈Java面向接口编程

    2021-07-25 16:29:58
  • java jdbc连接和使用详细介绍

    2023-01-13 18:12:52
  • asp之家 软件编程 m.aspxhome.com