【总结】
【jdk】: 是java标准开发工具包,下载的时候一般也是下载的JDK;
【jre】: java必不可少的运行环境。
【jvm】: 本身只是虚拟机,java虚拟机是jre的一部分。
跨平台性,是指java语言编写的程序,一次编译之后形成 .class文件 可以在多个系统平台上运行。
java程序通过不同系统平台安装不同的jre,以屏蔽底层操作系统的差异,实现跨平台运行,只要该系统安装相应的jre,该系统就能运行该程序。
至于为什么只强调java语言的跨平台性,而不强调python的跨平台性?—>因为java语言比其他能跨平台语言开发的要早,在java之前,主流语言只有c和c++,c和c++不能在linux上运行,java语言能够在不同操作系统上运行的也不是java文件,而是经过编译成功后的class文件,才能在windows上和linux上运行,所以说java一次编译到处运行;而且,这个优势是针对c和c++而言的,不针对python,因为python也能在不同操作系统运行,但是python出现的晚,早期只有java能实现跨平台,所以一般只强调java的跨平台性。
字符串常量池是由JVM提供的,用来存储常量的内存空间,可以提高性能和减少开销;有String字符串常量池、包装类常量池等。
**代码单元:**指字符在编码中占据的比特数;在具体编码形式中的最小单位,基本的多语言级别,每个字符用16位表示代码单元。
**码点:**指与一个编码表中的某个字符对应的代码值
如果a=10;a=a++;//输出a=10,会失效
如果a=10;b=a++;//输出b=11
有左移( << )、右移(>> ) 、无符号右移( >>> ) 、位与( & ) 、位或( | )、位非( ~ )、位异或( ^ )
1、a = a << 3;往左移动三位,超出的会删掉,右边补0,相当于乘了2的3次方
2、移位运算比a64运算速度快
3、超范围计算会结果出错
4、计算机内部把乘法拆成了移位运算;a万亿级别的数字,最多有40个数 2的指数相加
5、如果乘的数是2的n次方,则一次性移动n位,如果乘的是2的n+m+i等,则拆成了几个2的n次方,就移动几次
6、向右移动为乘法,向左移动为除法
7、向右移动几位,就在左边移动几个符号位
8、无符号:a >>> 5向右移动4位,左边补4个0
1)final修饰的是常量,不可以被第二次赋值
2)final修饰的类不可以被继承
3)final修饰的方法不可以被重写(覆盖),可以重载。// final int B = 20;
4)final防止指令重排序,保障多线程下的并发安全
定义常量一般用大写
final 修饰变量、方法、类,分别表示变量是一个常量,不能再被赋值;方法不能被重写;类不能被继承。也可以防止指令重排序,保证多线程下的安全性。
finally 用在try-catch(保证线程不会被中断)语句中,finally后面跟着的代码块表示无论是否抛出异常,改代码块一定会被执行。
一般用于需要释放资源的情况(资源一定会关闭,避免堆积)。
finalize 是Object类的方法,每一个对象都有这么个方法,在该对象被回收的时候被调用,因为无法确定该方法什么时候被调用,很少使用。
"static"关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。
static修饰的是在方法区当中
1、修饰变量—>类变量,被所有该类产生的对象共享
2、 修饰方法—>
(1)static修饰的两个方法可以互相调用(类方法可以调用类方法);
注意:this修饰的关键字,不能在static修饰的方法中出现,因为this属于当前对象,static是属于类的,有类不一定有对象。
(2)static修饰方法不能调用非static修饰的方法(类方法不能调用非类方法);
(3)非static修饰方法能调用static修饰的方法(非类方法可以调用类方法)。
因为类是构建对象的模板,那一定是现有类方法才能有对象方法;有类方法不一定有对象方法。
3、修饰代码块——在main方法执行前执行;main方法是程序执行的入口,但不是第一个执行的
Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。
static变量在Java中是属于类的,它在所有的实例中的值是一样的。当类被Java虚拟机载入的时候,会对 static变量进行初始化。如果代码中尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建岀来,还没有跟任何实例关联上。
用来判断instanceof左侧的句柄记录的对象类型 是否是右侧的类型或右侧的子孙后代类型。
(判断对象是否属于某个类或其子孙后代类的实例)
子类构造方法调用父类构造方法的注意事项有哪些?
子类构造方法调用父类构造方法需要使用super关键字
super()关键字注意事项:super在调用父类中的构造方法时,应该放在构造方法的第一行。
1)当父类当中使用的是无参构造器,子类的构造函数当中不需要显示的调用父类的构造函数。
2)当父类当中只有带参数的构造函数的时候,子类当中必须显示的调用父类当中的构造函数。
3)当父类当中既有无参构造函数又有带参构造函数的时候,子类可以选择调用父类的构造函数(可以调用有参的,也可以调用无参的)。
java中提供了以下四种创建对象的方式:
前两者都需要显式地调用构造方法。对于clone机制,需要注意浅拷贝和深拷贝的区别;对于序列化机制需要明确其实现原理,在java中
序列化可以通过实现Exte rnalizable或者Se rializable来实现。
可以,final Person[] persons = new Persion[]{} . persons是不可变对象的引用,但其数组中的Person实例却是可变的。这种情
况下需要特别谨慎,不要共享可变对象的引用。这种情况下,如果数据需要变化时,就返回原对象的一个拷贝。
1、Object()
默认构造方法
2、clone()
创建并返回此对象的一个副本(复制对象)
3、equals(Object obj)
指示某个其他对象是否与此对象"相等"。
4、finalize()
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法,该方法用于释放资源。
5、getClass()
返回一个对象的运行时类,获得类型的信息。
6、hashcode()
该方法将对象的内存地址进行哈希运算,返回一个int类型的哈希值(返回该对象的哈希码值)。功能:是相等对象拥有相同的哈希码,尽量让不等的对象具有不同的哈希码。
7、notify()
唤醒在此对象监视器上等待的单个线程。
8、notifyAll()
唤醒在次对象监视器上等待的所有线程。
9、toString()
返回该对象的字符串表示。以便用户能够获得一些有关对象状态的基本信息。简单说就是利用字符串来表示对象。
10、wait()
导致当前的线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法。
11、wait(long timeout)
导致当前的线程等待,直到其他线程调用此对象的notify()方法或notifyAll()方法,或者超过指定的时间量。
12、wait(long timeout, int nanos)
导致当前的线程等待,直到其他线程调用此对象的notify()方法或notifyAll方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。