Java中类的加载机制和反射相关概念

举报
海风极客 发表于 2022/10/16 17:01:24 2022/10/16
【摘要】 本篇文章主要知识点因为最近在刷面试题,遇到了很多的基础问题都出了错,所以利用空闲时间大肆的回顾下基础,顺便总结出了一些知识点来进行分享,如果能帮助到你请点个赞吧!1.Java一个类中代码的执行次序2.当一个子类继承父类时,子类实例化时,子类和父类代码的执行次序3.final关键词的一些验证4.反射到底都能获取类的什么东西下面我们来依次进行试验: 1 Java中代码的执行次序我们来新建一个类...

本篇文章主要知识点

因为最近在刷面试题,遇到了很多的基础问题都出了错,所以利用空闲时间大肆的回顾下基础,顺便总结出了一些知识点来进行分享,如果能帮助到你请点个赞吧!
1.Java一个类中代码的执行次序
2.当一个子类继承父类时,子类实例化时,子类和父类代码的执行次序
3.final关键词的一些验证
4.反射到底都能获取类的什么东西

下面我们来依次进行试验:

1 Java中代码的执行次序

我们来新建一个类,一个类中的东西也无非就是属性(private、public修饰等等)方法(private、public修饰等等)静态代码块非静态代码块构造方法(有参和无参)

class People {
    private String str = "People";

    private static final String VALUE = "I am people static VALUE";

    public People() {
        System.out.println("people 无参实例化");
    }

    public People(String str) {
        this.str = str;
        System.out.println("people 全参实例化");
    }

    static {
        //System.out.println(str);编译错误
        System.out.println(VALUE);
        System.out.println("I am people static part");
    }

    {
        System.out.println("I am people no static part");
    }

    public void method1() {
        System.out.println("I am people method1");
    }
}

public class article0604 {
    public static void main(String[] args) {
        People people=new People();
    }
}

运行结果:
在这里插入图片描述
由此我们知道了一个类中代码的执行机制(次序):
在这里插入图片描述

2 子类继承父类时代码的执行次序

下面我们把People作为父类,再创建一个Student子类:

class Student extends People {

    private String str = "Student";

    public Student() {
        System.out.println("student 无参实例化");
    }

    public Student(String str) {
        this.str = str;
        System.out.println("student 全参实例化");
    }

    static {
        System.out.println("I am student static part");
    }

    {
        System.out.println("I am student no static part");
    }

    @Override
    public void method1() {
        System.out.println("I am student method1");
    }
}

public class article0604 {
    public static void main(String[] args)  {
        Student student = new Student();
    }
}

运行结果:
在这里插入图片描述
由此我们可以得知:
在这里插入图片描述

3 final关键词的一些验证

首先看下Java中对于final关键字的一些解释:
final:用来说明最终属性,表明一个类不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变,用来定义常量

final修饰的类不能被继承:
在这里插入图片描述
final修饰的变量子类也不能继承
在这里插入图片描述
反射也不行

Class<?> clazz = Class.forName("test0604.Student");
Field[] fields = clazz.getFields();
System.out.println("参数个数:" + fields.length);
for (Field field : fields) {
    System.out.println(field);
}

运行结果:
0

4 反射到底都能获取类的什么东西

我们就以上边Student类来进行测试:

 public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException {
        Class<?> clazz = Class.forName("test0604.Student");
        //获取参数
        Field[] fields = clazz.getFields();
        Field[] declaredFields = clazz.getDeclaredFields();
        /*
        clazz.getDeclaredMethods()
        反映由这个class对象表示的类或接口声明的所有字段。 这包括公共、受保护、默认(包)访问和私有字段,但不包括继承字段。
         */
        Method[] declaredMethods = clazz.getDeclaredMethods();
        Method[] methods = clazz.getMethods();
        System.out.println("Declared方法:" + declaredMethods.length);
        System.out.println("public方法:" + methods.length);
        System.out.println("Declared参数:" + declaredFields.length);
        System.out.println("public参数:" + fields.length);
        System.out.println("遍历fields:");
        for (Field field : fields) {
            System.out.println(field);
        }
        System.out.println("遍历declaredFields:");
        for (Field field : declaredFields) {
            System.out.println(field);
        }
        System.out.println("遍历declaredMethods:");
        for (Method d : declaredMethods) {
            System.out.println(d);
        }
        System.out.println("遍历methods:");
        for (Method d : methods) {
            System.out.println(d);
        }

输出结果:
在这里插入图片描述
在这里注意下:
clazz.getDeclaredMethods():反映由这个class对象表示的类或接口声明的所有字段。 这包括公共、受保护、默认(包)访问和私有字段,但不包括继承字段。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。