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同时使用

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

被折叠的 条评论
为什么被折叠?



