Javafinal & static
Posted ch42e
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Javafinal & static相关的知识,希望对你有一定的参考价值。
final关键字
Java final关键字用于限制用户,可以用于变量,方法以及类当中
final 变量
final关键字与变量一起使用,该变量没有值,称为空白final变量或者未初始化final变量。只能够在构造函数中初始化。空白final若是是静态(static)的,则只能够在静态块中初始化。
如果定义一个final变量,该变量的值不能够被改变,将会是一个常量
public class Test {
final int date = 2020;
void run(){
date = 2021;
}
public static void main(String[] args){
Test t = new Test();
t.run();
}
}
在IDEA中运行上述代码;
Output:
Error:(6, 9) java: 无法为最终变量date分配值
public class Test {
final int date;
Test() {
date = 2020;
System.out.println(date);
}
public static void main(String[] args){
Test t = new Test();
}
}
final 方法
如果定义一个final方法,该方法将不能够被覆写
class Bike{
final void run(){
System.out.println("running");
}
}
class Test extends Bike{
void run(){
System.out.println("running safely with 100kmph");
}
public static void main(String args[]){t
Test t= new Test();
t.run();
}
}
Output:
Error:(10, 10) java: package1.Test中的run()无法覆盖package1.Bike中的run()被覆盖的方法为final
final 类
如果定义一个final类,那么该类将不能够被继承
final class Bike{ }
class Test extends Bike{
void run(){
System.out.println("go go go!");
}
public static void main(String args[]){
Test t= new Test();
t.run();
}
}
Output:
Error:(5, 20) java: 无法从最终package1.Bike进行继承
注:final 方法可以被继承但是不能覆写
?什么是空白或未初始化的final变量?
再变量声明时没有进行初始化的final变量
?可以声明构造函数为final吗
不可以,因为构造函数从不继承
static关键字
Java中的static关键字主要用于内存管理,可以将static关键字与变量、方法、块以及嵌套类一起使用
static 变量
- static变量可用于引用所有对象的公共属性
- static变量在类加载时仅在类区域中获得一次内存
通过使用静态变量可以使得程序的内存使用效率更高
class Student{
int id;
String name;
String college="MIT";
}
现假设学校里面有500名学生,每次创建对象时,所有实例数据成员都将获得内存。每一名学生都有唯一的id
和name
,college
是同属于一个学校,是指所有对象的共同属性,因此将其设为静态变量,该字段就只获取一次内存。
class Student{
int rollno;
String name;
static String college ="MIT";
Student(int r, String n){
rollno = r;
name = n;
}
}
例1:没有静态变量的计数器
class Counter{
int count=0;
Counter(){
count++;
System.out.println(count);
}
public static void main(String args[]){
Counter c1=new Counter();
Counter c2=new Counter();
Counter c3=new Counter();
}
}
在这个例子中,创建了一个名为count的实例变量,该变量在构造函数中递增。由于实例变量在创建对象时获取内存,所有在每个对象中count变量的值都为1
例2:静态变量计数器
class Counter2{
static int count=0;
Counter2(){
count++;
System.out.println(count);
}
public static void main(String args[]){
Counter2 c1=new Counter2();
Counter2 c2=new Counter2();
Counter2 c3=new Counter2();
}
}
在这个例子中,静态变量仅获得一次内存。如果任何对象更改了静态变量的值,都将保存下来
static 方法
- 静态方法属于类而不是类的对象
- 可以直接调用静态方法而不需要创建类的实例
- 静态方法可以访问静态数据成员并更改其值
class Student{
int rollno;
String name;
static String college = "MIT";
static void change(){
college = "PKU";
}
Student(int r, String n){
rollno = r;
name = n;
}
void display(){
System.out.println(rollno + " " + name + " " + college);
}
}
public class TestStaticMethod{
public static void main(String args[]){
Student.change();
Student s1 = new Student(001, "Mike");
Student s2 = new Student(002, "Hulk");
Student s3 = new Student(003, "Mary");
s1.display();
s2.display();
s3.display();
}
}
在上面的例子中,可以不实例化就直接调用静态方法change()
,并且可以直接通过静态方法访问修改静态变量的值。
限制
- 静态方法不能够使用非静态数据成员或者直接调用非静态方法
- this和super不能够再static context中使用
?为什么Java中的main方法是static
因为静态方法不需要创建对象就能够直接被调用,而如果是非静态方法,则JVM首先要创建一个对象,然后调用main方法,这将导致额外的内存分配
static 块
- 用于初始化静态数据成员
- 在类加载时,它在main方法之前执行
class Test{
static{
System.out.println("static block is invoked");
}
public static void main(String args[]){
System.out.println("Hello main");
}
}
Output:
static block is invoked
Hello main
?可以执行没有main方法的程序吗
不可以。从JDK1.7开始,没有main方法就无法执行Java类
参考
https://www.javatpoint.com/final-keyword
https://www.javatpoint.com/static-keyword-in-java
以上是关于Javafinal & static的主要内容,如果未能解决你的问题,请参考以下文章
Day388.Selector&Pipe&fileLock文件锁&Path&Files&AsynchronousFileChannel异步通道 -NIO(代码片
mysqlspringboot启动报错Could not create connection to database server. Attempted reconnect 3 times. (代码片
Buuctf-Reverse(逆向) [RoarCTF2019]Polyre && SangFor(深育杯)-Reverse(逆向) XOR_Exercise Write up(代码片