static final 内部类

1 static关键字

1.1 static关键字概述
类中的属性和方法都是通过创建本类对象调用的,当在调用对象的某个方法时,这个方法没有访问到对象的特有数据时,方法创建这个对象有些多余,可是不创建对象,方法又调用不了,这时能不能不创建对象,就实现调用方法呢?
可以通过static关键字来实现。static,静态修饰符,一般用来修饰类中成员变量和成员方法。

1.2 静态成员的特点
A:随着类的加载而加载,生命周期最长。
B:优先于对象存在。
C:被static修饰的成员变量属于类,不属于这个类的某个对象,多个对象共享同一个static成员变量。一个对象修改了static成员变量值,其他对象中的static成员变量值跟着改变
D:比非静态成员多了一种访问方式,可以通过类名直接调用。建议用类名.调用

//多个对象共享同一个static成员变量
class Demo {
    public static int num = 100;
}
class Test {
    public static void main(String[] args) {
        Demo d1 = new Demo();
        Demo d2 = new Demo();
        d1.num = 200;
        System.out.println(d1.num); //结果为200
        System.out.println(d2.num); //结果为200
    }
}

1.3 static使用场景
什么时候需要使用static修饰成员变量呢?
当类中的成员需要被所有对象共享时,用static修饰。不需要被共享时,就不用static修饰。简单说:共性用static修饰,特性不用static修饰。
举例:
  班级的学生应该共用同一个班级编号
  饮水机(用静态修饰)
  水杯(不能用静态修饰)
什么时候使用static修饰成员方法?
静态的方法只能访问静态的成员,如果静态方法中引用到了静态的其他成员,那么这个方法需要声明为静态的方法。

1.4 静态只能访问静态
A:静态只能访问静态。静态方法只能访问静态的成员变量和方法
B:静态方法中不能使用this,super关键字。静态是随着类的加载而加载,this是随着对象的创建而存在。静态比对象先存在。

访问静态成员的格式:
  类名.静态成员变量名
  类名.静态成员方法名(参数)
  对象名.静态成员变量名 ------不建议使用该方式,会出现黄线警告
  对象名.静态成员方法名(参数) ------不建议使用该方式,会出现黄线警告

class Demo1 {
    public static int num = 100;
    public static void method(){
        System.out.println("静态方法");
    }
}
class Demo {
    public static void main(String[] args) {
        System.out.println(Demo1.num);
        Demo1.method();

        Demo1 d = new Demo1();
        //d.num;    //AssignmentOperator Expression
        System.out.println(d.num);//黄线警告
        d.method();//黄线警告
    }
}

1.5 静态代码块在类中加载流程?
静态代码块--构造代码块--构造方法。

1.6 对象中的静态调用
在多态中,非静态编译看父类,运行看子类,父类没有编译失败。
但多态中的静态方法,编译看父类,运行仍然看父类。因为静态和对象没有关系,属于静态绑定。

public class Test{
    public static void main(String[] args){
        Fu f = new Zi();
        f.show();   //父类的引用和父类的方法绑定,和对象无关,不会在运行时动态的执行子类特有的方法。
    }
}

1.7 static定义静态常量
通常使用public static final修饰,此时变量名用全部大写,多个单词使用下划线连接。
格式:public static final 数据类型 变量名 = 值;
public static final String COMPANY_NAME = "博客园";

注意:
接口中的每个成员变量都默认使用public static final修饰。
所有接口中的成员变量已是静态常量,由于接口没有构造方法,所以必须显示赋值。可以直接用接口名访问。
interface Inter {
  public static final int COUNT = 100;
}
访问接口中的静态变量:Inter.COUNT

2 final关键字

2.1 final关键字概述
类不想被继承,或类中部分方法不想让子类重写时,可以使用final关键字,final的意思为最终,不可变。
final修饰类,此类不能被继承。
final修饰方法,方法不能被重写
final修饰变量,变量就成了常量,只能被赋值一次,值不能被修改。常量的命名规范:要求大写。final int PI = 3.14;
final修饰基本类型变量,是值不能被改变
final修饰引用类型变量,是地址值不能被改变,对象中的属性可以改变

2.2 final修饰成员变量必须声明时就赋值吗?
修饰成员变量,需要在创建对象前赋值,否则报错。但是特殊情况:在构造方法可以给final修饰的变量赋值,当没有显式赋值时,多个构造方法的均需要为其赋值。
final修饰变量的初始化时机:
  显式初始化
  在对象构造完毕前即可

class Demo {
    //直接赋值
    final int m = 100;

    //final修饰的成员变量,需要在创建对象前赋值,否则报错。
    final int n;
    public Demo(){
        //可以在创建对象时所调用的构造方法中,为变量n赋值
        n = 2016;//注释此处则报错:n没有被初始化
    }
    public static void main(String[] args) {
        Demo demo = new Demo();
        System.out.println(demo.m);
        System.out.println(demo.n);
    }
}
>>>
100
2016
上一篇:phpstudy 500 Internal Server Error 解决办法


下一篇:plsql和tsql常用函数比对