一、自定义类是否都能正常运行
1、自定义与系统类同名的类不能正常运行
package java.lang;public class String {public void print(){System.out.println("中秋节快乐");}public static void main(String[] args) {new String().print();}
}
解析:在编写类中的代码和方法中的代码时不会报错,但是一旦运行main方法,在运行main方法时就会报错
2、自定义与系统类不同名的类能正常运行
package com.g;public class String {public void print(){System.out.println("中秋节快乐");}public static void main(java.lang.String[] args) {String s = new String();s.print();}
}
注意:main方法中String数组中的String类型必须使用系统中的String类的全类名
二、StringBuilder中的deleteCharAt()方法和append()方法(与栈的思想符合,栈的思想是后进先出)
public static void main(String[] args) {StringBuilder sb = new StringBuilder("abc");// 在字符串后面添加字符sb.append('d');System.out.println(sb.toString());// 从字符串尾部删除字符sb.deleteCharAt(sb.length() - 1);System.out.println(sb.toString());}
二、类加载器
1、类加载器的使用
将String类从String.class文件中加载到内存中要用到类加载器,在类加载时有一个很重要的过程叫双亲验证,如果java底层已经有了这个类,那么这个类是无法加载到内存中的
2、类加载的原因
在编写程序时先写好Car.java源代码,再将其进行编译变为Car.class字节码(JVM认识的,可以将其运行的),Car.java和Car.class在硬盘上无法运行,必须把Car.class加载进JVM能够识别的内存区域
3、类加载的时间
碰到new时
4、类加载的过程
(1)对于Class.forName("com.ffyc.Car"),从com.ffyc.Car文件夹里去查找找Car.class文件,有这个文件,则将此文件加载到内存里去,将Car.class文件加载到内存前还要对Car.class文件做一系列的检查
(2)将Car.class加载到JVM能够识别的内存区域时会创建一个Car.class对象,因此new 一个Car对象实际上时创建了两个对象(实例对象和类对象)
(5)Car.class文件无法加载进入内存的原因
Car.class文件---->>父-->>爷(检查发现Car.class文件对应的类信息已经有了,Car.class文件不用再加载进入内存)---->>父---->Car.class文件
(6)java环境在启动时,先启动bootstrap加载器,再启动ext加载器,最后启动app加载器
5、类加载中的反射
起反射作用的是Class对象,反射是反面向对象机制的,是直接去底层去访问的
三、JIT
1、jdk的新高度-JIT技术(Just In Time)
如果JVM控制的内存在程序运行时不够用了,那么程序可以直接调用物理内存
2、从一个Java源文件到new出对象的过程(均发生在调构造器之前)
Car.java源文件--------->>Car.class字节码文件---------->>new 了一下,准备进内存了--------->>经过双亲委托机制的判定看Car.calss文件是否需要加载到内存中------->>将变量和方法分到合适的内存位置上去------>>实例化new出真正的对象