初始代码块:在创建对象时 和 实例变量按照顺序进行初始化 也叫做动态代码块
语法:
{}
案例:
成员变量先声明 默认值0---->360--->250publicclassDemo{publicstaticvoidmain(String[] args){
Test t =newTest();
System.out.println(t.c);//System.out.println(t.a);}}classTest{//成员变量//int a = 20;//初始代码块int c =250;{
c =360;/*int b = 30;//局部变量
a = 10;//成员变量
System.out.println(b);*///System.out.println(c);}}=================================================================static 修饰的初始代码块叫做静态代码块
静态代码块:在类加载的时候和类中静态属性按照顺序进行初始化
语法:
static{}
类变量先声明 默认值0---->10--->20
案例:
publicclassDemo{publicstaticvoidmain(String[] args){
Test t =newTest();
System.out.println(t.b);
System.out.println(Test.b);//System.out.println(t.a);}}classTest{//实例变量int a;//类变量staticint b =10;static{
b =20;
System.out.println("静态代码块执行了 类加载了");}================================================================
类加载:当第一使用一个类的时候会先将一个类加载到jvm中读出(属性 方法 包名 类名 等信息 存入到jvm)
|------------------- 硬盘 -----------------||--内存---|.java(源文件)--->编译器--->.class(字节码文件)---->jvm(内存)
类加载的时机:
1.第一次创建对象的时候会进行类加载
2.当通过类名访问类中的静态成员的时候会进行类加载
3.当创建子类对象的时候会先创建父类对象 这时候先会进行父类的类加载 再进行子类的类加载
4.当通过类名进行访问子类中的静态成员 会先加载父类 然后再加载子类
3-4合一:当子类进行类加载前会先进行父类的类加载
5.当通过类名访问父类中的静态成员只会进行父类的类加载
6.当创建父类对象时只会进行父类的类加载
注意:类加载只进行一次
案例:
publicclassDemo{publicstaticvoidmain(String[] args){
Test t =newTest();}}classTest{publicTest(){
System.out.println("构造被调用 对象被创建");}//实例变量int a;//类变量staticint b =10;static{
b =20;
System.out.println("静态代码块执行了 父类加载了");}publicstaticvoidm1(){
System.out.println("m1被调用");}}classHelloextendsTest{staticint c =10;static{
System.out.println("子类进行类加载了");}}
final最终的
final修饰变量
final 修饰局部变量
特点:
final 修饰的局部变量只能赋值一次 一旦赋值值不可改变
案例:
publicclassDemo{}classTest{publicvoidm1(){finalint a ;
a =10;
a++;
System.out.println(a);}}==================================================================final 修饰实例变量
特点:
1.final 修饰的实例变量没有默认值
2.final 修饰的实例变量只能赋值一次 一旦赋值不可改变
3.fianl 修饰的实例变量可以在构造方法中进行初始化 但是要保证每个构造方法都对final修饰的实例变量进行初始化
案例:
publicclassDemo{publicstaticvoidmain(String[] args){
Test t =newTest(20);
System.out.println(t.a);}}classTest{//实例变量finalint a;//构造方法publicTest(int a){this.a = a;}publicTest(String n,int a){this.a =a;}}==================================================================final 修饰静态变量
特点:
1.final 修饰的静态变量没有默认值
2.final 修饰的静态变量只能赋值一次 一旦赋值无法改变
3.final 修饰的静态变量可以在静态代码块中进行初始化
注意: final 修饰的静态变量称之为常量
常量的定义语法: publicstaticfinal 数据类型 常量名 = 常量值;
例如: publicstaticfinalint a =3;
案例:
classTest{//类变量finalstaticint a;static{
a =10;//a++;}}===============================================================
注意:
当final修饰简单数据类型的变量时 只能赋值一次不能改变变量值
当final修饰的引用数据类型的变量时 不能再次改变的是地址值
final修饰方法
final 修饰成员方法
语法:
访问修饰符 final 返回值类型 方法名(形参列表){}final 访问修饰符 返回值类型 方法名(形参列表){}
特点:
1.final 修饰的成员方法可以重载
2.final 修饰的成员方法可以被继承 ,但是不能被覆盖
案例:
publicclassDemo{publicstaticvoidmain(String[] args){
Sub s =newSub();
s.m1();}}classSuper{publicfinalvoidm1(){
System.out.println("m1");}}classSubextendsSuper{publicfinalvoidm1(){
System.out.println("sub m1");}}==================================================================final 修饰静态方法
语法:
访问修饰符 finalstatic 返回值类型 方法名(形参列表){}
访问修饰符/final/static 顺序前后都可以
特点:
1.final 修饰的静态方法可以被重载
2.final 修饰的静态方法可以被继承 但是不能被覆盖
案例:
publicclassDemo{publicstaticvoidmain(String[] args){
Sub s =newSub();
s.m1();}}classSuper{publicstaticfinalvoidm1(){
System.out.println("super m1");}}classSubextendsSuper{publicstaticfinalvoidm1(){
System.out.println("sub m1");}}
final修饰类
final 修饰的类
语法:
finalclass 类名{}
特点:
final 修饰的类没有子类 俗称 断子绝孙类
java类库中常见的断子绝孙类 Math 类 System String
案例:
publicclassDemo{publicstaticvoidmain(String[] args){/*Sub s = new Sub();
s.m1();*/}}finalclassSuper{publicstaticfinalvoidm1(){
System.out.println("super m1");}}classSubextendsSystem{}