static关键字、final关键字、封装、单例模式的学习

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 {
        
    }
}
```

心得:不同位置使用静态代码块会产生不一样的结果,静态代码块属于这个类的情况下才会提前执行 

运行结果:213

运行结果:123

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;
	}
}
```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值