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 ...
随机推荐
- Oracle 12c 单实例安装
准备工作 实验环境:Redhat 6.6 Oracle 12c 12.2.0.1 1.官网下载 https://www.oracle.com/technetwork/database/enterp ...
- 线程池如何复用一个线程-- ThreadPoolExecutor的实现(未完)
任务是一组逻辑工作单元,而线程则是使任务异步执行的机制.在Java中,Runnable对象代表一个任务,Thread对象负责创建一个线程执行这个任务. 前提:1. 程序需要处理大量任务 2. 任务的执 ...
- day18
使用规范目录结构的好处 - 使项目结构更清晰 - 提高可读性 规范目录结构不是固定,可以根据实际需求进行添加修改 常见目录如下: bin 存放执行文件 conf 存放配置文件 core 存放核心业务逻 ...
- dom节点相关问题
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8&qu ...
- 容器中的诊断与分析2——live diagnosis——perf
Linux下的内核测试工具——perf使用简介 系统级性能分析工具 — Perf linux perf - 性能测试和优化工具:示例&应用 从2.6.31内核开始,linux内核自带了一个性能 ...
- Java内存模型探秘
1.Java内存模型概述 Java内存模型是一种抽象概念,不是真实存在的.主要定义了程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存取出变量这样的底层细节.注意:这里的变量仅包括实例字段 ...
- 从Scratch到Python——Python生成二维码
# Python利用pyqrcode模块生成二维码 import pyqrcode import sys number = pyqrcode.create('从Scratch到Python--Pyth ...
- MySQL:(二)
多表查询-笛卡尔积 对于数据库中 针对于两张表的记录数的所有记录进行匹配,获得笛卡尔积!⚠️笛卡尔积结果是无效的,必须从笛卡尔积中选取有效的数据结果 !!! -- 显示结果就是笛卡尔积,两个表记录乘积 ...
- Xilinx Vivado的使用详细介绍(3):使用IP核
ilinx Vivado的使用详细介绍(3):使用IP核 Author:zhangxianhe IP核(IP Core) Vivado中有很多IP核可以直接使用,例如数学运算(乘法器.除法器.浮点运算 ...
- react初探(二)之父子组件通信、封装公共组件
一.前言 在组件方面react和Vue一样的,核心思想玩的就是组件,下面举两个组件常用的情景. 场景一:假如我们现在有一个页面包含表格以及多个弹框,这种时候如果将这个页面的业务代码写在一个组件中,那么 ...