目录
前言
在Java初阶之代码块与封装学习中,我通过总结以及查阅资料,对以下问题有了更深一层的理解。
- 什么是代码块?
- 代码块分为哪几种?
- 这些代码块有什么样的执行顺序?
- 封装的特性是什么?
- 封装如何实现?
如果你在Java初阶之代码块与封装的学习中,也想对这些问题有一个更深的了解,请阅读这篇文章,或许会对你有所启发。
一、代码块
直接使用{}括起来的代码就称之为代码块,在Java中,根据代码块出现的位置以及关键字的不同,又分为以下四种代码块。
1.普通代码块
在成员变量或者静态变量方法中直接使用{}括起来的代码块称之为普通代码块。
代码展示:
public class Test{
public static void main(String[] args) {
int a=10;
System.out.println(a);
{
a++;
System.out.println(a);
}
}
}
普通代码块中定义的局部变量,作用域就是当前普通块,出了这个{}就会被销毁 ,程序便会报错。
代码展示:
{
int a=10;
System.out.println(a);
}
a++;
System.out.println(a);
2.构造块
在类中,不加任何关键字,直接使用{},称之为构造块,无论是构造方法还是构造块,都是为了类中成员属性初始化的,都是为了对象服务的,构造块优先于构造方法执行,每当产生该类对象时,就会调用一次构造块,其实编译之后的class文件,会将所有的构造块和构造方法融为一体,构造块的代码写在原构造方法的代码上部。
原代码展示:
public class Test{
int age;
String name;
public Test(int age,String name){
System.out.println("类中的构造方法");
this.age=age;
this.name=name;
}
{
System.out.println("类中的构造方法");
age=20;
name="红豆";
}
public static void main(String[] args) {
Test t1=new Test(20,"相思");
System.out.println();
}
}
编译之后的代码展示:
public class Test{
int age;
String name;
public Test(int age,String name){
System.out.println("类中的构造方法");
age=20;
name="红豆";
System.out.println("类中的构造方法");
this.age=age;
this.name=name;
}
public static void main(String[] args) {
Test t1=new Test(20,"相思");
System.out.println();
}
}
3.静态块
直接定义在类中,使用关键字static修饰的代码块,称之为静态块,看见static我们首先想到的便是与对象无关,静态代码块在类加载时执行,无论有多少对象产生,都只会执行一次,优先于构造块和构造方法,在类中的静态块优先于主方法执行,这是因为主方法套在主类中,要调用主方法,首先得加载主类,一加载主类,静态代码块就会执行,上述讲到的构造块和构造方法是为了类中成员属性初始化,而现在讲到的静态块是为了类中的静态变量初始化以及输出一些类加载信息,比如Spring loc容器,当类加载时输出类的信息,哪些类被加载一目了然。
4.同步代码块
定义在方法中,使用关键字sychronized修饰的代码块,称之为同步代码块,我们在EE初阶的多线程部分进行讲解。
二、封装
1.封装的特性
面向对象编程有三大特性,分别是封装,继承和多态。其中封装体现了代码的保护性和易用性,当我们在设计银行卡这个类时,保护性便是指银行卡的账号和密码这两个属性,若我们依旧用public来定义这两个属性,在银行卡这个类的外部,只要能拿到某个银行卡的对象,我们就可以任意操作其属性,相当于这个银行卡的密码,余额等信息便透明了,任何人都可以使用,不符合常理,所以我们会有所知,类中的某些属性,不能在类的外部随意使用,因此类中需要将敏感数据隐藏起来,要想在类的外部去使用这些属性,必须通过类中提供的方法来使用,这样就可以限制密码,余额这些属性的使用了。
2.封装的实现
使用private关键字实现属性的封装,private关键字修饰的内容,仅限当前类的内部可见,在类中,当属性被private修饰之后,该属性只在当前类的内部可见,出了这个类,会对其他类进行隐藏。除此,private也可以用来修饰方法。
代码展示:
public class Card {
// 卡号
private int cardNum;
// 密码
private String password;
// 余额
private double banlance;
// 申请银行卡的那一刻
public Card(int cardNum, String password) {
this.cardNum = cardNum;
this.password = password;
}
}
其中,cardNum,password,banlance这三个属性只在Card这个类中的{}内部可见,出了Card类,外部根本无法使用。
报错展示:
若是我们想在Card类的外部使用这三个属性,又该如何操作呢,其实只需要对外提供两类方法getter和setter,getter是用来获取某些属性值,setter是用来修改属性值,至于哪些属性用到getter,哪些属性用到setter,就要根据具体的场景来对待,类设计时只知道哪些属性用来读取,哪些属性可以修改,哪些属性彻底对外隐藏。getter和setter命名规范,都是以get和set单词开头+要操作的属性名称。
代码展示:
总结
以上就是今天所讲内容,希望大家都能在代码的练习中熟练掌握本篇内容!