一、实例成员与类成员

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权限的更多相关文章

  1. java中的反射机制,以及如何通过反射获取一个类的构造方法 ,成员变量,方法,详细。。

    首先先说一下类的加载,流程.只有明确了类这个对象的存在才可以更好的理解反射的原因,以及反射的机制. 一.  类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三 ...

  2. java利用反射绕过私有检查机制实行对private、protected成员变量或方法的访问

    在java中,如果类里面的变量是声明了private的,那么只能在被类中访问,外界不能调用,如果是protected类型的,只能在子类或本包中调用,俗话说没有不透风的墙.但是可以利用java中的反射从 ...

  3. java中使用反射做一个工具类,来为指定类中的成员变量进行赋值操作,使用与多个类对象的成员变量的赋值。

    //------------------------------------------------我是代码的分割线 // 首选是一个工具类,在该工具类里面,定义了一个方法,public void s ...

  4. 继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

    继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的 ...

  5. 测试 Java 类的非公有成员变量和方法

    引言 对于软件开发人员来说,单元测试是一项必不可少的工作.它既可以验证程序的有效性,又可以在程序出现 BUG 的时候,帮助开发人员快速的定位问题所在.但是,在写单元测试的过程中,开发人员经常要访问类的 ...

  6. Java学习日记基础篇(四)——类,对象之成员变量,成员方法,构造方法

    面向对象(Object Oriented) 一.面向对象杂谈 面向对象(Object Oriented),我的翻译是以物体为目标的,就是说编程的时候是建立一个物体,然后对这个物体进行操作. Java语 ...

  7. [Java] 继承中,父类被覆盖的成员变量、方法的可访问性

    在 Java 的继承机制里,在子类内部,可以访问父类被覆盖的变量和方法:在子类外部,可以访问父类的被覆盖变量,但是不能访问父类的被覆盖方法. 父类中被覆盖的方法不能在外部被方法,这是出于封装的考虑. ...

  8. PHP面向对象(OOP)----访问限制符

    访问控制修饰符指public.protected.private三个关键词来修饰类的成员属性和成员方法,可以有不同的权限 public:[共有的]类里面调用和类外面调用都是可以的 protected: ...

  9. java接口中成员变量和方法的默认修饰符(转)

    Java的interface中,成员变量的默认修饰符为:public static final 所以我们在interface中定义成员变量的时候,可以 1:public static final St ...

随机推荐

  1. algs4 使用 DrJava 编写 Hello World on Windows

    前阶段读了 Yinwang 的博客, 对 Scheme and Lisp 产生了很大的兴趣, 用 学生模式的  DrRacket IDE一步一步开始实现 How to Design Programs. ...

  2. iOS日期问题

    由于项目需要,需要获取去设备的当前时间,组成一个字符串,比如 2018年9月15日 15点30分30秒,需要转换成字符创:180915153030. 很简单的一个需求,于是就使用了日期格式话当前时间: ...

  3. vue怎么引入外网json文件

    今日吃午饭时,伊万卡前端小妹问了我一个问题."App中有一个模块是用H5做的,其中有一个接口读取的是本地json资源文件,但是这个文件修改时间不定,我又不想每次修改了这个文件再重新发版打个包 ...

  4. vue--vant组件库Dialog弹出框

    安装vant UI框架: cnpm install vant –-save-dev 导入组件-在main.js里: import Vant from 'vant'; import'vant/lib/v ...

  5. C# 如何获取可执行文件路径的上上级目录

    1. DirectoryInfo di = new DirectoryInfo(string.Format(@"{0}..\..\", Application.StartupPat ...

  6. Descriptio Resource Path LocationType Archive for required library: 'D:/apache-maven/apache-maven-3.6.0/mavenrepository/org/springframework/spring-aspects/4.3.7.RELEASE/spring-aspects-4.3.7.RELEASE.

    eclipse创建了一个maven项目后,在导入依赖包后返现项目有个红色刺眼的感叹号,再看控制台有个Problem提示 Descriptio Resource Path LocationType Ar ...

  7. 如何系统地自学 Python?

    最近开始系统的学习Python,以及整理的一些资料.github记录着个人自学 Python 的过程,持续更新.欢迎大家一起来完善这个自学Python学习的项目,给后来者一个参考的学习过程.githu ...

  8. 从mysql向HBase+Phoenix迁移数据的心得总结

    * 转载请注明出处 - yosql473 - 格物致知,经世致用 mysql -> HBase + Phoenix 1.总体方案有哪些? 1)通过Sqoop直接从服务器(JDBC方式)抽取数据到 ...

  9. Web安全测试工具 Burp Suit 使用简介

    参考文档: https://blog.csdn.net/gitchat/article/details/79168613 https://www.cnblogs.com/nieliangcai/p/6 ...

  10. WebvirtCloud安装(CentOS7)

    1.安装依赖包wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repoyum -y install p ...