Java关键字final、native、static

本文深入解析Java中的final、native和static修饰符的含义、用法及特性,包括它们如何影响类、方法和变量的行为,以及在类初始化过程中的作用。

final:修饰符的一种

1、意思:最终的

2、final可以修饰:类(外部类、内部类)、变量(成员变量(类变量、实例变量)、局部变量)、

方法(静态方法、非静态方法)

3、修饰后有什么不同?

  1. 修饰类:表示这个类不能被继承了,我们可以称它为"太监类

例如:String、System、Math

      2.修饰方法:表示这个方法不能被重写

      3.修饰变量:表示这个变量的值不能被修改,即我们称为的"常量"

常量有两种:

        一种是字面常量:例如:"hello“,12,‘a'

        一种是final声明的变量

native:也是一个修饰符

  1. 意思:原生的、本地的
  2. 可以修饰什么?

可以修饰方法

     3.它修饰的方法有什么不同

语法格式:

【修饰符】 class 类 {

      【其它修饰符】native 返回值类型 方法名(【形参列表】);

}

native修饰的方法,看不见方法体。

native修饰的方法,不是用Java语言实现的,而是调用了底层C/C++的代码,这些代码

被编译为.dll文件,让java来执行的

       4.特殊

         (1)native方法,对于Java程序员来说,该怎么调用还怎么调用

         (2)子类还可以选择对它进行重写

static:也是一种修饰符

1、意思:静态的

2、可以修饰什么?

   (1)方法

   (2)成员变量

   (3)内部类

   (4)代码块

3、修饰后有什么不同?

 (1)方法:我们称为“静态方法”或“类方法”
  ①这个方法,对于其他类来说可以用"类名.方法"进行调用,当然也可以使用"对象名.方法"进行调用,我们推荐用"类名.方法"
  ②静态方法中,是不允许出现:this,super,对本类的非静态属性、非静态的方法的直接使用代码的
  
 (2)成员变量:称为“类变量、静态变量”
 ①用static修饰的成员变量的值,表示是这个类型的所有对象“共享的”
 ②static修饰的成员变量的值,存储在方法区
 ③static修饰的成员变量的get/set也是静态的,
 ④如果在方法中有局部变量与static修饰的成员变量同名时,在静态变量前面加"类名."进行区别
  
 结论:非静态的"对象名.",静态的用"类名."

 非静态代码块:
 【修饰符】 class 类{
         {
             非静态代码块
         }
  }
  
  静态代码块:
  【修饰符】 class 类{
         static{
            静态代码块
         }
  }
  
  特点:
 (1)每一个类的静态代码块只会执行一次
 (2)静态代码块在第一次使用这个类之前执行,即在类初始化时执行。
 
 
 4、类初始化即执行类初始化方法:<clinit>()
 类初始化方法,一个类只有一个。它也是有编译器编译生成的,由两部分代码组成:
 (1)静态变量的显式赋值代码
 (2)静态代码块的代码
 其中(1)和(2)是按照顺序执行
 回忆:实例初始化方法<init>()或<init>(形参列表)
 一个类可能有好几个实例初始化方法,有几个构造器就有几个实例初始化方法,它们由编译器根据:
 ①成员变量的显式赋值代码
 ②非静态代码块代码
 ③构造器的代码
 initialize:初始化
  class initialize:类初始化
 

/*
 * 一个类初始化时会先检查它的父类是否初始化,如果父类没有初始化,那么会先初始化父类。因为一个类只要初始化一次。
 * 
 * (1)父类的初始化<clinit>()
 * ①父类的静态变量的显式赋值
 * ②父类的静态代码块
 * (2)子类的初始化<clinit>()
 * ①父类的静态变量的显式赋值
 * ②父类的静态代码块
 * 
 * 特殊:
 * 	 静态方法是不能被重写的
 */
public class TestClassInit {
	public static void main(String[] args) {
		/*Father f = new Father();
		System.out.println("-------------------");
		Son s = new Son();*/
		
		Son s = new Son();
		
		/*Father f = new Son();//多态引用
		System.out.println("----------------");
		f.assign();//静态方法在编译期间就确定了,不需要在运行时动态绑定
*/	}
}
class Father{
	private static String info = assign();
	static{
		System.out.println("(1)父类的静态代码块");
	}
	public static String assign(){
		System.out.println("(3)assign()方法");
		return "Father";
	}
}
class Son extends Father{
	private static String info = assign();
	static{
		System.out.println("(2)子类的静态代码块");
	}
	public static String assign(){
		System.out.println("(4)assign()方法");
		return "Son";
	}
}

运行截图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值