博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java public,default,protected,private区别
阅读量:6091 次
发布时间:2019-06-20

本文共 2241 字,大约阅读时间需要 7 分钟。

在说明这四个关键字之前,我想就class之间的关系做一个简单的定义:对于继承自己的class,base class可以认为他们都是自己的子女,而对于和自己一个目录下的classes,认为都是自己的朋友。

1、 public :对 所有用户 开放,所有用户都可直接调用

2、 private :私有。 除了class自己之外,任何人都不可直接使用 ,私有财产神圣不可侵犯嘛,即便是子女,朋友,都不可使用。
3、 protected :对于子女、朋友来说,就是public的,可自由使用,无任何限制;而对于其他的外部class,protected就变成private。( 同一个包中的类,若不在同一个包中,必须为其子孙类才可使用 )

4、默认: 默认可以称为friendly,但是java语言中是没有friendly这个修饰符的 ,这样称呼应该是来源于

 

Java中关于成员变量访问权限问题一般书中会给出如下表格:

                      

简单地描述一下表中的内容:用private 修饰的成员变量只能在类内部访问;用default修饰的成员变量可以再内部访问,也可以被同个包(同一目录)中的类访问;default修饰的成员变量既可以在类内部访问,又可以被同个包中的类访问,还能被子类访问;public可以被任何地方的类访问。

  我们可以用隐私程度来表示各种修饰符的权限,即:private > default > protected > public。private 、 protected 、public我们先不讨论其访问,我们着重讨论default的访问权限。在定义类的成员变量时,不用default去修饰成员变量,即是说,如果没有修饰符Java就将它默认是default类型的成员变量,如:int age; 。如果加了default则编译时会报错。按照以上说法,default型的成员变量是不能够在子类中被访问的,但是,事实上是不是如此呢?其实不然,这里缺少了一个限制条件,那就是子类和父类不在同一包中时,default型的成员变量是不能够在子类中被访问。即是说,如果子类和父类在同一包中,那么父类的default型的成员变量是能够被子类访问的。我们来举个例子:文件名是:Inherite.java

class Person{

  String name;

protected int age;
}

class Student extends Person{

  String school;
  double score;
}

public class Inherite {

  public static void main (String [] argv ){
    Student S = new Student ();
    S.name = "卓增泗";
    S.school = "交通大学";
    S.age = 24;
    S.score = 95.5;
    System.out.println("我是" + S.name + ",今年" + S.age + "岁,毕业于" + S.school + ",平均成绩是:" + S.score);
   }
}

最终的结果是:

         

 

  这个结果说明,子类是可以访问父类的default型的成员变量的。但是,当它们不在同一包中呢?我们再举一个例子:文件名1:Person.java  文件名2:Inherite1.java

//文件1:Person.java

package heri;

public class Person {

  String name;
  public int age;
}

这个文件编译后*.class文件位于heri文件夹中,编译命令为:javac -d . Person.java

//文件名:Inherite1.java

class Student extends Person{

  String school;
  double score;
}

public class Inherite1 {

  public static void main (String [] argv ) {
    Student S = new Student ();
    S.name = "卓增泗";
    S.school = "交通大学";
    S.age = 24;
    S.score = 95.5;
    System.out.println("我是" + S.name + ",今年" + S.age + "岁,毕业于" + S.school + ",平均成绩是:" + S.score);
  }
}

最终结果为:

      

可知,编译出现了两个错误,即是default型的成员变量。

  那么如何来解释这一现象呢?前面说过,因为隐私程度default高于protected,所以在同一包中时,子类也是一种类,这样子类就被视为是同一包中的类,这样的话子类就具有default的访问权限了。当不在同一包中时,子类就没有default的访问权限了。

    本文转自 一点点征服   博客园博客,原文链接:http://www.cnblogs.com/ldq2016/p/6872420.html,如需转载请自行联系原作者

你可能感兴趣的文章
一步一步学习SignalR进行实时通信_7_非代理
查看>>
为什么我弃用GNOME转向KDE(2)
查看>>
Redis学习记录初篇
查看>>
爬虫案例若干-爬取CSDN博文,糗事百科段子以及淘宝的图片
查看>>
Web实时通信技术
查看>>
第三章 计算机及服务器硬件组成结合企业运维场景 总结
查看>>
IntelliJ IDEA解决Tomcal启动报错
查看>>
默认虚拟主机设置
查看>>
php中的短标签 太坑人了
查看>>
[译] 可维护的 ETL:使管道更容易支持和扩展的技巧
查看>>
### 继承 ###
查看>>
数组扩展方法之求和
查看>>
astah-professional-7_2_0安装
查看>>
函数是对象-有属性有方法
查看>>
uva 10107 - What is the Median?
查看>>
Linux下基本栈溢出攻击【转】
查看>>
c# 连等算式都在做什么
查看>>
使用c:forEach 控制5个换行
查看>>
java web轻量级开发面试教程摘录,java web面试技巧汇总,如何准备Spring MVC方面的面试...
查看>>
使用ansible工具部署ceph
查看>>