abstract、final、static关键字

用于定义类、方法、变量修饰符的关键字 abstract、final、static

一、abstract
1、作用
(1)修饰类
抽象类可以被继承和实现,但是这个类本身不能实例化;
抽象类中可以没有抽象方法,但类中有抽象方法一定是抽象类
抽象类中可以没有抽象方法,这样做的作用是这个类不能被实例化;
抽象类的子类在继承抽象类后,必须把父类中的抽象方法重写,否则子类也是抽象类;
(2)修饰方法
抽象方法必须在抽象类中,抽象类中可以有非抽象的方法;
抽象方法用于被子类继承后重写,也就是父类的抽象方法是空的,必须由子类继承之后在子类中由子类实现,这可以达到不同子类可以根据自己的特性来定义自己从父类继承过来的抽象方法。

2、与其他关键字不共存
abstract不能与final关键字共存,因为final关键字修饰的类不能被继承;
abstract不能与private关键字共存,因为私有的东西不能继承;
abstract不能与static关键字共存,当static修饰方法时,该方法可以通过类名直接调用,而abstract修饰的抽象方法没有实体,是不能被调用的;
abstract修饰 的类中的普通方法可以通过该抽象类的子类直接调用。

3、好处
抽象类的好处:
(1)由于抽象类不能被实例化,最大的好处就是通过方法的覆盖来实现多态的属性。也就是运行期绑定
(2) 抽象类将事物的共性的东西取出来,由子类继承去实现,代码易扩展、易维护。

二、final
1、作用
(1)修饰类
当final修饰类时,表示该类为最终类,无法被继承。
(2)修饰方法
当final修饰方法时,表示该方法将成为最终方法,无法被子类重写。但是,该方法仍然可以被继承。
(3)修饰变量
final修饰的变量在定义时,必须初始化,系统不会默认赋值。
当final修饰一个变量时,则表示该变量已成为一个不可变常量, 如果尝试对final变量多次赋值,编译器将报错。
(4)修饰引用
一个引用为引用数据类型,如:对象、数组,则该对象、数组本身可以修改,但是指向该对象或数组的地址的引用不能修改

2、应用场景
(1)若一个方法已经完整了,想要其在子类中不改变,可用 final 关键字。
(2)final经常和static一起使用,用来声明常量。

三、static
1、作用
(1)修饰成员方法
(2)修饰成员变量
(3)修饰代码块
静态代码块:
用大括号"{…}"包围起来的代码 定义在类中方法外,静态代码块在非静态代码块之前执行(静态代码块—非静态代码块—构造方法)。如果静态代码块有多
个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次;
(4)修饰内部类
静态内部类:
它与非静态内部类之间存在一个最大的区别:非静态内部类在编译完成之后会隐含地保存着一个引用,该引用是指向创建它的外围内,但是静态内部类却没有。没有这个引用就意味着:
A、它的创建是不需要依赖外围类的创建
B、它不能使用任何外围类的非static成员变量和方法
【应用】:静态内部类实现单例模式

package static_inClass;

//静态内部类实现单例模式
public class Singleton {
    //声明为 private 避免调用默认构造方法创建对象
    private Singleton(){}

    //声明为 private 表明静态内部该类只能在该Singleton 类中被访问
    private static class SingletonHolder{
        private static final Singleton Instance=new Singleton();
    }
    
    public static Singleton getInstance(){
        return SingletonHolder.Instance;
    }
}
//当Singleton 类被加载时,静态内部类SingletonHolder没有被加载进内存。只有当调用
//SingletonHolder.Instance时,SingletonHolder 才会被加载,此时初始化Instance
实例,并且JVM能确保Instance只被实例化一次。
//这种方式不仅具有延迟初始化的好处,而且由JVM 提供了对线程安全的支持。

(5)static最关键作用,就是和对象解绑
1. 静态属性-----属于类,不属于方法或某个对象
2. 静态方法-----没有一个隐式的当前对象引用this

2、访问权限
(1)在静态方法中无法使用非静态的内容,
(2)在静态方法中,无法访问普通属性,无法调用普通方法,无法 使用this 关键字

3、属性(包括静态属性)的初始化规则
(1)初始化的方式:
静态属性:
1)定义时直接初始化
2)静态代码块初始化
普通属性:
1) 定义时直接初始化
2) 初始化代码块时初始化
3)在构造方法中
(2)初始化的时机:
静态属性: 类被加载到内存中时
普通属性: 对象被实例化时
(3)初始化的顺序
1)类的加载一定发生在对象实例化之前静态属性的初始化一定 在普通属性的初始化之前
2)静态属性初始化顺序,按照定义类时的书写顺序初始化
3)普通属性初始化顺序,定义和构造代码块按书写顺序初始化构造方法中的初始化一定发生在最后,和书写顺序无关
4、静态成员的特点:
(1)在类加载的时候,就进行创建和初始化或执行代码
(2)它们对于一个类来说,都只有一份,表现出共享的特性
(3)类的所有实例都可以访问到它们。
(4)静态成员可直接用类名去访问。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值