Java进阶的第二天大集合
final关键字
- 概述:Java提供了
final
关键字,用于修饰不可改变内容。 - final:
- 类:被修饰的类,不能被继承
- 方法:被修饰的方法,不能被重写
- 变量:被修饰的变量,不能被重新赋值
final的使用方法
- 修饰类:
final class 类名 {
}
- 修饰方法:
修饰符 final 返回值类型 方法名(参数列表){
//方法体
}
-
修饰变量
- 局部变量—基本数据类型
public class FinalDemo1 { public static void main(String[] args) { // 声明变量,使用final修饰 final int a; // 第一次赋值 a = 10; // 第二次赋值 a = 20; // 报错,不可重新赋值 } }
- 局部变量—引用类型
public class FinalDemo2 { public static void main(String[] args) { // 创建 User 对象 final User u = new User(); // 创建 另一个 User对象 // u = new User(); // 报错,指向了新的对象,地址值改变。 // 调用setName方法 u.setName("张三"); // 可以修改 } }
说明:引用类型的局部变量,被final修饰后,只能指向一个对象,地址不能再更改。但是不影响对象内部的成员变量值的修改
-
成员变量:
显示初始化:
public class User { final String USERNAME = "张三"; private int age; }
- 构造方法初始化:
public class User { final String USERNAME ; private int age; public User(String username, int age) { this.USERNAME = username; this.age = age; } }
-
小结:final修饰类,则类不能被继承。final修饰方法,则方法不能被重写。final修饰变量,变量不能被该值
static关键字
- 概述:static是静态修饰符,一般修饰成员。被static修饰的成员属于类,不属于这个类的某个对象。static修饰的成员被多个对象共享。static修饰的成员属于类,但是会影响每一个对象。被static修饰的成员又叫类成员,不叫对象的成员。
- 类变量:
- 使用 static关键字修饰的成员变量。
定义格式:
static 数据类型 变量名;
- 静态方法:
- 类方法:使用 static关键字修饰的成员方法,习惯称为静态方法。
修饰符 static 返回值类型 方法名 (参数列表){
// 执行语句
}
静态方法调用的注意事项:
- 静态方法可以直接访问类变量和静态方法。
- 静态方法不能直接访问非静态成员变量或成员方法。非静态成员方法可以直接访问类变量或静态方法。主要是因为先加载类到方法区,直接使用类名调用静态方法了,而此时还没有对象,而非静态方法必须有对象才可以运行。所以静态方法中不能使用非静态成员。但是非静态方法可以使用静态成员,因为对象已经有了,说明类肯定存在了(先有类后有对象)
- 静态方法中,不能使用this关键字
- 调用格式:
// 访问类变量
类名.类变量名;
// 调用静态方法
类名.静态方法名(参数);
枚举
- 枚举的概念:枚举是一种特殊类。枚举是有固定实例个数的类型,我们可以把枚举理解成有固定个数实例的多例模式。
enum 枚举名 {
第一行都是罗列枚举实例,这些枚举实例直接写大写名字即可。
}
枚举的补充
public enum Sex {
BOY("柳岩"), GIRL(18);
public int age;
public String name;
private Sex(int age) {
System.out.println("有参构造"+age);
this.age = age;
}
private Sex() {
System.out.println("无参构造");
}
private Sex(String name) {
System.out.println("有参构造"+name);
this.name = name;
}
public void showAge() {
System.out.println("年龄是: " + age);
}
public void showName() {
System.out.println("姓名是: " + name);
}
}
public class Demo03 {
public static void main(String[] args) {
//Person p1 = new Person("张三", Sex.BOY);
// Person p2 = new Person("张三", Sex.GIRL);
//使用枚举类型获取枚举类型中的元素即对象
Sex b = Sex.BOY;
b.showName();
Sex g = Sex.GIRL;
g.showAge();
}
}
运行结果:
有参构造柳岩
有参构造18
姓名是: 柳岩
年龄是: 18
说明:枚举的本质是一个类,所以枚举中还可以有成员变量,成员方法等。
1)枚举的属性上面不能书写任何代码,如果属性下面有代码,需要使用分号结束属性的编写
2)只要我们使用枚举类型,那么属性属于静态的,并且给属性赋值,会创建对象,执行无参构造方法
3)如果想执行有参构造,可以给属性后面添加小括号,并赋值实际参数
4)枚举中的构造函数必须是私有的
- 枚举的小结:
- 枚举类在第一行罗列若干个枚举对象,是常量。(多例)
- 枚举是不能在外部创建对象的,枚举的构造方法默认是私有的。
- 枚举通常用于做信息的标志和分类。