Java中类的加载机制和反射相关概念
【摘要】 本篇文章主要知识点因为最近在刷面试题,遇到了很多的基础问题都出了错,所以利用空闲时间大肆的回顾下基础,顺便总结出了一些知识点来进行分享,如果能帮助到你请点个赞吧!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)