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

简介: 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对象表示的类或接口声明的所有字段。 这包括公共、受保护、默认(包)访问和私有字段,但不包括继承字段。


相关文章
|
15天前
|
Java
Java中的抽象类:深入了解抽象类的概念和用法
Java中的抽象类是一种不能实例化的特殊类,常作为其他类的父类模板,定义子类行为和属性。抽象类包含抽象方法(无实现)和非抽象方法。定义抽象类用`abstract`关键字,子类继承并实现抽象方法。抽象类适用于定义通用模板、复用代码和强制子类实现特定方法。优点是提供抽象模板和代码复用,缺点是限制继承灵活性和增加类复杂性。与接口相比,抽象类可包含成员变量和单继承。使用时注意设计合理的抽象类结构,谨慎使用抽象方法,并遵循命名规范。抽象类是提高代码质量的重要工具。
27 1
|
13天前
|
Java 调度
Java中常见锁的分类及概念分析
Java中常见锁的分类及概念分析
15 0
|
14天前
|
算法 Java 开发者
Java中的多线程编程:概念、实现与性能优化
【4月更文挑战第9天】在Java编程中,多线程是一种强大的工具,它允许开发者创建并发执行的程序,提高系统的响应性和吞吐量。本文将深入探讨Java多线程的核心概念,包括线程的生命周期、线程同步机制以及线程池的使用。接着,我们将展示如何通过继承Thread类和实现Runnable接口来创建线程,并讨论各自的优缺点。此外,文章还将介绍高级主题,如死锁的预防、避免和检测,以及如何使用并发集合和原子变量来提高多线程程序的性能和安全性。最后,我们将提供一些实用的性能优化技巧,帮助开发者编写出更高效、更稳定的多线程应用程序。
|
5天前
|
存储 Java 数据库连接
java DDD 领域驱动设计思想的概念与实战
【4月更文挑战第19天】在Java开发中,领域驱动设计(Domain-Driven Design, DDD) 是一种软件设计方法论,强调以领域模型为中心的软件开发。这种方法通过丰富的领域模型来捕捉业务领域的复杂性,并通过软件满足核心业务需求。领域驱动设计不仅是一种技术策略,而且还是一种与业务专家紧密合作的思维方式
22 2
|
5天前
|
监控 Java 开发者
掌握 Java 反射和动态代理
【4月更文挑战第19天】Java反射和动态代理提供强大功能和灵活性。反射允许运行时检查和操作类,获取类信息、动态调用方法,但可能带来性能损失和降低代码可读性。动态代理则用于创建代理对象,实现透明性和横切关注点分离,常用于日志、权限检查等。两者结合能实现更复杂功能。掌握这些技术能提升代码的灵活性和可扩展性,但也需注意性能和可读性。通过学习和实践,能更好地构建高效软件系统。
|
11天前
|
Java
代码的魔法师:Java反射工厂模式详解
代码的魔法师:Java反射工厂模式详解
24 0
|
14天前
|
设计模式 算法 Java
23种设计模式,模板方法模式的概念优缺点以及JAVA代码举例
【4月更文挑战第10天】模板方法模式是一种行为设计模式,它定义了一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些特定步骤。
14 0
|
15天前
|
设计模式 Java
23种设计模式,状态模式的概念优缺点以及JAVA代码举例
【4月更文挑战第9天】状态模式是一种行为设计模式,允许一个对象在其内部状态改变时改变它的行为,这个对象看起来似乎修改了它的类。
26 4
|
15天前
|
安全 Java
java反射篇
java反射篇
|
15天前
|
Java 关系型数据库 MySQL
大厂面试题详解:Java抽象类与接口的概念及区别
字节跳动大厂面试题详解:Java抽象类与接口的概念及区别
40 0