1 static关键字
Q:什么是static关键字?
A:被static关键字修饰的不需要创建对象去调用,直接根据类名就可以去访问。
static一般用来修饰成员变量或函数。
1.1 修饰成员变量
被static修饰的成员变量叫做静态变量,也叫做类变量,说明这个变量是属于这个**类**的,而不是属于**对象**,没有被static修饰的成员变量叫做实例变量,说明这个变量是属于某个具体的对象的。
```java
public class Student {
public String name;
public static String sex;
public static void main(String[] args) {
Student student1 = new Student();
student1.name = "张三";
student1.sex = "男";
Student student2 = new Student();
student2.name = "李四";
student2.sex = "女";
// 获取的name不一样,因为name属性是普通的成员变量,属于对象,每个对象都有自己的name数据
System.out.println(student1.name); // 张三
System.out.println(student2.name); // 李四
// 获取的sex不一样,因为sex属性是static修饰的成员变量,属于类,所有的对象共用
System.out.println(student1.sex); // 女
System.out.println(student2.sex); // 女
// staitc修饰的成员变量可以直接通过【类名.属性名】获取
System.out.println(Student.sex); // 女
// 编译报错
System.out.println(Student.name);
}
}
```
心得:方便在没有创建对象的情况下来进行调用。通过代码结果也可以知道,被static修饰的成员变量,已经属于类,所有对象共用且所有结果只为最后被代替的数据。同时,static修饰过的属性和方法可以直接通过【类名.属性名】获取;没有static修饰的则要先获取该对象再进行调用获取值
原因:不被static修饰就需要在堆中new一个对象,相当于开辟了一块空间存放属性、方法和它们的值才能后续调用
1.2 修饰方法
static修饰方法的时候,可以直接通过类名来进行调用。与修饰成员变量规则一样
```java
public class Student {
public void study() {
System.out.println("好好学习!!");
}
public static void coding() {
System.out.println("摩擦键盘!!");
}
public static void main(String[] args) {
Student student = new Student();
// 对象可以正常调用static修饰的方法和非static修饰的方法
student.coding(); // 可以运行
student.study(); // 可以运行
// static修饰的方法还可以直接通过【类名.方法名】调用
Student.coding(); // 可以运行
Student.study(); // 编译报错
}
}
```
1.3 static关键字的使用注意事项
1.静态方法只能访问静态成员(静态成员包括静态成员变量和静态方法)
2.静态方法中不能使用this关键字和super关键字
```java
public class Student {
public String name;
public static String sex;
public void study() {
System.out.println(name + "好好学习!!");
System.out.println(sex);
}
public static void coding() {
System.out.println(sex); // 可以访问
System.out.println(name + "摩擦键盘!!"); // 编译报错
study(); // 编译报错(如果study方法改成static修饰,那就可以访问)
System.out.println(this); // 编译报错
}
}
```
1.4 静态代码块
1. static静态代码块只在类加载时执行一次,经常用于初始化资源。
2.静态代码块在main函数之前执行,这个main函数属于这个类(静态代码块在main函数之前执行的前提)
3.语法:
```java
class A {
// 静态代码块
static {
}
}
```
心得:不同位置使用静态代码块会产生不一样的结果,静态代码块属于这个类的情况下才会提前执行
2.final关键字
Q:final关键字是什么?
A:用于修饰类、变量以及成员方法
变量分为——**成员变量**局部变量**,他们在被final修饰时有不同的注意事项
2.1修饰变量
一般而言,被final修饰的都是常量,比如希望一个数据(G:重力加速度、Π等)全局都不变的情况下使用final来增加稳定性
注:常量一般采用大写的写法。例---G:重力加速度
2.2修饰成员(全局)变量
被final修饰的成员变量,一定要被赋值且只能被赋值一次,且必须是在这个成员变量所在的类对象创建之前被赋值。
```java
public class Student {
public String name;
public final int a = 10; // 必须赋初始值或者可以在构造函数赋初始值,否则会编译错误
}
```
```java
public class Student {
public String name;
public final int a; // 必须赋初始值或者可以在构造函数赋初始值,否则会编译错误
public Student() {
this.a = 10;
}
}
```
2.3修饰局部变量
被final修饰的变量,又被称为自定义常量。。所以,被final修饰的变量即自定义常量是不能被改变的(**只能被赋值一次,后续不能更改**)。
```java
final int a = 10;
a = 20; // 报错,final修饰的变量不能重新赋值
```
2.4修饰成员方法
当final关键字修饰了成员方法,则这个方法不能被重写,但是可以被继承。
2.5修饰类
3.封装
权限修饰符
修饰符 | 同一个类 | 同一个包 | 不同包子类 | 不同包非子类 |
public | 可以访问 | 可以访问 | 可以访问 | 可以访问 |
protected | 可以访问 | 可以访问 | 可以访问 | |
default | 可以访问 | 可以访问 | ||
private | 可以访问 |
4.单例模式
两种:
1.懒汉式单例:在多线程模式下,有可能会失效;但是节省内存占用
2.饿汉式单例:
多线程模式下,可以正常使用;有点占用内存空间
步骤:
1. 私有化构造函数
2. 定义一个类方法用于获取单例的对象
3. 在类中提供一个这个类类型的类属性(要用static修饰)
4. 在类方法中返回实例化对象
```java
/**
* 懒汉式单例(在多线程模式下,有可能会失效;但是节省内存占用)
*/
public class Singleton {
private static Singleton singleton;
private Singleton() {
}
public static Singleton getSingleton() {
if(singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
```
```java
/**
* 饿汉式单例(多线程模式下,可以正常使用;有点占用内存空间)
*/
public class Singleton2 {
private static Singleton2 singleton = new Singleton2();
private Singleton2() {
}
public static Singleton2 getSingleton() {
return singleton;
}
}
```