JAVA Class9

学习内容:

1.final修饰词

(1)修饰类:

类无法被继承,但可以继承其他类

(2)修饰方法:

方法无法被子类重写

(3)修饰局部变量:

该变量只能被赋值一次

(4)修饰成员变量:

该变量必须在对象创建之前初始化,可以通过直接赋值、构造代码块或者利用构造器初始化

(5)修饰引用变量

该变量只有一次指向对象的机会,例:

final Hero h;

h = new Hero();

h = new Hero();//报错

public final class F {//不可被继承,但可以继承其他类
    //final int b = 0 ;创建时必须初始化
    final int b;
    F(int b){//创建对象前必须初始化且只能被赋值一次
        this. b =b;
    }
    public final void test1() {
        System.out.println("测试");
    }
    
    public static void main(String[] args) {
        final F f;//只可引用一次
        final int a;//只能赋一次值
        a = 5;
        f = new F(4);
        //f.b = 6;报错,只能赋值一次
        //f = new F();报错
        //a = 10;报错
    }
}

2.static修饰词

被static修饰的方法与成员变量被称为静态方法、静态变量或者类方法、类属性

(1)类方法可被类、实例化对象调用,类方法只能访问类属性

(2)类属性属于“共享”属性,需要在声明时被初始化,所有实例化对象共享一个值,一改全改,一般被用作常量,加final,使其只能被赋值一次,

类属性同样可由类、实例化对象访问,推荐使用类访问。

public class F {
    int w;
    int t = 10;
    static int s = 10; //类属性,共享值,必须被立即初始化
    static{ //静态初始化块
           s = 10;
    }
    public static void test() {
        //w = 2;//报错,静态方法只能访问静态值,但是非静态方法可以访问静态属性
    }
    public static void main(String[] args) {
        F h = new F();
        h.s = 20;//一改全改
        System.out.println(f.s);//20
        System.out.println(h.s);//20
        System.out.println(F.s);//类访问类属性,推荐
        //静态属性、方法进入如静态区,先于非静态属性、方法创建,
   //非静态方法、属性随着实例化对象的产生而产生,故而静态方法无法访问非静态属性。
} }

 3.内部类

 (1)成员内部类:

public class Test{
    int i = 8;
    class bt{
        int i = 7;
        public void t() {
            System.out.println(Hero.this.i);
        }
    }
    public static void main(String[] args) {
        h.new bt().t();/成员内部类必须在有一个外部类对象时才能存在,可访问外部类属性、方法
    }

}

(2)局部内部类

public class Test{
    public void inner() {
        class inner{
            public void te() {
                System.out.println("局部内部类");
            }
        }
        inner i = new inner();
        i.te();//方法内访问局部内部类
    }
}

(3)静态内部类

public class Test{
    int i = 8;
    static class win{
        int i = 8;
        public void t() {
            //System.out.println(Hero.this.i);//无法访问外部类属性、方法
        }
        public void tt() {
            System.out.println("静态内部类");
        }
    }
    public static void main(String[] args) {
        new win().tt();//静态内部类不需要一个外部类的实例为基础
    }

}

(4)匿名类

继承接口重写抽象方法:

public interface Test {
    public void test();
}

public class Test2{
    public static void main(String[] args) {
        new Test() {//匿名类,实例化同时当场重写方法
            public void test() {
                System.out.println("匿名类测试");
            }
        }.test();
        Test ta = new Test() {
            public void test() {
                System.out.println("引用匿名类");
            }
        };
        ta.test();
    }

}

继承一般类重写对象方法

public class T {
    public void test() {
        System.out.println("测试");
    }
}

public class TC {
    public static void main(String[] args) {
        T t = new T() {
            public void test() {
                System.out.println("匿名类");
            }
        };
        System.out.println(t);
    }
}

运行结果:,JVM分配一个TC$1的“虚拟”类名。

4.访问修饰符

5.代码块

(1)静态代码块,最高执行优先级,先于main方法执行,一般用于初始化类属性,只执行一次。

(2)构造代码块,先于构造方法执行,一般用于初始化对象属性,每实例化一个对象就执行一次。

(3)局部代码块,大括号分隔作用域。

public class Test{
    static{//静态代码块优于主方法、构造代码块执行,一般用于初始化类属性
        System.out.println("静态代码块");
    }
    public Hero(){
        System.out.println("构造方法");
    }
    {
        System.out.println("构造代码块");
    }
    
    public static void main(String[] args) {
        Test t = new Test();//构造代码块先于构造方法执行
        //局部代码块 大括号分隔作用域
        {
            int x = 9;
            System.out.println(x);//输出9
        }
        int x = 3;
        System.out.println(x);//输出3
    }

}
原文地址:https://www.cnblogs.com/whwjava/p/8681200.html