【Java基础】详解final和static

目录

final

修饰范围:

作用:

        修饰类:

        修饰属性:

        修饰方法:

成员变量赋值方法

        实例变量:

        类变量:

static

 修饰范围:

作用:

        修饰属性:

        修饰方法:

        修饰代码段:

        修饰类:

        修饰内部类:


 

final

修饰范围:

        类,属性,方法,局部变量

作用:

        修饰类:

                当final修饰类的时候,表示这个类不能被继承

        修饰属性:

                1. 当final修饰属性的时候,表示常量,只能被复制一次,赋值后不再改变

                2.当final修饰基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生改变

                3.当final修饰引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但是所指向对象的内容是可以发生变化的,例如可以修改类的属性值

                4.因为只能赋值一次,所以必须对final修饰的成员变量初始化,有两种方法

                        1.在变量声明的时候初始化

public final class Test01 {
    public final int a=12;        //直接初始化
}

                        2.在声明变量的时候不赋初值,然后再类的所有构造函数中对这个变量初始化

public final class Test01 {
    public final int a;

    public Test01(int a) {        //构造函数初始化
        this.a = a;
    }
}

        修饰方法:

                final修饰方法代表这个类可以被继承,但是这个类中用final修饰的方法不能被重写,但是可以被重载

                注意:重写的前提是子类在父类中能继承此方法,如果final修饰的方法同时权限是private,会导致子类不能继承到此方法,这时子类可以定义同名和同形参的方法,这里不会产生矛盾,因为根本就没有被重写

成员变量赋值方法

        实例变量:

        1.通过代码块赋值

public class Test04 {
    final int b;
    {
        b=10;
    }
}

        2.通过构造函数赋值

public class Test04 {
    final int b;

    public Test04(int b) {
        this.b = b;
    }
}

        3.直接赋值

public class Test04 {
    final int b = 10;
}

        类变量:

         1.通过静态代码块赋值

public class Test04 {
    final static int b;
    static {
        b=10;
    }
}

        2.直接赋值

public class Test04 {
    final static int b=10;
}

         3.类常量无法通过构造器赋值,因为被加载早于被实例

局部变量赋值方法

        1.在创建时赋值

public class Test04 {
    public void run(){
        final int c=10;
    }
}

        2.在使用之前一定要赋值!

public class Test04 {
    public void run(){
        final int c;
        c=10;                    //使用之前赋值
        System.out.println(c);
    }
}

static

 修饰范围:

        属性,方法,代码段,内部类(静态内部类或嵌套内部类)

作用:

        修饰属性:

                1.让属性随着类的加载而加载,是类变量,加载早于对象,不需要new即可加载

                2.类变量所在的类的所有对象共用这一个属性,存放在方法区中

                3.调用通过类名.类变量名

                4.不赋初值的话默认为0

        修饰方法:

                1.让方法随着类的加载而加载,是类变量,加载早于对象,不需要new即可加载

                2.类方法所在的类的所有对象共用这一个方法

                3.类方法内部可以创建临时变量,不能调用非静态的实例方法和实例变量,只能调用静态的实例方法和变量

                4.调用通过类名.类变量名

        修饰代码段:

                1.被static修饰的代码块,较静态代码块

                2.位置定义在方法之外,随着类加载执行且执行一次,优先于main方法和构造方法的执行

class test001{
    static {
        System.out.println("123");
    }
    public static void main(String[] args) {

        Test01 test01 = new Test01();
        System.out.println(test01.a);
    }
}
//先输出123再执行main方法

        修饰类:

                static不能修饰普通类

        修饰内部类:

                如果不用static修饰,就需要通过外部类的对象来创建内部类

class test001{
    class In {        //没有static
        public void Print(){
            System.out.println("5");
        }
    }
    public static void main(String[] args) {
        test001 t = new test001();
        In in = t.new In();        //通过test001的对象t间接创建In类的对象in
        in.Print();
    }
}

                如果用static修饰,就可以直接创建内部类

class test001{
    static class In {        //有static
        public void Print(){
            System.out.println("5");
        }
    }
    public static void main(String[] args) {
        In in = new In();        //可以直接创建
        in.Print();
    }
}

                1.被修饰的内部类可以直接作为一个普通类来用,而不需要一个外部类

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值