说说java中常见修饰符final、static、abstract

Java中常用的修饰符(abstract,static,final)

1、abstract

1. abstract既可以修饰类(抽象类),又可以修饰方法(抽象方法)

  • abstract修饰类时,表示该类为抽象类,所谓抽象类就是指该类只是一个抽象的概念,不对应显示中的具体实例,所以abstract类不能实例化(例如,动物Animal是一个抽象类,他不能特制某一个具体的动物实体(例如狗,猫…)它只是所有动物抽象出来的一个概念)
  • abstract修饰的类只能被继承(例如,狗和猫等都继承自Animal类)
  • 被Abstract修饰的抽象方法(有abstract修饰的,方法体为空的方法)必须定义在抽象类中
  • 抽象类中的方法不一定都是抽象方法(例如get和set方法)
  • 抽象类的子类必须重写父类的抽象方法,除非子类也是抽象类(如果子类也是抽象类则可以不必实现父类抽象方法)
  • 当父类的抽象类中没有抽象方法时,子类直接继承不用做任何操作。

常见的不能被继承的类有:
  String StringBuffer Scanner

2、final:

final关键字既可以修饰方法,又可以修饰类还可以修饰属性

  • final修饰的类称为常量类,不能被继承。可以用final保证用户调用时动作的一致性,可以防止子类覆盖情况的发生。
  • final修饰的方法不能被子类重写
  • final修饰属性(变量),表示此属性为常量

  JAVA利用final定义常量(注意在JAVA命名规范中常量需要全部字母都大写):
    Final int AGE=10;
  常量的地址不可改变,但在地址中保存的值(即对象的属性)是可以改变的。
  对基本类型来说是其值不可变,而对对象属性来说其引用不可再变。

3、static修饰类、属性和方法

java里面static一般用来修饰成员变量或函数。但有一种特殊用法是用static修饰内部类,普通类是不允许声明为静态的,只有内部类才可以。

  • 在static方法中不能调用对象的属性和方法(因为对象的属性和方法在直接调用时还没有初始化,但static修饰的属性和方法不需要初始化)

  • static修饰的方法是静态方法(同静态代码块一样)是在类加载时就已经完成了初始化(甚至执行),而类的非静态属性和方法的 初始化是在对象分配内存、初始化零值以及设置对象头之后才执行的。
    [外链图片转存失败(img-6EPoBKqD-1565421927416)(01img/001.png)]
    [外链图片转存失败(img-j1bPiP8K-1565421927417)(01img/002.png)]

  • 对象的方法可以调用static修饰的属性和方法
    [外链图片转存失败(img-RHZtGBYF-1565421927418)(01img/003.png)]

注意:被static修饰的内部类可以直接作为一个普通类来使用,而不需实例一个外部类:

public class OuterClass {
    public static class InnerClass{
        InnerClass(){
            System.out.println("============= 我是一个内部类'InnerClass' =============");
        }
    }
}

public class TestStaticClass {
    public static void main(String[] args) {
        // 不需要new一个InnerClass
        new OuterClass.InnerClass();
    }
}  

当一个内部类没有使用static修饰的时候,是不能直接使用内部类创建对象,须要先使用外部类对象点new内部类对象及(外部类对象.new 内部类())

public class OuterClass {
    public class InnerClass{
        InnerClass(){
            System.out.println("============= 我是一个内部类'InnerClass' =============");
        }
    }
}

public class TestStaticClass {
    public static void main(String[] args) {
        // OutClass需要先生成一个实例,然后再new一个InnerClass();
        OuterClass oc = new OuterClass();
        oc.new InnerClass();
    }
}  

注意:如果内部类没事有使用static 修饰,是不能创建实例否则会报错

public class SyncDubbo2 {

static class Main {
    public int i = 10;
    public synchronized void operationSup(){
        try {
            i--;
            System.out.println("Main print i = " + i);
            Thread.sleep(100);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

 class Sub extends Main { //没有使用static修饰的内部类不能直接创建对象
    public synchronized void operationSub(){
        try {
            while(i > 0) {
                i--;
                System.out.println("Sub print i = " + i);
                Thread.sleep(100);        
                this.operationSup();
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public static void main(String[] args) {
    
    Thread t1 = new Thread(new Runnable() {
        @Override
        public void run() {  
            Sub sub = new Sub(); //此处内部类没用static修饰会报错误The value of the local variable sub is not used
                                 //没有使用static修饰的内部类不能直接创建对象
} }); t1.start(); } }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值