Java知识点补充1

1.反射获取到Class类的3种方式

  • Class.forName("类的路径")

  • 类名.class

  • 实例.getClass()

2.Java创建对象的方式有4种

  • 通过new语言实例化一个对象

  • 通过反射机制创建对象

  • 通过clone()方式创建一个对象

  • 通过反序列化创建对象

3.内部类4种

  • C++中说法为嵌套类,Java说法为内部类

  • 静态内部类

  • 成员内部类

  • 局部内部类

  • 匿名内部类

(1)静态内部类

  • 声明static的内部类

  • 不能访问外部类的普通成员变量

  • 只能访问外部类的静态成员和静态方法

class outerClass{
    static class innerClass{}   //静态内部类
}

(2)成员内部类

  • 非静态内部类

  • 可以获得外部类的所有属性和方法

  • 不可以定义静态属性和方法

class outerClass{
    class innerClass{}   //成员内部类(普通内部类)
}

(3)局部内部类(很少使用)

  • 定义在代码块内部的类,类似于变量

  • 不能被public、protected、private以及static修饰

  • 能访问外部类的所有属性和方法

  • 只能访问方法中的final类型局部变量

class outerClass{
    public void mothed(){
        class innerClass{}   //局部内部类
    }
}

(4)匿名内部类

  • 没有类名的内部类

  • 不能使用class、extends、implements

  • 不能有构造函数

  • 不能定义静态成员、方法和类

  • 不能是public、protected、private、static

  • 只能创建匿名内部类的一个实例

  • 一个匿名内部类一定在new后面,且必须继承一个父类或实现一个接口

  • 匿名内部类是一个局部内部类,所以局部内部类的所有限制都生效,例如只能访问方法中的final类型局部变量

为什么必须是final类型的局部变量:

  • 首先final类型的局部变量在编译器就解析完成一直保留,然后例如下面案例在方法中创建一个线程,当方法执行完毕之后非final的变量都被销毁了,那么线程中的变量如果不是final类型就会出错,为了避免这一点所以必须为final类型

  • https://www.cnblogs.com/hwaggLee/p/4492425.html  

class outerClass{
    public void mothed(){
        Thread tread = new Thread(new Runnable() {      //匿名内部类
            @Override
            public void run() {
                
            }
        });
    }
}
原文地址:https://www.cnblogs.com/zhihaospace/p/12561441.html