文章目录
- 一、static
* - (1) static 修饰成员变量
- (2) static 修饰成员方法
- 二、静态导入
* - (1) 静态导入概念
- (2) 静态导入使用场景
- 三、如何给实例变量设置初始值
- 四、如何给类变量设置初始值
- 五、继承中出现(静态)初始化块 ☆
- 六、单例模式
一、static
☘️ static
可用来修饰 类的成员:成员变量、方法、嵌套类
public class Person {
private static int age;
public static void eat() {
}
static class Head {
}
}
(1) static 修饰成员变量
☘️ 被 static
修饰的成员变量可叫做:类变量、静态变量、静态字段
☘️ 类变量在程序运行过程中只占用一份固定的内存(存储在 方法区)
☘️ 可通过 类名访问
☘️ 可通过 引用变量名访问(不推荐)
类名或引用变量名访问静态变量:
public class VisitStaticField {
public static void main(String[] args) {
System.out.println("Book.bookNum = " + Book.bookNum);
Book.bookNum = 11;
Book book = new Book();
System.out.println("book.bookNum = " + book.bookNum);
}
}
class Book {
public static int bookNum = 1;
}
统计 Person 对象的个数:
public class CountPersonObjectNum {
public static void main(String[] args) {
Person p = new Person();
Person pp = new Person();
Person ppp = new Person();
Person pppp = new Person();
Person ppppp = new Person();
Person pppppp = new Person();
Person ppppppp = new Person();
System.out.println("当前 Person 对象个数:" + Person.personObjNum);
}
}
class Person {
public static int personObjNum = 0;
public Person() {
personObjNum++;
}
}
☘️ 没有被 static
修饰的成员变量可叫做:实例变量
☘️ 实例变量在每个实例内部都有一份内存(存储在 堆空间)
☘️ 只能通过 引用变量名访问
(2) static 修饰成员方法
☘️ 被 static
修饰的成员方法可叫做:类方法、静态方法
☘️ 类方法可通过 类名调用
☘️ 类方法可通过 引用变量名调用
通过类名或对象名调用类方法:
public class TestDemo {
public static void main(String[] args) {
String randStr1 = GqUtil.obtainRandomStr();
GqUtil util = new GqUtil();
String randStr2 = util.obtainRandomStr();
System.out.println("randStr1 = " + randStr1);
System.out.println("randStr2 = " + randStr2);
}
}
class GqUtil {
public static String obtainRandomStr() {
return UUID.randomUUID().toString().replace("-", "");
}
}
☘️ 类方法内部坚决不能使用 this
✏️
this
:
① 与实例挂钩
② 是一个隐藏的、位置最靠前的方法参数
③ 是当前对象(实例)的引用
④ 类变量、类方法可通过 类名访问或调用,与实例没有瓜葛
☘️ 类方法中可直接访问类变量和调用其他类方法
☘️ 类方法中不可以直接访问实例变量,不可以直接调用实例方法
public class TestDemo {
public static void main(String[] args) {
String randStr1 = GqUtil.getRandString();
GqUtil util = new GqUtil();
String randStr2 = util.getRandString();
System.out.println("randStr1 = " + randStr1);
System.out.println("randStr2 = " + randStr2);
}
}
class GqUtil {
public static int count = 6;
public String name = "庆医";
public static String getRandString() {
System.out.println("count = " + count);
GqUtil util = new GqUtil();
System.out.println("name = " + util.name);
util.test2();
test1();
return UUID.randomUUID().toString().replace("-", "");
}
public static void test1() {
System.out.println("类方法 test1()");
}
public void test2() {
System.out.println("实例方法 test2()");
}
}
☘️ 没有被 static
修饰的方法叫做 实例方法(只能通过对象名去调用)
☘️ 只能通过对象名去调用
☘️ 内部可以使用 this
☘️ 可直接访问实例变量、实例方法
☘️ 可直接访问或调用类变量、类方法(类变量、类方法可通过对象名进行访问或调用)
二、静态导入
(1) 静态导入概念
☘️ 使用了 静态导入后,就可以省略类名访问 静态成员(成员变量、方法、嵌套类)
public class TestClass {
public static int age = 1;
public static void show() {
System.out.println("age is " + age);
}
public static class Other {
public void other() {
System.out.println("Other_other()");
}
}
}
public class TestDemo {
public static void main(String[] args) {
System.out.println(TestClass.age);
TestClass.show();
TestClass.Other other = new TestClass.Other();
other.other();
}
}
静态导入后访问静态成员:
import static com.gq.TestClass.*;
public class TestDemo {
public static void main(String[] args) {
System.out.println(age);
show();
Other other = new Other();
other.other();
}
}
(2) 静态导入使用场景
import static java.lang.Math.PI;
public class TestDemo {
public static void main(String[] args) {
System.out.println(2 * PI * 10);
System.out.println(2 * PI * 20);
}
}
三、如何给实例变量设置初始值
☘️ 声明的时候就赋值
☘️ 构造方法的时候赋值
☘️ 在 初始化代码块中赋值
✏️ 编译器会将初始化代码块中的代码复制到每个 构造方法的头部(每创建一个对象就会执行一次初始化代码块中的代码)
✏️ 先执行初始化代码块中的代码,后执行构造方法中的代码
public class TestDemo {
public static void main(String[] args) {
Person person = new Person("庆医");
System.out.println("age = " + person.age);
System.out.println("name = " + person.name);
System.out.println("money = " + person.money);
System.out.println("address = " + person.address);
}
}
class Person {
public int age = 17;
public String name;
public double money;
public String address;
public Person(String name) {
this.name = name;
}
{
money = 67899.99;
address = "日本神奈川县川崎市";
}
}
先执行初始化代码块中的代码,后执行构造方法中的代码
看下面代码,思考打印结果是什么:
public class TestDemo {
public static void main(String[] args) {
Person p = new Person(11, "庆医", 10000);
System.out.println("age = " + p.age);
System.out.println("name = " + p.name);
System.out.println("money = " + p.money);
}
}
class Person {
public int age;
public String name;
public double money;
public Person(int age, String name, double money) {
this.name = name;
this.age = age + this.age;
this.money = money + this.money;
}
{
name = "张浩男";
age = 1;
money = 5000;
}
}
四、如何给类变量设置初始值
☘️ 声明的时候就赋值
☘️ 在静态 初始化(代码)块中
✏️ 当一个类被初始化的时候会执行 静态初始化块中的代码
✏️ 当一个类第一次被主动使用的时候,JVM 会对类进行初始化(当一个类第一次被主动使用的时候会执行 静态初始化块中的代码)
✏️ 静态初始化块中的代码只会被执行一次
public class TestDemo {
public static void main(String[] args) {
new Person();
new Person(12898);
}
}
class Person {
static {
System.out.println("\n静态初始化块中的代码在类第一次被使用的时候会被执行一次(只执行一次)");
}
{
System.out.println("初始化块中的代码会被复制到每个构造方法的头部, 每次创建对象都会执行一次初始化块中的代码");
}
public Person() {
}
public Person(int money) {
}
}
☘️ 初始化块和静态初始化块都可以有多个(按照它们在源码中出现的顺序依次执行)
五、继承中出现(静态)初始化块 ☆
public class TestDemo {
public static void main(String[] args) {
new Student();
}
}
class Person {
static {
System.out.println("Person_静态初始化块");
}
{
System.out.println("Person_初始化块");
}
public Person() {
System.out.println("Person_Person()");
}
}
class Student extends Person {
static {
System.out.println("Student_静态初始化块");
}
{
System.out.println("Student_初始化块");
}
public Student() {
System.out.println("Student_Person()");
}
}
六、单例模式
☘️ Singleton Pattern:如果一个类被设计成单例设计模式,则在整个应用程序运行过程中,该类只能存在一个实例。
饿汉式:
class Rocket {
private static Rocket instance = new Rocket();
private Rocket() {
}
public static Rocket getInstance() {
return instance;
}
}
懒汉式:
class Rocket {
private static Rocket instance = null;
private Rocket() {
}
public static Rocket getInstance() {
if (instance == null)
instance = new Rocket();
return instance;
}
}
再见!如有错误,请不吝赐教!
Original: https://blog.csdn.net/m0_54189068/article/details/126809228
Author: new Handsome()
Title: 18、Java的类变量、类方法;static 关键字;静态导入;初始化块;静态初始化块;单例模式
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/542893/
转载文章受原作者版权保护。转载请注明原作者出处!