JAVA知识点

1、类使用之前的经历:类加载、类验证、类准备、类解析、类初始化等几个阶段


2、成员变量和局部变量,局部变量占用的内存比较小


3、java引用变量类型:编译时类型、运行时类型


4、对象的实例变量不具备多态性


5、数值类型和布尔类型之间不能进行强制类型转换


6、判断强制类型转换是否会成功:instanceof运算符-可以保证程序更加健壮


7、enum关键字 用于定义枚举类


8、java.io.File类:新建、删除、重命名文件和目录;输入流/输出流:访问文件内容本身


9、按照流的流向来分,可分为输入流和输出流


输入流:只能从中读取数据,而不能向其写入数据
输出流:只能向其写入数据,而不能从中读取数据


注:数据从内存到硬盘,称为输出流


10、按照流的角色来分,可分为节点流和处理流


节点流:可以从/向一个特定的IO设备读/写数据的流




11、两个jVM之间不能共享数据,同一个JVM的所有线程、所有变量都处于同一个进程里


12、类加载(类初始化)的过程:加载、连接、初始化


13、当程序中使用任何类时,系统会为之建立一个java.lang.Class对象


14、可以通过继承ClassLoader基类来创建自己的类加载器


15、类连接的阶段:
 ->验证:用于检验被加载的类是否有正确的内部结构,并与其他类协调一致
 ->准备:负责为类的类变量分配内存,并设置默认初始值
 ->解析:将类的二进制数据中的符号引用替换成直接引用


16、java中对类变量制定初始值的两种方式:1、声明类变量时指定初始值;2、使用静态初始化块为类变量指定初始值


17、JVM初始化一个类包含如下几个步骤:
 ->假设这个类还没有被加载和连接,则程序先加载并连接该类
 ->假设该类的直接父类还没有被初始化,则先初始化其直接父类
 ->假如类中有初始化语句,则系统依次执行这些初始化语句




18、宏变量:对于一个final型的类变量,如果该类变量的值在编译时就可以确定下来。当程序中其他地方使用该变量时,实际上并没有使用该类变量,而是相当于使用常量




19、类加载器:负责将.class文件加载到内存,并为之生成对应的java


20、java中如何判断是否是同一个类:利用全限定类名作为标识;JVM中,一个类用其全限定类名和其类加载器作为其唯一标识


21、JVM启动时会形成由三个类加载器组成的初始类加载器层次结构
 ->Bootstrap ClassLoader  根类加载器
 ->Extrension ClassLoader 扩展类加载器
 ->System ClassLoader 系统类加载器 




21、在java程序中,获得Class对象的三种方式:
  ->forName(String className)
 ->调用某个类的class属性,例如:Person.class
 ->调用某个类的getClass()方法

 

22、java.lang.reflect.Proxy:用于创建动态代理类和代理对象的静态方法,也是所有动态代理类的父类

 

23、java移位运算符:java有三种移位运算符

 <<   左移运算符:一个数左移n位,就相当于乘以2的n次方

>>   右移运算符:一个数右移n位,就相当于除以2的n次方

>>>   无符号右移,忽略符号位,空位都以0补齐

 

24、JAVA创建对象的方法:

1) 使用new关键字:最常见也是最简单的创建对象的方式,通过这种方式可以调用任意的构造函数(无参的和有参的)。比如:Student student = new Student();

2) 使用Class类的newInstance方法:可以使用Class类的newInstance方法创建对象,这个newInstance方法调用无参的构造器创建对象,如:Student student2 = (Student)Class.forName("根路径.Student").newInstance(); 或者:Student stu = Student.class.newInstance();

3) 使用Constructor类的newInstance方法:该方法和Class类的newInstance方法很像,java.lang.relect.Constructor类里也有一个newInstance方法可以创建对象。我们可以通过这个newInstance方法调用有参数的和私有的构造函数。如: Constructor<Student> constructor = Student.class.getInstance(); Student stu = constructor.newInstance(); 这两种newInstance的方法就是大家所说的反射,事实上Class的newInstance方法内部调用Constructor的newInstance方法。这也是众多框架Spring、Hibernate、Struts等使用后者的原因。

4) 使用Clone的方法:无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去,用clone方法创建对象并不会调用任何构造函数。要使用clone方法,我们必须先实现Cloneable接口并实现其定义的clone方法。如:Student stu2 = <Student>stu.clone();这也是原型模式的应用。

5) 使用反序列化:当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象,在反序列化时,JVM创建对象并不会调用任何构造函数。为了反序列化一个对象,我们需要让我们的类实现Serializable接口。如:ObjectInputStream in = new ObjectInputStream (new FileInputStream("data.obj")); Student stu3 = (Student)in.readObject();

从上面的例子可以看出来,除了使用new关键字之外的其他方法全部都是转变为invokevirtual(创建对象的直接方法),使用被new的方式转变为两个调用,new和invokespecial(构造函数调用)。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值