1.1代码块
1.1.1静态代码块
静态代码块:
必须有static修饰,必须放在类下面,与类一下加载。
格式:
static{
// 执行代码
}
特点:
-
每次执行类,加载类的时候都会先执行静态代码块一次。
-
静态代码块是自动触发执行的,只要程序启动静态代码块就会先执行一次。
-
作用:在启动程序之前可以做资源的初始化,一般用于初始化静态资源。
代码演示:
public class DaimaKuaiDemo01 {
public static String sc_name ;
// 1.静态代码块
static {
// 初始化静态资源
sc_name = "我是帅哥!";
System.out.println("静态代码块执行!");
}
public static void main(String[] args) {
System.out.println("main方法执行");
System.out.println(sc_name);
}
}
输入结果:
静态代码块执行!
main方法执行
我是帅哥!
2.1.1实例代码块
实例代码块 :
没有static修饰,必须放在类下。与对象初始化一起加载。
格式
{
// 执行代码
}
特点:
-
无static修饰。属于对象,与对象的创建一起执行的。
-
每次调用构造器初始化对象,实例代码块都要自动触发执行一次。
-
实例代码块实际上是提取到每一个构造器中去执行的。
-
作用:实例代码块用于初始化对象的资源。
代码演示:
public class DaimaKuaiDemo02 {
private String name ;
// 实例代码块。 无static修饰。
{
System.out.println("实例代码块执行");
name = "dl";
}
// 构造器
public DaimaKuaiDemo02(){
//System.out.println("实例代码块执行");
}
// 有参数构造器
public DaimaKuaiDemo02(String name){
//System.out.println("实例代码块执行");
}
public static void main(String[] args) {
// 匿名对象,创建出来没有给变量。
new DaimaKuaiDemo02();
new DaimaKuaiDemo02();
new DaimaKuaiDemo02("xulei");
}
}
// 输出结果:
实例代码块执行
实例代码块执行
实例代码块执行
1.2 final关键字
final:
不可改变,最终的含义。可以用于修饰类、方法和变量。
-
类:被修饰的类,不能被继承。
-
方法:被修饰的方法,不能被重写。
-
变量:被修饰的变量,有且仅能被赋值一次。
修饰类格式:
final class 类名 {
}
final class Fu {
}
// class Zi extends Fu {} // 报错,不能继承final的类
修饰方法格式:
修饰符 final 返回值类型 方法名(参数列表){
//方法体
}
class Fu2 {
final public void show1() {
System.out.println("Fu2 show1");
}
public void show2() {
System.out.println("Fu2 show2");
}
}
class Zi2 extends Fu2 {
// 不能被重写
// @Override
// public void show1() {
// System.out.println("Zi2 show1");
// }
@Override
public void show2() {
System.out.println("Zi2 show2");
}
}
修饰变量——局部变量局部变量
public class FinalDemo1 {
public static void main(String[] args) {
// 声明变量,使用final修饰
final int a;
// 第一次赋值
a = 10;
// 第二次赋值
a = 20; // 报错,不可重新赋值
// 声明变量,直接赋值,使用final修饰
final int b = 10;
// 第二次赋值
b = 20; // 报错,不可重新赋值
}
}
修饰变量-实例成员变量
//显示初始化(在定义成员变量的时候立马赋值);
public class Student {
final int num = 10;
}
//构造器初始化(在构造器中赋值一次)。
//注意:每个构造器中都要赋值一次!
public class Student {
final int num = 10;
final int num2;
public Student() {
this.num2 = 20;
// this.num2 = 20;
}
public Student(String name) {
this.num2 = 20;
// this.num2 = 20;
}
}
1.3 枚举
不使用枚举存在的问题
假设我们要定义一个人类,人类中包含姓名和性别。通常会将性别定义成字符串类型,效果如下:
public class Person {
private String name;
private String sex;
public Person() {
}
public Person(String name, String sex) {
this.name = name;
this.sex = sex;
}
// 省略get/set/toString方法
}
public class Demo01 {
public static void main(String[] args) {
Person p1 = new Person("张三", "男");
Person p2 = new Person("张三", "abc"); // 因为性别是字符串,所以我们可以传入任意字符串
}
}
不使用枚举存在的问题:可以给性别传入任意的字符串,导致性别是非法的数据,不安全。
枚举的概念:
枚举是一种特殊类。枚举是有固定实例个数的类型,我们可以把枚举理解成有固定个数实例的多例模式。
定义枚举的格式:
enum 枚举名 {
第一行都是罗列枚举实例,这些枚举实例直接写大写名字即可。
}
入门案例:
定义枚举:BOY表示男,GIRL表示女
enum Sex {
BOY, GIRL; // 男,女
}
Perosn中的性别有String类型改为Sex枚举类型
public class Person {
private String name;
private Sex sex;
public Person() {
}
public Person(String name, Sex sex) {
this.name = name;
this.sex = sex;
}
// 省略get/set/toString方法
}
使用是只能传入枚举中的固定值
public class Demo02 {
public static void main(String[] args) {
Person p1 = new Person("张三", Sex.BOY);
Person p2 = new Person("张三", Sex.GIRL);
Person p3 = new Person("张三", "abc");
}
}
枚举的本质是一个类,我们刚才定义的Sex枚举最终效果如下:
enum Sex {
BOY, GIRL; // 男,女
}
// 枚举的本质是一个类,我们刚才定义的Sex枚举相当于下面的类
final class SEX extends java.lang.Enum<SEX> {
public static final SEX BOY = new SEX();
public static final SEX GIRL = new SEX();
public static SEX[] values();
public static SEX valueOf(java.lang.String);
static {};
}
枚举的本质是一个类,所以枚举中还可以有成员变量,成员方法等。
public enum Sex {
BOY(18), GIRL(16);
public int age;
Sex(int age) {
this.age = age;
}
public void showAge() {
System.out.println("年龄是: " + age);
}
}
public class Demo03 {
public static void main(String[] args) {
Person p1 = new Person("张三", Sex.BOY);
Person p2 = new Person("张三", Sex.GIRL);
Sex.BOY.showAge();
Sex.GIRL.showAge();
}
}
枚举的应用
枚举表示性别:
public enum Sex {
MAIL, FEMAIL;
}
枚举表示方向:
public enum Orientation {
UP, RIGHT, DOWN, LEFT;
}
枚举表示季度:
public enum Season {
SPRING, SUMMER, AUTUMN, WINTER;
}
总结:
-
枚举类在第一行罗列若干个枚举对象。(多例)
-
第一行都是常量,存储的是枚举类的对象。
-
枚举是不能在外部创建对象的,枚举的构造器默认是私有的。
-
枚举通常用于做信息的标志和分类。