static关键字

本文深入探讨了Java中的静态概念,包括静态属性、静态方法、静态代码块的使用及注意事项,通过实例展示了静态成员如何在类的不同实例间共享,并在继承中体现的特性。此外,文章还阐述了静态成员在实际编程中的应用场景,帮助开发者更好地理解和运用Java的静态特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

静 态(static)

定义:有时你希望定义一个类成员,使它的使用完全独立于该类的任何对象。通常情况下,类成员必须通过它的类的对象访问,但是可以创建这样一个成员,它能够被它自己使用,而不必引用特定的实例。在成员的声明前面加上关键字static(静态的)就能创建这样的成员。如果一个成员被声明为static,它就能够在它的类的任何对象创建之前被访问,而不必引用任何对象。你可以将方法和变量都声明为static。static 成员的最常见的例子是main( ) 。因为在程序开始执行时必须调用main() ,所以它被声明为static。

关键字:

Static关键字:可以用于修饰属性,可以用于修饰方法,还可以用于修饰类。

1、Static修饰属性:无论一个类生成了多少个对象, 所有这些对象共同使用唯一的一份静态的成员变量,一个对该静态成员变量进行了修改,其他对象的改静态成员变量的值也随之发生改变。如果一个成员变量是static的,那么我们可以通过类名.成员变量名的方式来使用它。(推荐用这种方法)。

public class StaticTest2

{

String name = "liming";

int age = 34;

public void info()

{

System.out.println("姓名" + name + "年龄" + age);

}

public static void main(String[] args)

{

StaticTest2 st1 = new StaticTest2();

StaticTest2 st2 = new StaticTest2();

st1.info();

st2.info();

System.out.println("---------");

st1.age=45;//也可由类直接调用StaticTest.age=45;下同

st1.name="zhansan";

st1.info();

st2.info();//st1修改age与name的属性与st2无关,所以st2调用不会改变age与name的属性,打印结果为:liming 34

若将属性改为: static String name = "liming";

static int age = 34;则st1修改age与name的属性与st2有关, st2调用info也会改变age与name的属性,变为:zhansan 45

}

}

如上程序,

2、Static修饰方法:用static修饰的方法叫静态方法。对于静态方法来说可以使用类名.方法名的方式来访问。

例如:

public class StaticTest {

public static void main(String[] args) {

// TODO Auto-generatedmethod stub

MyStatic ms = new MyStatic();

ms.output();

MyStatic.output();// 使用类名.方法名调用与上面一样!使用static修饰时,通常使用这种方法

}

}

class MyStatic {

public static void output() {

System.out.println("output");

}

}

3、static在继承中应注意的问题

静态方法只能继承,不能重写(覆盖)。

4、staic代码块:静态代码块

public class FinalTest {

public static void main(String[] args) {

People people = new People();

//属性被final所修饰,不能被改写

}

}

class People {

static{//静态代码块

System.out.println("Static block");

}

}

1)静态代码块的作用是完成一些初始化的工作,首先执行静态代码块,然后执行构造方法。静态代码块在类被加载的时候执行,而构造方法是在生成对象的时候执行,要想调用某个类来生成对象,首先需要将类加载到java虚拟机上(JVM),然后由JVM加载这个类来生成对象。

2)类的静态代码块只会执行一次,是在类被加载的时候执行的,因为每个类只会被加载一次,所以静态代码块也只会被执行一次;而构造方法则不同,每次生成一个对象的时候都会调用类的构造方法,所以new一次就会调用构造方法一次。

3)如果继承体系中既有构造方法,又有静态代码块,那么首先执行最顶层类的静态代码块,一直执行到最底层类的静态代码块,然后再去执行最顶层类的构造方法,一直执行到最底层类的构造方法。注意:静态代码块只会被执行一次。

例如:

public class StaticTest2 {

public static void main(String[] args) {

Q q= new Q();

P p= new P();

}

}

class Q{

static{

System.out.println("Q Staticblock");

}

public Q(){

System.out.println("QConstracter");

}

}

class P extends Q{

static {

System.out.println("P Static block");

}

public P(){

System.out.println("P Constracter");

}

}

将会输出:Q Static block

Q Constracter

P Static block

Q Constracter

P Constracter

5、不能在静态方法中访问非静态的成员变量,可以在静态方法中访问静态的成员变量,也可以在非静态的方法中访问静态的成员变量。

总结:静态的只能访问静态的,非静态的可以访问一切。

6、不能在静态方法中使用this关键字。

注意:

1、声明为static的变量实质上就是全局变量。当声明一个对象时,并不产生static变量的拷贝,而是该类所有的实例变量共同拥有一个static变量。声明为static的方法有以下几条限制:   

1)它们仅能调用其他的static 方法。   

2)它们只能访问static数据。  

3)它们不能以任何方式引用this 或super(关键字super 与继承有关)。

2、定义一个静态的属性,它属于整个类的,不属于单个的对象,任何一个对象都可以访问静态的值,访问的都是同一个内存。即使没有对象,也可以访问,用类名加点访问。

3、类名加上点后面的东西为静态的。例如:

System.out中的out为静态的。

4、在静态方法中不能访问非静态的成员,因为静态方法不属于某一个对象,而非静态的方法属于某一个对象,所以不能访问。想访问非静态的成员,必须new一个出来。


### Java 中 `static` 关键字的作用 在 Java 编程语言中,`static` 关键字用于定义独立于对象的静态变量、方法以及嵌套。这意味着这些成员属于整个而不是某个特定的对象实例[^1]。 #### 静态变量 (Class Variables) 当声明为 `static` 的时候,该字段成为级别的属性而非实例级别。无论创建多少个此的对象,都只会存在一份这样的数据副本被所有实例所共享: ```java public class Counter { public static int count = 0; // 级变量 public Counter() { count++; } } ``` 每次新建一个 `Counter` 对象时都会增加计数器 `count` 的值,并且这个变化会影响到其他地方对该静态域的访问。 #### 静态方法 (Static Methods) 带有 `static` 修饰符的方法可以直接通过名调用而无需先实例化任何对象。这函数通常用来执行一些不依赖具体状态的操作或是作为工具性质的功能实现: ```java public class MathUtils { public static double squareRoot(double num){ return Math.sqrt(num); } } // 使用方式如下: double result = MathUtils.squareRoot(9); System.out.println(result); // 输出3.0 ``` 需要注意的是,在静态上下文中无法直接引用非静态成员因为后者是与具体的对象关联在一起的。 #### 静态初始化块 (Static Initializer Blocks) 除了单个语句外还可以利用大括号包裹起来的一组表达式来完成更复杂的逻辑处理工作——这就是所谓的“静态初始器”。它会在加载到 JVM 后立即被执行一次,常用于资源预分配等场景下: ```java class DatabaseConnection{ private static Connection conn; static { try{ Class.forName("com.mysql.jdbc.Driver"); String url="jdbc:mysql://localhost:3306/test"; String user="root"; String password=""; conn=DriverManager.getConnection(url,user,password); }catch(Exception e){e.printStackTrace();} } } ``` 这段代码展示了如何建立数据库连接并将其存储在一个静态变量里供后续操作使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值