本篇文章主要知识点
因为最近在刷面试题,遇到了很多的基础问题都出了错,所以利用空闲时间大肆的回顾下基础,顺便总结出了一些知识点来进行分享,如果能帮助到你请点个赞吧!
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对象表示的类或接口声明的所有字段。 这包括公共、受保护、默认(包)访问和私有字段,但不包括继承字段。