包及权限配置&java存储机理绘制
包及权限配置
包的声明和导入
//声明
package aa.bb.cc;
public class A{;}
class B{;}
//即在java输出目录aa.bb.cc中放入编译后的A.class和B.class文件
//使用其他包中的类的两种方式
//第一种:导入,import 包名.类名|接口名|*;
import aa.bb.cc.A;
//第二种:使用类的全名,即"包名.类名"
aa.bb.cc.A a =new aa.bb.cc.A();
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
注:
- 必须用声明(package)包的形式将类放入指定包中,必须用导入(import)包/类的形式使用包中的类
- 一个Java源文件只能声明一个包,且声明语句必须作为源文件的第一条指令
- 通常,功能相关密切的类、接口才能被放在同一包中
- 一个.java文件可包含多个import语句,但只能导入public权限的类或接口,一个.java文件只有一个public类,且该类名与文件名要相同
- 导入时不会导入子包,如要导入java.util包中的Scanner,用import java.*无法实现
从不同包中导入相同的类
从不同包中可以导入相同的类,但使用时必须用全名
//源文件一:A.java
package X;
public class A{
public int x;
}
//源文件二:A.java
package Y;
public class A{
public String s;
}
//源文件三:A.java
package Z;
//import X.A; import Y.A; //这种导入方式将产生编译错
import X.*; import Y.*; //正确
public class A{
int x;
public static void main(String[] args){
A a = new A(); a.x = 10; //正确,此A为Z包中的A
Z.A a1 = new Z.A(); a1.x = 10; //正确,此A为Z包中的A
X.A b = new Z.A(); b.x = 5; //正确,此A为X包中的A
Y.A c = new Z.A(); c.s = "abc"; //正确,此A为Y包中的A
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
静态导入
JDK1.5版新增静态导入,可导入类/接口中的所有或特定静态成员,格式如下:
- import static <包名>.类名.*;
- import static <包名>.类名.<成员名>;
导入成员后,可以不加类名,直接使用成员
//源文件:A.java
package X;
public class A{
public static int a;
public static void f(int x){ System.out.print(" x=" + x); }
public static void f(int x,int y){ System.out.print(" x=" + x + " y=" + y); }
}
//源文件:B.java
import static java.lang.Math.PI;
import static X.A.*;//在导入静态成员方法时,不能加参数,如import static X.A.f;
class B{
public static void main(String[] args){
f(1); f(2,3); a = 10;
System.out.print(" a=" + a + " PI=" + PI);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
访问权限
类的访问权限有两种:public和缺省
- 缺省:只能被该类所属包中的类访问,不能被其他包中的类访问
- public:访问不受包限制
类中成员的访问权限有四种:private、缺省、protected和public
- private:仅能被该类自己访问,其他任何类都不能访问该成员
- 缺省:只有包内的类才可访问
- protected:允许包中的类和包外的子类访问
- public:对访问无限制
修饰符 同一类 同一包 不同包的子类 所有类 public √ √ √ √ protected √ √ √ 缺省 √ √ private √ 无关系的两个类跨包访问只能访问其包中的public类的public成员
栗子:
假设某药企需要开发一个信息管理系统,其中药品价格涉及四种:成本价、出厂价、代理价、销售价,均由药厂的市场部决定。药品销售涉及直营店、代理商、普通药店三类客户。为安全起见,指定如下策略:
- 市场部可以控制上述四种价格;
- 厂家直营店只能看到出厂价、代理价和销售价;
- 代理商只能看到代理价和销售价;
- 普通药店只能看到销售价。
请设计一组包和市场部、直营店、代理商、普通药店等四个类,并完成类及其成员的权限配置。
package com.yq;
public class 市场部{
private double 成本价;
double 出厂价;
protected double 代理价;
public double 销售价;
}
package com.yq;
public class 直营店{;}//同包
package com.yq.dl;
public class 代理商 extends com.yq.市场部{;}//不同包的子类
//注:子类不一定要求在父包的子包中,只要包名不同即可
package com.yq.yd;
public class 普通药店{;}//不同包
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
java存储机理绘制规则
- 栈:存放函数中定义的所有变量
- 堆:存放所有创建出来的对象
- 方法区:存放类的定义
- 三者的联系:在函数中new出对象,对象的引用名在栈中,指向堆中创建出的对象,每个对象都附加一个指向其所属类型(即方法区)的指针
注:
- 栈从main函数开始创建
- 对象存于堆中,对象的引用存于栈中,即引用指向堆中创建的对象
- 栈空间的数据被系统自动管理,在函数调用时自动创建数据空间,在函数运行结束时自动释放数据空间
- 对象中的实例变量存于堆中,函数中的变量存于栈中
- 方法区中的静态变量直接赋值,实例变量只是声明,在创建对象后在堆中赋值
- 对象未赋值为null,int型为0,String型为""
- 如果是基本型直接填值,如果是引用型则通过指针指向一个对象
- 画图用实线虚线不讲究,书中用的是虚线
int[] a = new int[5];//显式调用new操作,其中a存于栈空间,a引用的对象存于堆空间
int[] b = {1,2,3,4};//隐式调用new操作,其中b存于栈空间,b引用的对象存于堆空间
String s = "abc";//隐式调用new操作,其中s存于栈空间,"abc"存于堆空间
- 1
- 2
- 3
栗子:
class T{
static int x;
String[][] s;
T(int a){x = a;}
T(){s = new String[][]{new String[3],{"aaa","bbb"}};}
}
- 1
- 2
- 3
- 4
- 5
- 6
依次执行下列两条语句:T a=new T(5); T b=new T();请画出相关数据在栈、堆、方法区中的内存示意图

原文章:https://blog.csdn.net/qq_46469137/article/details/112151722
包及权限配置&java存储机理绘制的更多相关文章
- Win10配置Java环境变量
很多同学在学习Java入门的时候被Java环境变量搞的一头雾水,今天这篇文章拓薪教育就来说一下如何在win10下配置环境变量; 下载jdk安装包: 首先我们需要下载jdk的安装包,这里提供jdk的安装 ...
- R语言rJava包安装载入及JAVA环境配置
rJava 包的安装与载入 一般文本分词的教程都会贴出: install.packages("rJava") library(rJava) 来引导我们装载rJava包,运行inst ...
- Mac 配置java版本 ---- MySql数据库权限设置 --- openfire
java -version 显示java 版本 sudo su - root 切换身份 cd /usr/local/openfire 进入openfire目录 cd bin/ 进入 bin vim o ...
- Jetty集群配置Session存储到MySQL、MongoDB
在Web开发中,Session表示HTTP服务器与客户端(例如浏览器)的“会话”,每个客户端会有其对应的Session保存在服务器端,通常用来保存和客户端关联的一些信息,例如是否登录.购物车等. Se ...
- Jetty容器集群配置Session存储到MySQL、MongoDB
在Web开发中,Session表示HTTP服务器与客户端(例如浏览器)的"会话",每个客户端会有其对应的Session保存在服务器端,通常用来保存和客户端关联的一些信息,例如是否登 ...
- Linux配置mysql (centos配置java环境 mysql配置篇 总结四)
♣安装的几种方法和比较 ♣配置yum源 ♣安装mysql ♣启动mysql ♣修改密码 ♣导入.sql文件 ♣缓存设置 ♣允许远程登录(navicat) ♣配置编码为utf8 1.关于Linux系统 ...
- Linux配置tomcat (centos配置java环境 tomcat配置篇 总结三)
♣下载安装tomcat7 ♣设置启动和关闭 ♣设置用户名和密码 ♣发布java web项目 声明:这篇教程是建立在前两篇教程的基础上的,所以,还没安装工具和jdk,可以先看这个系列的前面两篇(去到文末 ...
- centos上安装配置java WEB环境_java(转)
趁着十一期间,好好的写写随笔来记录自己所学.所践和所得,不足之处,欢迎各位拍砖~~~ 工具:Xftp 5.Xshell 5 一.安装jdk 1. 使用Xftp 5把jdk-8u65-linux-x64 ...
- svn数据仓库配置,权限配置
svn服务的开启有两种方式, · 自带的svnserve服务(访问地址类似于svn://192.168.80.18/repos/) · 与Apache配合使用 (访问地址 ...
随机推荐
- hdu1556 线段树段更新(简单题)
题意: N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的"小飞鸽"牌电动车从气球a开始到气球b依次给每个 ...
- Python中对序列数据的汇总(collections模块)
目录 Counter most_common 对于序列如字符串str.列表list和tuple可以统计里面数据出现的次数.我们使用的是 collections 模块. collections模块的常用 ...
- POJ2349二分+并查集,类似最小树的贪心
题意: 给你n个点,你的任务是构建一颗通讯树,然后给你一个s表示可以选出来s个点两两通讯不花钱,就是费用是0,其他的费用就是两点的距离,有个要求就是其他的费用中最大的那个最小. 思路: ...
- 手机访问电脑本地localhost网页
项目需要用手机访问电脑本地网页,从而可以调试项目,对代码的理解的快一点 重点 确保手机和电脑在同一个局域网 可以通过手机开热点电脑连接或者电脑开便携式热点手机连接 确保电脑的防火墙是关闭的 打开apa ...
- Mybatis学习之自定义持久层框架(四) 自定义持久层框架:生产sqlSession
前言 上一回我们完成了数据库配置文件的读取和解析工作,有了这些准备工作,我们就可以与数据库创建连接和会话了,所谓sqlSession就是数据库的会话,一切增删查改操作都是在与数据库的会话中完成,下面我 ...
- C#读写内置类型的数据时是否原子操作
Reads and writes of the following data types are atomic: bool, char, byte, sbyte, short, ushort, uin ...
- 【技术博客】基于vue的前端快速开发(工具篇)
一.Vue教程 vue.js是一套构建用户界面的渐进式框架.vue采用自底向上增量开发的设计.vue的核心库只关心视图层,非常容易学习,非常容易与其它库和已有项目整合.vue完全有能力驱动采用单文件组 ...
- 并查集板子+kruskal
最近在学最小生成树得时候又用到了并查集,一起来整理一下 1.并查集 并查集就是字面意思,将两个单独得集合合并成一个大的集合. 并查集关键在于两个操作:合并和查找 先要完成查找操作(合并操作在查找的基础 ...
- copy和deep.copy
https://blog.csdn.net/qq_32907349/article/details/52190796 加上crossin公众号上的可变对象与不可变对象 a=[1,2,3,[4]] b= ...
- .Net Core·热加载的实现及测试
阅文时长 | 0.25分钟 字数统计 | 460字符 主要内容 | 1.引言&背景 2.解决原理&方法 3.声明与参考资料 『.Net Core·热加载的实现及测试』 编写人 | SC ...