【JAVA】笔记(3)---封装;如何选择声明静态变量还是实例变量;如何选择声明静态方法还是实例方法;静态代码块与实例代码块的执行顺序与用途;
封装:
1.目的:保证对象中的实例变量无法随意修改/访问,只能通过我们自己设定的入口,出口(set / get)来间接操作;屏蔽类中复杂的结构,使我们程序员在主方法中关联对象写代码时,思路/代码格式更加清晰;
2.操作:将某些属性私有化(private修饰),再声明相应的 set ,get 方法,这样我们就可以通过 set / get 方法来 修改 / 访问 相应的私有属性了;
嘴上说不如举栗子:
class tool{
private int a;
private String b;
private String c;
public tool() {
}
public tool(int a, String b, String c) {
this.a = a;
this.b = b;
this.c = c;
}
public int getA() {
return a;
}
public void setA(int a) {
this.a = a;
}
public String getB() {
return b;
}
public void setB(String b) {
this.b = b;
}
public String getC() {
return c;
}
public void setC(String c) {
this.c = c;
}
}
public class pra{
public static void main(String[] args) {
tool t1=new tool();
//创建tool类型引用t1,并调用无参构造方法为t1在堆内存指向的对象中的三个实例变量赋初始值
System.out.println(t1.getA()+t1.getB()+t1.getC()+"---第一次输出结果");
//利用get方法访问对象中的三个私有属性
t1.setA(100);
t1.setB("是");
t1.setC("100");
//利用set方法修改对象中的三个私有属性
System.out.println(t1.getA()+t1.getB()+t1.getC()+"---第二次输出结果");
tool t2=new tool(100,"是","100");
//创建tool类型引用t2,并调用有参构造方法为t2在堆内存指向的对象中的三个实例变量赋值
System.out.println(t1.getA()+t1.getB()+t1.getC()+"---第三次输出结果");
}
}
输出结果:
0nullnull---第一次输出结果
100是100---第二次输出结果
100是100---第三次输出结果
Process finished with exit code 0
静态变量的使用(static):
1.什么时候选择声明静态变量:
对于同一类型的所有对象来说,一直不变的属性就声明为静态变量,就 类 中国人 来说,它其中的国籍属性除了中国,还能是什么?所以当一个类型的对象中的一个属性始终不变,或者说对于所有同类型的对象来说,此变量中储存的数据 都应该是一样的,这个时候我们就选择声明静态变量;
2.为什么要在符合条件的前提下,尽量使用静态变量:
还拿100个中国人举例子吧,如果我们把国籍声明为实例变量,那么我们创建 n 个中国人对象,就要在堆内存中占用 n 块大小相同的空间来储存同样的数据 “ 中国 ”,在可以达到相同的效果的前提下,选择占用内存大的代码是程序员的大忌!而如果我们将国籍声明为静态变量,那么我们无论创建多少个中国人对象,都只会在方法区内存中占用一块固定大小的内存空间来储存“ 中国 ”,以此来节省内存,因为静态变量不像实例变量那样属于“对象级别的变量”,它属于类级别的变量,所以无论对象是否创建,都不影响用“ 类名 . ”的方式来访问它。
辅助理解内存图:

实例方法 / 静态方法 的选择:
easy,在已经知道什么时候声明实例变量什么时候声明静态变量的前提下,方法体中需要实例变量的方法就声明为实例方法,反之方法体中不需要访问实例变量的方法就声明为静态方法;
代码块:
1.用途:代码块分为静态代码块和实例代码块,静态代码块执行时机---类加载时(优先于类体中的所有代码);动态代码块执行时机---调用构造方法时(优先于方法体中的所有代码),并且静态代码块优先于实例代码块。所以我们可以通过输出结果来判断---什么时候哪个类体执行了 / 什么时候某个构造方法执行了;
2.格式及优先级顺序展示:
public class pra{
static {
System.out.println("静态代码块 a 执行了!");
}
{
System.out.println("实例代码块 a 执行了!");
}
public static void main(String[] args) {
pra t1=new pra();
}
public pra(){
System.out.println("无参构造方法 执行了!");
}
static {
System.out.println("静态代码块 b 执行了!");
}
{
System.out.println("实例代码块 b 执行了!");
}
}
运行结果1(将创建 pra 对象代码注释掉)与运行结果2(取消注释,还原为代码):
静态代码块 a 执行了!
静态代码块 b 执行了!
Process finished with exit code 0 (结果一)
静态代码块 a 执行了!
静态代码块 b 执行了!
实例代码块 a 执行了!
实例代码块 b 执行了!
无参构造方法 执行了!
Process finished with exit code 0 (结果二)
随笔:
1. public :啥都能访问 ;private 只有在声明它的类中可以访问 ;
2.空指针异常问题:这个问题我感觉没什么好说的,“ 引用 ”是一个储存对象地址的变量,如果它里面什么地址也没存(null),那在使用它时,就会出现空指针异常;
由于博主目前还没有将 Java-SE 的知识都学完,所以有些地方可能说的有些片面,若前辈们能够指点一二就更好了 (~ ̄(OO) ̄)ブ
【JAVA】笔记(3)---封装;如何选择声明静态变量还是实例变量;如何选择声明静态方法还是实例方法;静态代码块与实例代码块的执行顺序与用途;的更多相关文章
- Java的初始化块、静态初始化块、构造函数的执行顺序及用途探究
Java与C++有一个不同之处在于,Java不但有构造函数,还有一个”初始化块“(Initialization Block)的概念.下面探究一下它的执行顺序与可能的用途. 执行顺序 首先定义A, B, ...
- 静态(static)代码块、构造代码块、构造函数、父类子类执行顺序
静态代码块:static修饰的代码块. 在类加载-初始化的时候进行,主要目的是给变量赋予初始值 构造代码块:直接在类中定义且没有加static关键字的代码块称为构造代码块. java会把构造代码块放到 ...
- Java类成员变量、普通成员变量、初始化块、构造方法的初始化和执行顺序
结论:执行的大致顺序如下, (1) 在一个不存在继承的类中:初始化static变量,执行static初始化块-->初始化普通成员变量(如果有赋值语句),执行普通初始化块-->构造方法 (2 ...
- JAVA代码中加了Try...Catch的执行顺序
public static String getString(){ try { //return "a" + 1/0; return "a"; } catch ...
- java 子类、父类中静态代码块、字段,非静态代码块、字段以及构造函数的初始化顺序和次数
一个类中的数据初始化顺序是面试官非常喜欢出的面试题之一,本文用一个实例来介绍java中子类.父类中静态代码块.字段,非静态代码块.字段以及构造函数的执行顺序和次数. 一.包结构
- 【转】java静态代码块和构造方法执行顺序
先看看下面几个类,然后判断它们的输出public class A { static{System.out.print(1);}public A(){System.out.print(2);}} pub ...
- Java学习笔记 - 类方法与代码块的执行顺序
类的初始化顺序 使用一个简单的父子类例子来做示范,代码执行顺序在代码后有标注. class Parent { public static String p_StaticField = "父类 ...
- Java Object 构造方法的执行顺序
Java Object 构造方法的执行顺序 @author ixenos 为了使用类而做的准备工作包括三个步骤 1)加载:类加载器查找字节码(一般在classpath中找),从字节码创建一个Class ...
- Java内存的 静态方法和实例方法的区别及使用场景
注意:变量指基本数据类型非对象,局部变量不能被静态修饰 1.(静态)成员变量存放在data segment区(数据区),字符串常量也存放在该区 2.非静态变量,new出来的对象存放在堆内存,所有局部变 ...
随机推荐
- Windows下nginx报错解决:CreateFile() "xxx/logs/nginx.pid" failed
写在前面 本文给出Windows下nginx报错:CreateFile() "xxx/logs/nginx.pid" failed 的解决方法并分析了出错原因,其中 xxx 表示n ...
- WPF进阶技巧和实战04-资源
资源集合 每个元素都有Resources属性,该属性存储了一个资源字典集合(它是ResourceDictionary类的实例).资源集合可以包含任意类型的对象,并根据字符串编写索引. 每个元素既可以访 ...
- 100台机器上海量IP如何查找出现频率 Top 100?
场景题 有 100 机器,每个机器的磁盘特别大,磁盘大小为 1T,但是内存大小只有 4G,现在每台机器上都产生了很多 ip 日志文件,每个文件假设有50G,那么如果计算出这 100 太机器上访问量最多 ...
- 2020 年国内 Serverless 用户规模:阿里云占比第一,达 66%
在中国信息通信研究院重磅发布的国内首个<云原生用户调查报告>中,阿里云 Serverless 产品凭借在双十一的技术锤炼和丰富的应用实践,在国内 Serverless 用户规模的占比达到 ...
- Vue3学习(六)之使用Vue3进行数据绑定及显示列表数据
一.写在前面 说来还是比较惭愧的,从周二开始事就比较多,周三还电脑坏了,然后修电脑等等一些杂事,忙的团团转,因为周二.周三自己走的过多了,导致不敢直腰,周四卧床一天. 之前都听说<陈情令> ...
- Vue el 使用el-checkbox-group复选框进行单选框操作
el-checkbox-group这个组件与其他复选框不一样,我当初也是半天不知道怎么操作 页面使用v-model绑定 size就是等比例缩小放大,v-ror循环应该看的懂.重要的是@chage到我们 ...
- seata代码控制回滚和临时挂起分布式事物
seata代码控制回滚和临时挂起分布式事物 一.说明 二.功能实现 1.手动回滚分布式事物 2.临时挂起分布式事物 三.完整代码 四 参考链接 一.说明 此处只是简单的记录一下,使用了 Seata后, ...
- docker run 的基本用法
docker run 命令用来创建并启动一个容器 语法:docker run [options] image [command] [args-] 示例:docker run -dit -v 别名:容器 ...
- Noip模拟59 2021.9.22
新机房首模拟变倒数 T1 柱状图 关于每一个点可以做出两条斜率分别为$1,-1$的直线, 然后题意转化为移动最少的步数使得所有点都在某一个点的两条直线上 二分出直线的高度,判断条件是尽量让这条直线上部 ...
- Noip模拟40 2021.8.15
T1 送花 按照题解意思说是扫描线题,但我觉得像一个线段树优化$dp$ 主要思想一样,就是暴力枚举右端点,同时维护左端点的最值, 考虑两种情况, 如果左端点在$r$扫到的数$i$上一次出现的位置之前, ...