Java 静态和最终的区别?
在java中,我总是混淆Java 静态和最终的区别?,java,Java,在java中,我总是混淆static和final关键字 它们有何不同?静态是类中任何对象都可以调用的东西,它本质上属于对象类型 一个变量可以是整个类的最终变量,这意味着它不能再被更改了。只能设置一次,再次尝试设置将导致抛出错误。它很有用,原因有很多,也许你想声明一个不能更改的常量 一些示例代码: class someClass { public static int count=0; public final String mName; someClass(String na
static
和final
关键字
它们有何不同?静态是类中任何对象都可以调用的东西,它本质上属于对象类型 一个变量可以是整个类的最终变量,这意味着它不能再被更改了。只能设置一次,再次尝试设置将导致抛出错误。它很有用,原因有很多,也许你想声明一个不能更改的常量 一些示例代码:
class someClass
{
public static int count=0;
public final String mName;
someClass(String name)
{
mname=name;
count=count+1;
}
public static void main(String args[])
{
someClass obj1=new someClass("obj1");
System.out.println("count="+count+" name="+obj1.mName);
someClass obj2=new someClass("obj2");
System.out.println("count="+count+" name="+obj2.mName);
}
}
Wikipedia包含所有变量/方法的完整列表。静态表示它属于类而不是实例,这意味着在特定类的所有实例之间只共享该变量/方法的一个副本
public class MyClass {
public static int myVariable = 0;
}
//Now in some other code creating two instances of MyClass
//and altering the variable will affect all instances
MyClass instance1 = new MyClass();
MyClass instance2 = new MyClass();
MyClass.myVariable = 5; //This change is reflected in both instances
final是完全不相关的,它是一种定义一次性初始化的方法。您可以在定义变量时进行初始化,也可以在构造函数中进行初始化,而不是在其他地方
注意关于final方法和final类的注意,这是一种明确说明方法或类不能分别被重写/扩展的方式
额外阅读
所以在静态的话题上,我们讨论了它可能有的其他用途,它有时用在静态块中。当使用静态变量时,有时需要在使用类之前设置这些变量,但不幸的是,您没有获得构造函数。这就是static关键字的作用
public class MyClass {
public static List<String> cars = new ArrayList<String>();
static {
cars.add("Ferrari");
cars.add("Scoda");
}
}
public class TestClass {
public static void main(String args[]) {
System.out.println(MyClass.cars.get(0)); //This will print Ferrari
}
}
公共类MyClass{
public static List cars=new ArrayList();
静止的{
汽车。添加(“法拉利”);
添加(“Scoda”);
}
}
公共类TestClass{
公共静态void main(字符串参数[]){
System.out.println(MyClass.cars.get(0));//这将打印法拉利
}
}
不要将此与在每个实例的构造函数之前调用的实例初始值设定项块混淆。这两者实际上并不相似<代码>静态字段是不属于类的任何特定实例的字段 在这里,
static
字段n
与C
的任何特定实例都没有关联,但通常与整个类关联(这就是为什么可以使用C.n
访问它的原因)。您仍然可以使用C
的实例访问n
?是的,但这并不被认为是特别好的做法
另一方面,final
表示特定变量在初始化后无法更改
class C {
public final int n = 42;
}
此处,n
无法重新分配,因为它是最终的
。另一个区别是,任何变量都可以声明为final,而不是每个变量都可以声明为static
此外,类可以声明为final
,这表明它们不能扩展:
final class C {}
class B extends C {} // error!
类似地,可以将方法声明为final,以指示它们不能被扩展类重写:
class C {
public final void foo() {}
}
class B extends C {
public void foo() {} // error!
}
静态和最终有一些很大的区别: 静态变量或类在任何地方都是可用的。Final只是一个关键字,表示变量不能更改。因此,如果有:
public class Test{
public final int first = 10;
public static int second = 20;
public Test(){
second = second + 1
first = first + 1;
}
}
程序将一直运行,直到它试图更改“第一个”整数,这将导致错误。在这个类之外,如果您实例化了这个类,您将只能访问“first”变量。这与一直可用的“第二个”形成对比 static关键字可用于4种场景
- 静态变量
- 静态方法
- 静态代码块
- 静态嵌套类
- 它是属于类而不是对象(实例)的变量李>
- 静态变量只在执行开始时初始化一次。在初始化任何实例变量之前,将首先初始化这些变量
- 类的所有实例共享的单个副本李>
- 静态变量可以通过类名直接访问,不需要任何对象
- 语法:
Class.variable
- 它是属于类而不是对象(实例)的方法李>
- 静态方法只能访问静态数据。它不能访问非静态数据(实例变量),除非它拥有/创建了类的实例李>
- 静态方法只能调用其他静态方法,不能从中调用非静态方法,除非它具有/创建类的实例李>
- 静态方法可以通过类名直接访问,不需要任何对象
- 语法:
Class.methodName()
- 静态方法无论如何都不能引用
或此
关键字超级
静态的
,因为在进行任何实例化之前,应用程序必须能够访问它才能运行
final
关键字在多个不同的上下文中用于定义以后无法更改的实体。
类不能子类化。这样做是为了安全和效率。因此,许多Java标准库类都是final
,例如final
和Java.lang.System
。Java.lang.String
类中的所有方法都是隐式的final
final
方法不能被子类重写。这是用来公关的final
public class Test{ public final int first = 10; public static int second = 20; public Test(){ second = second + 1 first = first + 1; } }
static final String color = "Black";
public class Speaker { static String color = "Black"; } public class Sample { public static void main(String args[]) { System.out.println(Speaker.color); //will provide output as "Black" Speaker.color = "white"; System.out.println(Speaker.color); //will provide output as "White" }}
public class Speaker { static final String color = "Black"; } public class Sample { public static void main(String args[]) { System.out.println(Speaker.color); //should provide output as "Black" Speaker.color = "white"; //Error because the value of color is fixed. System.out.println(Speaker.color); //Code won't execute. }}