一、实例成员与类成员

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. 简单配置webpack自动刷新浏览器

    文档地址  http://webpack.github.io/docs/usage.html 首先全局安装webpack(我这里使用的是淘宝的cnpm) cnpm install webpack 检查 ...

  2. 解决Debian系统的Crontab执行时间时差问题

    首先用 * * * * * date >> /root/log.log 做个测试,发现显示的是UTC的时间,但是直接执行date,得到的是CST的时间.可见在Debian里crontab的 ...

  3. Oracle数据库sys和system用户的默认密码及如何修改密码

    新安装好的Oracle数据库sys用户默认密码为change_on_install,system用户默认密码为manager. 以管理员身份登录的话,在命令行中输入 sqlplus sys/chang ...

  4. Apache-Tika解析PDF文档

    通常在使用爬虫时,爬取到网上的文章都是各式各样的格式处理起来比较麻烦,这里我们使用Apache-Tika来处理PDF格式的文章,如下: package com.mengyao.tika.app; im ...

  5. osgi实战学习之路:5.生命周期及利用命令、装饰者模式实现基于socket交互Bundle命令demo

    生命周期中关键3个类: BundleActivator 入口点,类似main方法 BundleContext Bundle上下文对象,在执行期间,为应用程序提供操作osgi框架的方法 Bundle 代 ...

  6. 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 ...

  7. springcloud干活之服务消费者(feign)

    springcloud系列文章的第三篇 本章将继续讲述springcloud的消费者(feign) Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端. ...

  8. Codeforces 900D Unusual Sequences 容斥原理

    题目链接:900D  Unusual Sequences 题意: 给出两个数N,M.让你求数列(和为M,gcd为N)的个数. 题解: 首先,比较容易发现的是M%N如果不为零,那么一定不能构成这样的序列 ...

  9. bat 批处理切换到当前脚本所在文件夹

    bat 批处理切换到当前脚本所在文件夹   切换到当前脚本所在的文件夹 ? 1 cd  %~dp0 另外附上一些bat基本内容 —————————————————————————————— 批处理常用 ...

  10. 《Python黑帽子:黑客与渗透测试编程之道》 Windows下木马的常用功能

    有趣的键盘记录: 安装pyHook: http://nchc.dl.sourceforge.net/project/pyhook/pyhook/1.5.1/pyHook-1.5.1.win32-py2 ...