Java 访问限制符 在同一包中或在不同包中:使用类创建对象的权限 & 对象访问成员变量与方法的权限 & 继承的权限 & 深入理解protected权限
一、实例成员与类成员
1. 当类的字节码被加载到内存, 类中类变量、类方法即被分配了相应内存空间、入口地址(所有对象共享)。
2. 当该类创建对象后,类中实例变量被分配内存(不同对象的实例变量互不相同,即分配了不同的内存空间);
类中实例方法被分配入口地址(创建第一个对象时分配;方法的入口地址被所有的对象共享;所有对象都不存在时,方法的入口地址才被取消)。
3. 在同一类中,类中的实例方法总是可以操作该类中的实例变量和类变量;类方法总是可以操作该类中的类变量。(与访问限制符没有关系)
二、使用类创建对象的权限 & 对象访问成员变量与方法的权限
1. 在同一包中:
可以在任何另外一个类中使用public类与友好类创建对象;
创建的对象能够通过“.”运算符操作自己类中不是private的成员变量与方法。
2. 不在同一包中:import语句
可以在任何另外一个类中使用public类创建对象;
创建的对象能够通过“.”运算符操作自己类中public的成员变量与方法。
三、继承的权限
1. 子类与父类在同一包中,子类继承父类中不是private的成员变量与方法。
2. 子类与父类不在同一包中时,子类只继承父类中的protected和public访问权限的成员变量与方法。
四、深入理解protected权限
*注意!!!
对于protected的成员变量与方法,
可以被同一包中的其它类(包括子类)访问,同时也能被不同包中的子类访问;
当不在同一个包,不存在继承时,对于其他包中的类而言是不能访问的。
* 总结:
1. 子类可以通过继承获得不同包父类的protected权限成员变量和成员方法,在子类中可以直接访问
2. 在子类中可以通过子类的对象访问父类的protected成员变量和方法
3. 在子类中反而不能通过父类的对象访问父类的protected成员变量和方法
4.在子类中不能通过其他子类的对象访问父类的protected成员变量和方法
5.在与子类同包的其他类中不能通过子类的对象访问父类的protected成员变量和方法
关于protected权限的子类访问方式
https://blog.csdn.net/blacktal/article/details/81198579
package lab5_2_a; public class Parent {
private int f1 = 11;
int f2 = 12;
protected int f3 = 13;
public int f4 = 14;
private void fm1() {
System.out.println("in fm1()");
}
void fm2() {
System.out.println("in fm2()");
}
protected void fm3() {
System.out.println("in fm3()");
}
public void fm4() {
System.out.println("in fm4()");
} public static void main(String[] args){
/*当类的字节码被加载到内存,
* 类中类变量、类方法即被分配了相应内存空间、入口地址(所有对象共享)。
*/
//在同一类中,类中的实例方法总是可以操作该类中的实例变量和类变量;类方法总是可以操作该类中的类变量。
Parent p = new Parent();
/*Parent类创建对象,类中实例变量被分配内存(不同对象的实例变量互不相同,即分配了不同的内存空间);
* 类中实例方法被分配入口地址
* (创建第一个对象时分配;方法的入口地址被所有的对象共享;所有对象都不存在时,方法的入口地址才被取消)。
*/ p.fm1();
p.fm2();
p.fm3();
p.fm4();
}
}
package lab5_2_a; public class Child extends Parent {
private void cm1() {
System.out.println("in cm1()");
}
void cm2() {
System.out.println("in cm2()");
}
protected void cm3() {
System.out.println("in cm3()");
}
public void cm4() {
System.out.println("in cm4()");
} public static void main(String[] args){
Child c = new Child();
c.cm1();
c.cm2();
c.cm3();
c.cm4();
//继承:子类与父类在同一包中,子类继承父类中不是private的成员变量与方法
//c.fm1();
c.fm2();
c.fm3();
c.fm4();
}
}
package lab5_2_a; public class Inherit {
public static void main(String[] args){
Parent p = new Parent();
/* 访问权限(在同一包中):
* 可以在任何另外一个类中使用public类与友好类创建对象;
* 创建的对象能够通过“.”运算符操作自己类中不是private的成员变量与方法。
*/
//p.fm1();
p.fm2();
p.fm3();
p.fm4(); Child c = new Child();
/* 访问权限(在同一包中):
* 可以在任何另外一个类中使用public类与友好类创建对象;
* 创建的对象能够通过“.”运算符操作自己类中不是private的成员变量与方法。
*/
//c.cm1();
c.cm2();
c.cm3();
c.cm4();
//c.fm1();
c.fm2();
c.fm3();
c.fm4();
}
}
package lab5_2_b; import lab5_2_a.Child; public class GrandChild extends Child {
public static void main(String[] args){
GrandChild g = new GrandChild();
//继承:子类与父类不在同一包中时,子类只继承父类中的protected和public访问权限的成员变量与方法
//g.cm1();
//g.cm2();
g.cm3();
g.cm4();
//继承:子类与父类不在同一包中时,子类只继承父类中的protected和public访问权限的成员变量与方法
//g.fm1();
//g.fm2();
g.fm3();
g.fm4();
}
}
package lab5_2_b; public class GreatGrandChild extends GrandChild {
public static void main(String[] args){
GreatGrandChild g = new GreatGrandChild();
//继承:子类与父类在同一包中,子类继承父类中不是private的成员变量与方法
//g.cm1();
//g.cm2();
g.cm3();
g.cm4();
//继承:子类与父类在同一包中,子类继承父类中不是private的成员变量与方法
//g.fm1();
//g.fm2();
g.fm3();
g.fm4();
}
}
package lab5_2_b; import lab5_2_a.*; public class Inherit {
public static void main(String[] args){
Parent p = new Parent();
/* 访问权限(不在同一包中):import语句
* 可以在任何另外一个类中使用public类创建对象;
* 创建的对象能够通过“.”运算符操作自己类中public的成员变量与方法。
*/
//p.fm1();
//p.fm2();
//p.fm3();
p.fm4(); Child c = new Child();
/* 访问权限(不在同一包中):import语句
* 可以在任何另外一个类中使用public类创建对象;
* 创建的对象能够通过“.”运算符操作自己类中public的成员变量与方法。
*/
//c.cm1();
//c.cm2();
//c.cm3();
c.cm4();
//c.fm1();
//c.fm2();
//c.fm3();
c.fm4(); GrandChild g = new GrandChild();
/* 访问权限(在同一包中):
* 可以在任何另外一个类中使用public类与友好类创建对象;
* 创建的对象能够通过“.”运算符操作自己类中不是private的成员变量与方法。
*/
//g.cm1();
//g.cm2(); //g.cm3();
/* 注意!!!
* 对于protected的成员变量与方法,
可以被同一包中的其它类(包括子类)访问,同时也能被不同包中的子类访问;
当不在同一个包,不存在继承时,对于其他包中的类而言是private(不能访问的)。
* 总结:
1. 子类可以通过继承获得不同包父类的protected权限成员变量和成员方法,在子类中可以直接访问
2. 在子类中可以通过子类的对象访问父类的protected成员变量和方法 3. 在子类中反而不能通过父类的对象访问父类的protected成员变量和方法
4.在子类中不能通过其他子类的对象访问父类的protected成员变量和方法
5.在与子类同包的其他类中不能通过子类的对象访问父类的protected成员变量和方法
*/ g.cm4();
//g.fm1();
//g.fm2(); //g.fm3();
/* 注意!!!对于protected的成员变量与方法,
* 可以被同一包中的其它类(包括子类)访问,同时也能被不同包中的子类访问;
* 当不在同一个包,不存在继承时,对于其他包中的类而言是private(不能访问的)
* 总结:
1. 子类可以通过继承获得不同包父类的protected权限成员变量和成员方法,在子类中可以直接访问
2. 在子类中可以通过子类的对象访问父类的protected成员变量和方法 3. 在子类中反而不能通过父类的对象访问父类的protected成员变量和方法
4.在子类中不能通过其他子类的对象访问父类的protected成员变量和方法
5.在与子类同包的其他类中不能通过子类的对象访问父类的protected成员变量和方法
*/ g.fm4();
}
}
Java 访问限制符 在同一包中或在不同包中:使用类创建对象的权限 & 对象访问成员变量与方法的权限 & 继承的权限 & 深入理解protected权限的更多相关文章
- java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。
首先先说一下类的加载,流程.只有明确了类这个对象的存在才可以更好的理解反射的原因,以及反射的机制. 一. 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三 ...
- java利用反射绕过私有检查机制实行对private、protected成员变量或方法的访问
在java中,如果类里面的变量是声明了private的,那么只能在被类中访问,外界不能调用,如果是protected类型的,只能在子类或本包中调用,俗话说没有不透风的墙.但是可以利用java中的反射从 ...
- java中使用反射做一个工具类,来为指定类中的成员变量进行赋值操作,使用与多个类对象的成员变量的赋值。
//------------------------------------------------我是代码的分割线 // 首选是一个工具类,在该工具类里面,定义了一个方法,public void s ...
- 继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程
继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的 ...
- 测试 Java 类的非公有成员变量和方法
引言 对于软件开发人员来说,单元测试是一项必不可少的工作.它既可以验证程序的有效性,又可以在程序出现 BUG 的时候,帮助开发人员快速的定位问题所在.但是,在写单元测试的过程中,开发人员经常要访问类的 ...
- Java学习日记基础篇(四)——类,对象之成员变量,成员方法,构造方法
面向对象(Object Oriented) 一.面向对象杂谈 面向对象(Object Oriented),我的翻译是以物体为目标的,就是说编程的时候是建立一个物体,然后对这个物体进行操作. Java语 ...
- [Java] 继承中,父类被覆盖的成员变量、方法的可访问性
在 Java 的继承机制里,在子类内部,可以访问父类被覆盖的变量和方法:在子类外部,可以访问父类的被覆盖变量,但是不能访问父类的被覆盖方法. 父类中被覆盖的方法不能在外部被方法,这是出于封装的考虑. ...
- PHP面向对象(OOP)----访问限制符
访问控制修饰符指public.protected.private三个关键词来修饰类的成员属性和成员方法,可以有不同的权限 public:[共有的]类里面调用和类外面调用都是可以的 protected: ...
- java接口中成员变量和方法的默认修饰符(转)
Java的interface中,成员变量的默认修饰符为:public static final 所以我们在interface中定义成员变量的时候,可以 1:public static final St ...
随机推荐
- 简单配置webpack自动刷新浏览器
文档地址 http://webpack.github.io/docs/usage.html 首先全局安装webpack(我这里使用的是淘宝的cnpm) cnpm install webpack 检查 ...
- 解决Debian系统的Crontab执行时间时差问题
首先用 * * * * * date >> /root/log.log 做个测试,发现显示的是UTC的时间,但是直接执行date,得到的是CST的时间.可见在Debian里crontab的 ...
- Oracle数据库sys和system用户的默认密码及如何修改密码
新安装好的Oracle数据库sys用户默认密码为change_on_install,system用户默认密码为manager. 以管理员身份登录的话,在命令行中输入 sqlplus sys/chang ...
- Apache-Tika解析PDF文档
通常在使用爬虫时,爬取到网上的文章都是各式各样的格式处理起来比较麻烦,这里我们使用Apache-Tika来处理PDF格式的文章,如下: package com.mengyao.tika.app; im ...
- osgi实战学习之路:5.生命周期及利用命令、装饰者模式实现基于socket交互Bundle命令demo
生命周期中关键3个类: BundleActivator 入口点,类似main方法 BundleContext Bundle上下文对象,在执行期间,为应用程序提供操作osgi框架的方法 Bundle 代 ...
- org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist: sys.entity.Role; nested exception is org.hibernate.PersistentObjectException: 的解决方案
1.错误信息 org.springframework.dao.InvalidDataAccessApiUsageException: detached entity passed to persist ...
- springcloud干活之服务消费者(feign)
springcloud系列文章的第三篇 本章将继续讲述springcloud的消费者(feign) Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端. ...
- Codeforces 900D Unusual Sequences 容斥原理
题目链接:900D Unusual Sequences 题意: 给出两个数N,M.让你求数列(和为M,gcd为N)的个数. 题解: 首先,比较容易发现的是M%N如果不为零,那么一定不能构成这样的序列 ...
- bat 批处理切换到当前脚本所在文件夹
bat 批处理切换到当前脚本所在文件夹 切换到当前脚本所在的文件夹 ? 1 cd %~dp0 另外附上一些bat基本内容 —————————————————————————————— 批处理常用 ...
- 《Python黑帽子:黑客与渗透测试编程之道》 Windows下木马的常用功能
有趣的键盘记录: 安装pyHook: http://nchc.dl.sourceforge.net/project/pyhook/pyhook/1.5.1/pyHook-1.5.1.win32-py2 ...