Java 中关于default 访问权限的讨论
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的访问权限了。
Java 中关于default 访问权限的讨论的更多相关文章
- Java中四种访问权限总结
一.Java中有四种访问权限, 其中三种有访问权限修饰符,分别为private.public.protected,还有一种不带任何修饰符(default). 1. private: Java语言中对访 ...
- Java中protected方法访问权限的问题
先看Test.java 此时出现上文提到的错误:The method clone from the type Object is not visiuable. 我们已经清楚Object.clone() ...
- C++中protected的访问权限
关于C++中protected的访问权限的讨论已经是一个很陈旧的话题了,陈旧到大家都不愿意去讨论,觉得他见到到吃饭睡觉那么自然. 我再次读<C++ Primer>的时候,其中关于prote ...
- Java继承多态中的方法访问权限控制
java中的方法天生具有继承多态特性,这点与C++有很大不同(需要在父类方发上加virtual关键字),但用起来确实方便了许多. 最简单的继承多态 声明一个接口BaseIF,只包含一个方法声明 pub ...
- Java之封装与访问权限控制(一)
目录 Java之封装与访问权限控制(一) 封装的概念 访问控制符 属性私有化 Java之封装与访问权限控制(一) 对于封装的概念,我总觉得自己还是挺了解的,但是真要我说,还真说不出个啥来.我只能默默地 ...
- angularjs中的页面访问权限设置
11月在赶一个项目,这阵子比较忙,挤挤时间更一篇博客吧,如标题所述说说在ng中页面访问权限控制的问题,水平有限各位看官见谅: 在以往的项目中,前后端常见的配合方式是前端提供页面和ui加一点DuangD ...
- Java基础详解 (一)Java的类成员访问权限修饰词(以及类访问权限)
在一个类的内部,其成员(包括成员变量和成员函数)能否被其他类所访问,取决于该成员的修饰词.Java的类成员访问权限修饰词有四类:private,无(默认情况下),protected和public.其权 ...
- JAVA基础学习之throws和throw的区别、Java中的四种权限、多线程的使用等(2)
1.throws和throw的区别 throws使用在函数外,是编译时的异常,throw使用在函数内,是运行时的异常 使用方法 public int method(int[] arr) throws ...
- java与c++的访问权限的问题
转自网络:http://blog.sina.com.cn/s/blog_4bc954d30100wtxe.html 权限的理解重要理解什么是可见什么是不可见 首先声明:java中,friendly这个 ...
随机推荐
- Django入门--模型系统(二):常用查询及表关系的实现
1.常用查询 模型类上的管理器: ** 模型类.objects ** (1)常用一般查询 rs = Student.objects.all() # 查询所有记录,返回Queryset print(rs ...
- ORA-12560: TNS: 协议适配器错误(oracle service 已启动)
如果是安装完 oracle 客户端之后才出现的这个问题,请往下看 安装 oracle client 时,会配置一个客户端的监听,如果电脑上之前安装过 oracle service 就会和服务的监听冲突 ...
- 【codeforces 807A】Is it rated?
[题目链接]:http://codeforces.com/contest/807/problem/A [题意] 给你n个人在一场CF前后的rating值; 问你这场比赛是不是计分的 [题解] 如果有一 ...
- asp.net-EF事物与存储过程
FK_Equipment_EquipmentClass 这个是sql中的命名规范,外键名称在前面,主键名称在后面 EF事务的代码 DbTransaction tran = null; try { ne ...
- uva 10061(数学)
题解:题目要在b进制下输出的是一个数字阶乘后有多少个零,然后输出一共同拥有多少位.首先计算位数,log(n)/log(b) + 1就是n在b进制下有多少位,而log有个公式就是log(M×N) = l ...
- QTP自带订票实现循环执行,參数化和将异常提示信息输出
做这个样例主要是为了积累一些较基础的知识,以便日后可參考学习 这个样例是一个订票的C/Sclient程序 一.业务需求: 1.实现异常和正常数据登录窗体,系统对数据进行校验 2.登录成功后.进行订票业 ...
- SVN文件恢复
SVN删除文件 一.本地删除 SVN删除文件里的本地删除,指的是在clientdelete了一个文件,但还没有commit.使用revert来撤销删除. 二.server删除 1.通过本地删除后提交s ...
- c/c++中sleep()函数毫秒级的实现
近期看到好多人在问.c/c++中的sleep函数是秒级的,能不能实现毫秒级的呢?当然非常easy.我的写法例如以下 #include <stdio.h> #include <sys/ ...
- 利用DBMS_SQLTUNE优化SQL
DBMS_SQLTUNE优化SQL是在oracle10g才出来的新特性,使用它能很大程度上方便对sql的分析和优化.执行DBMS_SQLTUNE包进行sql优化需要有advisor的权限: stat& ...
- HD-ACM算法专攻系列(20)——七夕节
问题描述: AC源码: /**/ #include"iostream" #include"cmath" using namespace std; int mai ...