一、JAVA跨平台性原因
java编译生成与平台无关的class字节码文件,要执行的时候只需要在不同操作系统下安装对应的JVM,JVM在执行字节码时,将字节码解析成具体平台上的机器指令执行。
二、JVM
即java虚拟机,它是一个虚构出来的计算机,是通过在实际计算机上模拟各种计算机功能实现的。JVM不具有跨平台性。
三、JRE
java的运行环境,JRE中包含JVM
四、JDK
java开发工具集,包含java开发和运行工具,JDK中包含JRE
--------------------------------------------------------------------------------------------------------------------------------
八大基本数据类型
整数型:byte,short,int,long 字节:1,2, 4, 8
小数型:float,double 字节:4, 8
字符型:char 字节:2
布尔型:boolean 字节:1
一个中文字符所占字节数: GBK:2 UTF-8 : 3
一个英文字符所占字节数: GBK:1 UTF-8:1
---------------------------------------------------------------------------------------------------------------------------------
++是否线程安全
不安全,它涉及多个指令,例如读取变量,增加,存储回内存,可能会出现多个线程交错。
前置++和后置++
前置++是对加一后的结果进行运算,而后置加加者是对加一之前的值进行运算。
&和&&的区别
&无论左边真假,右边都会进行运算,&&则是左边的如果为假,右边就不执行。
--------------------------------------------------------------------------------------------------------------------------------
switch
switch只支持int类型 ,但是由于byte,short,char都可以自动提示为int类型因此,也支持这几中基本数据类型
当判断进入到case后,只有遇到break、return才会停止运行
do while
即使判断条件为false,该循环至少会执行一次 。
continue
跳过continue所在的当次循环,开始下一次循环
return
结束循环所在的方法,方法内循环后的语句不执行
break
结束循环,方法内循环后的语句正常执行
--------------------------------------------------------------------------------------------------------------------------------
判断原则:同类中,方法名一样,方法参数列表不同(参数类型,参数个数,参数顺序);
覆写原则: 实例方法签名必须相同(方法签名=方法名+方法的参数列表);
子类方法的返回值类型的父类方法的返回值的子类或者相同.
子类方法声明抛出的异常应比父类方法声明抛出的异常更小或者相等.
子类方法的访问权限被父类的访问权限更大或者相等;
--------------------------------------------------------------------------------------------------------------------------------
初始化数组的两种方式:静态初始化,动态初始化 ,数组一旦初始化完成,数组的长度就固定了,不能改变,除非重新初始化。
静态初始化:int arr = {1,2,3} , int arr = new int [ ] {1,2,3}
动态初始化: int arr = new int[ 4 ];
数组算法操作
冒泡排序: 从头到尾依次比较相邻两个元素的大小,若大于就互换位置
二分搜索法: 先将数组元素排序, 获取数组的最大索引 , 最小索引 如果最大索引大于最小索引, 进行while循环, 如果这个值大于中间值,则最小索引为中间索引加一, 如果这个值小于中间值, 则最小索引为中间索引减一, 如果等于中间值, 要查询的值为这个。
方法的参数
只能出现在参数列表的最后,可变参数的本质其实就是数组; public void show(int ... arr){ }
--------------------------------------------------------------------------------------------------------------------------------
面向对象的三大特征 : 封装、继承、多态
比较对象,“==”与 equals 的区别:
“==”如果是基本数据类型,比较的是值, 如果是引用数据类型则比较的是数据引用内存地址值,即比较两个对象是否在堆内存引用同一块内存区域
equals 只能用用引用数据类型,其用法跟“==”一样,只是在String类中,覆写了父类Object的equals方法。比较的是字符串的值。
GC垃圾回收器:一个对象从new开始到该对象不被什么变量所引用时,该对象就是垃圾,等待GC垃圾回收器清理,但并不是垃圾对象一旦产生GC就会清理,这取决于JVM的调度,无法控制,可以手动回收 System.gc( );在垃圾回收器准备释放垃圾对象前,会自动调用该对象的finalize方法,对于指定的对象,垃圾回收器最多只调用一次finalize方法,垃圾回收器何时会调用finalize方法无法确定,大师建议不要使用finalize方法
匿名对象: 例: show(new data()); 匿名对象只能使用一次
Static修饰符: 使用static修饰的字段不是存储在堆内存,而是存储在独立于堆内存和栈内存的方法区内存中,可以被该类所有的对象共享;优先于对象,随着类的加载而加载.
--------------------------------------------------------------------------------------------------------------------------------
多态
instanceof: 由于判断对象是不是某一个对象的实例,子类。
静态代码块:只执行一次,可以由于给应用做初始化操作,加载资源等操作;
单例模式:饿汉模式:单例类被加载经内存,对象就建立好了
public class Dog {
private static Dog dog = new Dog();
public static Dog getDog(){
return dog;
}
//私有化自身构造器,防止外界通过构造器构造新的对象
private Dog(){
}
}
懒汉模式:对象是方法第一次需要时才创建,也称对象的延迟加载,但是这种方式可能会带来线程不安全。第一个线程进来判断 dog= null,还没有new 出实例的时候 。这个时候第二个线程也进来了,判断的dog是 null,然后也会 new 出实例的,这样就不是我们所要的单例模式了。那我们就需要加锁了,使用 synchronized 关键字。
public class Dog {
private static Dog dog = null;
public static Dog getDog(){
if (dog == null) {
dog = new Dog();
}
return dog;
}
//私有化自身构造器,防止外界通过构造器构造新的对象
private Dog(){
}
}
加锁
public class Dog {
private static Dog dog = null;
public static Dog getDog(){
synchronized(Dog.class){
if (dog == null) {
dog = new Dog();
}
return dog;
}
}
//私有化自身构造器,防止外界通过构造器构造新的对象
private Dog(){
}
}
final修饰符
final是唯一可以修饰局部变量的修饰符
final修饰的类不可被继承
final修饰的方法不可以覆写
final修饰的变量表示常量,只能被赋值一次,而且必须显示初始化
final修饰基本数据类型: 该变量的值不能被改变
final修饰引用数据类型:该变量的引用地址不能变,而不是运用地址的类型