初学呐喊!——Java中static关键字和final关键字的用法

Java oop


static与final使用


final的用法

final是Java的关键字,表示最终

1. final能修饰什么

final不能修饰构造方法

  • 属性
  • 局部变量
  • 一般方法
2. final修饰后的影响

  • 这个类不能被继承,也就是这个类不能有子类

      public final class Person {
    
      }
    
  • 属性和变量
    值不能更改,就是常量

    public final class Person {
      final int STUDENT_AGE = 20;//值不能变
      public void calc(final int first) {
    	  final int NUM1 = 90;
    	  first = 900;//报错
      }
    }
    
    • 方法
      方法不能被重写
    public  class Person {
    final int STUDENT_AGE = 20;//值不能变
    public void calc(final int first) {
    	final int NUM1 = 90;
    	//first = 900;//报错
    }
    public final void speak() {}
    }
    class Student extends Person {
    //报错
    public void speak() {}
    }
    
3. final代码解析一

以下代码执行结果是什么?

public class Animal {
	final int age;
	public static void main(String[] args) {
		Animal animal = new Animal();
		System.out.println(animal.age);//值多少?
	}
}

4. final代码解析二

以下代码的输出结果是什么?

public class Animal {
	final int age;
	
	public Animal(int age) {
		this.age = age;
	}
	public static void main(String[] args) {
		Animal animal = new Animal(2);
		System.out.println(animal.age);//???
	}
}

final修饰的属性,要么显式赋值,要么构造方法赋值。

static的用法

static是Java语言的关键字,表示静态。

static能修饰什么
  • 属性(静态属性、静态变量、类变量)
    静态属性可以用类名字直接访问,也可用对象访问
  • 一般方法(静态方法、类方法)
    静态方法可以用类名字直接调用,也可用对象调用
  public  class Teacher {
     static int age;
    public static void speak() {
	  System.out.println("大家好!");
  }
  public static void main(String[] args) {
	   Teacher.speak();//OK
	   System.out.println(Teacher.age);//OK
	   
	   Teacher teacher = new Teacher();
	   teacher.speak();
	   System.out.println(teacher.age);
  }  
  static class W {}
}

static深层次影响
被static修饰的属性,被所有对象共享,一个对象对属性值的更改会影响到所有对象。
非静态属性,叫做实例变量,每个对象持有一份,不是共享的。
不要轻易把属性标识为static。

public  class Teacher {
  static int age = 20;
         int grade = 2;
  public static void speak() {
	  System.out.println("大家好!");
  }
  public static void main(String[] args) {
	   Teacher.speak();//OK
	   System.out.println(Teacher.age);//OK
	   Teacher.age = 30;//把age值更改了
	   
	   Teacher teacher = new Teacher();
	   teacher.speak();
	   System.out.println(teacher.age);//输出多少?
  }  
  static class W {}
}

注意事项:

  1. static方法里不能使用非静态属性(静态方法里不能使用实例变量)
public  class Teacher {
  static int age = 20;
         int grade = 2;
  public static void speak() {
	  grade++;//报错
	  age++;//OK
	  System.out.println("大家好!");
  }
  }
  1. static不能修饰局部变量(含形参)
  2. 在static方法里,不能直接调用非静态方法
    此话对否:在静态方法里不能调用非静态方法?错误!
 public  class Teacher {
  static int age = 20;
         int grade = 2;
         
  public void eat() {}
  public static void speak() {
	  eat();//报错
	  Teacher t = new Teacher();
	  t.eat();//OK
	   
	  System.out.println("大家好!");
  }

  1. static方法、游离块中不能使用super和this,因为super和this是实例变量
  • 内部类(静态内部类)
  • 游离语句块(静态的游离语句块)
static不能修饰什么
  • 构造方法
  • 局部变量
  • 外部类
static存放在内存什么区域

全局数据区

static加载问题分析
  1. 仅加载1次(仅执行1次)
  2. 什么时候加载?.class文件被载入JVM的时候加载
    以下代码输出结果?
public class Worker {
	static {
		System.out.println("first");
	}	
	static int age = getAge();
	
	public static int getAge() {
		System.out.println("second");
		return 34;
	}
	public static void main(String[] args) {
		Worker worker = new Worker();
	}
}


对象构造次序
  1. 父类的静态(看次序,static属性和static游离块)
  2. 子类的静态(看次序,static属性和static游离块)
  3. 父类非静态(看次序,非静态属性和游离块)
  4. 父类的构造方法
  5. 子类非静态(看次序,非静态属性和游离块)
  6. 子类的构造方法
为什么main前面必须有static

静态方法和属性与类相关,并“不”与对象相关,意思就是不用创建对象,照样能用,因为类是存在的

总结

  1. final怎么用
  2. static修饰属性的影响、方法影响
  3. 加载次数及存放的地方
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值