五 Java_重要修饰符

本文详细介绍了Java中的三个重要修饰符:static、final和abstract。static用于修饰静态资源,如属性和方法,它在类加载时初始化,并可通过类名直接调用。final修饰的变量不可变,final方法不能被子类覆盖,final类不能被继承。abstract修饰抽象方法和类,抽象方法由子类实现,抽象类不能实例化。文章还探讨了它们的使用场景和注意事项。

static、final、 abstract修饰符位置不分先后,但修饰符与类型名顺序不同时含义有区别,例如static int a;和int static a;

static-静态的

功能

可以修饰属性(成员变量)、方法、代码块、内部类。注意:不能修饰局部变量

特点

static修饰的资源会在类加载时执行或初始化
static成员可以通过类名直接调用,例如,Integer.MAX_VALUE、Math.rendom()等
类加载:JVM内存第一次使用某个类时,会将其*.class文件读入JVM内存,存在于Code区,可以作为模板来创建对象,使用其方法(仅一次)
类加载的时机:
1)new Student(); 会加载Student类,如果只声明引用Student stu;不会加载
2)类名.静态成员: Arrays.sort(ds); 会先加载java.util.Arrays类,(JVM启动时会提前加载java.lang下所有类)
3) Class.forName(“day08.Animal”);手动加载day08.Animal类,目的就是为了加载一个类,类必须写全名

应用

1、修饰属性
不加static为实例变量,每个对象(实例)拥有一份;
加static为类变量,整个类只有一份(对象共享一份);例如,

class Student{
      int no;
      static int cno;
}
Public void test(){
    Student stu1= new Student();
    Student stu2= new Student();
    stu1.no = 100;
    stu2.no=102;
    stu1.cno = 104;   // 可通过类名区访问静态成员 Student.cno
    stu2.cno = 105;   
    System.out.println(stu1.no);   // 101
    System.out.println(stu2.no);   // 102
    System.out.println(stu1.cno);   // 105
    System.out.println(stu2.cno);  // 105
}

2、修饰方法
不加static:实例方法,通过对象.调用
加了static:静态方法,可以通过类名.直接调用
1)哪些类必须创建对象?

Student Animal Cat Fish……不同对象属性不同,需要通过创建不同对象实例区分不同属性值
Student s1 = new Student(1,”Tom”);
Student s2 = new Student(2,”Mary”);
s1.study(“JavaSE”);
s2.study(“Oracle”);

2)哪些类可以不用创建对象?
比如:Math类,Arrays类,当无需保存具体数据只需使用其方法,可不用创建对象实例,只通过类名.静态方法。例如:Math.random(); Arrays.sort(ds);
好处:减少大量不必要的对象创建,节省Heap空间
结论;当一个类中几乎都是静态方法,称之为工具类。比如:java.jlang.Math java.util.Arrays类,Util包:工具包
【注:静态方法不能访问非静态成员(属性、方法),原因:通过类名调用静态方法时,对象还未创建,为对象分配空间,尤其是实例变量】

3、修饰代码块
代码块{ }可以作为:类体、方法体、分支体、循环体、实例代码块、静态代码块

Class Foo{
    { 
           实例代码块, 对象创建时先于构造方法执行
    }
    static{
           静态代码块,类加载时执行(最先执行)仅一次
    }
   Public Foo(){
              伴随对象的创建而执行
    }
}

4、修饰内部类

class Outer{
    class Inner1{ 
        // 成员内部类
    }
    static class Inner2{  
        //静态内部类
    }
}

5、单例模式
设计模式——单例模式 Singleton
含义:保证一个类在系统中最多只会创建一个实例
好处:能避免对象大量创建,减少系统垃圾,降低GC启动频率
哪些类适合单例模式?
Student类,不适合,需要通过不同对象实例来区分不同的学生数据(属性)
Math类,适合,不需要大量的Math类对象来保存数据,只需要使用其方法。甚至,Math类不可能有实例,因为构造方法私有,完全可以通过类名.静态方法。

final -不变的(稳定)

功能

可以修饰变量(成员变量、局部变量)、方法、类

特点

不加final:变量
加了final:常量 一经赋值,不可改变

应用

1、修饰变量
修饰成员变量->常量
Final修饰的变量:要么在声明时直接初始化,要么在构造方法中初始化;
一般设计为公开的、静态的常量,使用public static final修饰的变量,要么在声明时直接初始化,要么在静态代码块中初始化。

2、修饰方法
不能被子类覆盖(重写)

3、修饰类
不能被继承(或扩展)
例如:java.lang.String类就是一个final类

abstract-抽象的

功能

可以修饰方法、类

特点

1.当父类中某个方法不知如何去实现时,可以将其定义为抽象方法:将方法体去掉,使用;代替,添加abstract修饰符。该抽象方法最终由子类实现(覆盖)
2.java规定,有抽象方法的类也必须是抽象类,也使用abstract修饰,注意:抽象类不能直接new对象,但是可以作为父类引用指向子类对象同样满足多态三个定理。

应用

1、修饰方法
[修饰符] abstract 返回值类型 方法名(参数表) [throws 声明抛出的异常类型,…];
2、修饰类

[修饰符] abstract class 类名 [extends 父类] [implements接口1,接口2,…] {
      一般具有抽象方法
}

【注意点】
1)抽象类中有构造方法可以初始化属性和实例变量
2)抽象类不可以被实例化
3)可以定义为抽象类的引用,通过此引用指向子类对象,同样满足多态的三个定理
4)一个类B如果继承抽象类A,就必须实现A类中的抽象方法。如果B类不实现抽象方法,也必须定义为抽象类。
5)abstract修饰的方法最终一定会被非抽象子类实现(覆盖)

各修饰符区别

1)abstract和final不能同时使用。因为Abstract方法必须被子类实现,final方法不能被子类覆盖;
2)abstract和private不能同时使用,private方法不能被子类继承
3)abstract和static不能同时使用,static方法不能被覆盖
4)abstract只能和public或者protected同时使用

public\protect\private访问权限

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值