java是一门高级编程语言,他继承了c++面向对象的优点,还摒弃了c++多继承和指针。java还添加了垃圾回收机制,让程序员不再考虑内存回收的问题。
java的特点有:跨平台性、面向对象、面向网络编程、多线程、安全性、可靠性
jdk:java开发工具包,包括jre和编译器和其他开工具。
jre:java运行环境,包含了jvm和java类库及java命令等
jvm:java虚拟机,是jre的一部分,负责解释执行java字节码文件,不同的平台有对应的jvm,字节码文件是面向jvm的
首先字节码是面向jvm,而不是面向平台。每个平台都有特定jvm来处理j字节码文件,这就反应了java语言的跨平台性,java语言可以一次编译,到处运行。其次字节码解决了解释型语言执行的效率低的问题,同时保留了解释型语言的可移植性
注:解释型语言:一行一行解释语言 编译型语言:一次性翻译语言
java类型包含两种:一种是基本类型,另外一种就是引用类型
基本类型包括:整型 byte short int long 浮点型 float double 字符型 char 布尔型 boolean
引用类型包括:类 接口 数据
首先介绍一下基本类型都是有包装类型
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Charter
boolean Boolean
接着说一下基本类型为什么要有包装类型,主要是为了让基本类型拥有对象的属性和行为,可以让我们操作。
基本类型和包装类型的区别
1、包装类型要使用new来创建,而基本类型直接使用
2、基本类型将变量存储在栈中,而引用类型是将对象放在堆中
3、初始值不同,int的初始值为0,boolean的初始值为false,包装类型的是null
1、fianl修饰变量,变量不可变,可理解为常量
2、fianl修饰类,类不可被继承,为最终类
3、final修饰方法,该方法不可被重写
public 所有的类都可以访问
protected:同一包下的类及其子类可以访问
default:同一包下的类可以访问
private:在同一类中可以访问
continue:结束本次循环,进行下一次循环
break:结束整个循环
return:结束方法,返回结果
final可以修饰类、方法和变量。
fianlly通常和try-catch一起使用,一般用来释放资源,finally中的代码,无论代码是否异常,都会执行
finalze是在gc启动,每次对象回收,都会调用
一般来说对象只用被new创建的时候,才能调用对象的数据。但是有时候我们需要对象没有被创建的时候就可以调用某些方法和对象,所以就有了static,被static修饰的方法和变量,会在类被加载的时候就被赋予空间,所以,我们在对象没被创建的时候,就可以调用static修饰的变量和方法了
显然这是不行的,因为static是在类被加载的时候就被分配空间,而非static变量是在对象创建后才能被调用,如果对象没有被创建,而这时候static去调用非static的变量,就会出现错误。
面向对象,是将有一些方法和属性封装起来,而其中方法和属性我们不需要管怎么实现的,我们只要将其用起来就行了,就像洗衣机怎么运行的,我们是不用管的,只要会用洗衣机就行了。
面向过程,就是要一步一步将方法实现出来,就像我们直接用手洗衣服,要一步步去洗才行。
封装:就是将客观事物封装成抽象的类,类可以把自己的属性和方法让可信的类或者对象访问,对于不可信就进行信息隐藏
继承:就是子类继承父类,子类不仅获取了子类的属性和方法,还可以在父类的基础上进行扩展。
多态:就是父类的属性和方法被子类继承之后,可以有不同的数据类型和行为,这可以让同一个属性和方法在父类和其他子类中具有不同意义
为了在网络传输和持久化
什么是序列化?序列化就是将对象转换成字节流进行传输和持久化
定义在类里面的类就叫做内部类
内部类的作用
1、成员内部类:可以访问外部类所有成员属性和成员方法
2、局部内部类:就是定义在一个方法或者是域中的类
3、匿名内部类:就是没有名字的内部类
4、静态内部类:就是static修饰的内部类
重写发生在子类和父类之间,方法名、返回值和形参都不能改变
重载是发生在一个类中,方法名相同,形参不同,返回值可以相同也可以不相同
不可以,因为调用的时候不指定类型。
抽象类的方法可以是具体的,而接口的方法只能是public abstract 方法
抽象的变量可以是任意的类型,而接口的变量只能是public static fianl类型
抽象可以有静态代码块和方法。接口不能有
一个类只能继承一个抽象类,且可以实现多个接口
不可以,抽象类的定义是为了让类继承,也final修饰的类是最终类,两者相互矛盾
new 反射机制 clone机制 序列化
不可变对象就是一旦创建就不能被改变,对其修改,其实就是生成新的对象,好处就是线程安全
==对于基本类型比较的就是值是否相同 对于引用类型,则是比较的是引用地址是否相同
equals其实本质就是 ==,如果equals方法重写了就是比较值相等,如String和Integer对象
hashcode方法主要的作用就是获取哈希吗,也叫散列码,返回一个int数据,根据哈希吗来确定对象在哈希表中的索引位置。哈希表存储是键值对,可以通过键快速得出值
以hashset如何来检查对象是否重复为例
当一个对象加入hashset中,首先通过hashcode来判断对象加入的位置,同时的话还会和其他hashcode进行比较,如果没有相同的,就说明没有重复,如果重复的话,就调用equals方法进行比较,如果相同,证明重复,如果不相同,就散列到其他的位置。通过hashcode先比较,减少了equals方法的比较,提高了效率
hashcode相同,对象不一定相等
equals相等,对象一定相等
判断对象是否相等的时候,首先是进行hashcode是否相等,相等之后再进行equals是否相等。如果值重写equals方法,而没重写hashcode的话,那么就造成hashcode不相等,equals的结果可能为true
String是不可变对象,每次对其操作,都是生成新的对象
StringBuilder和StringBuffer可以在原来对象上进行操作
StringBuilder是线程安全,而StringBuffer是线程不安全,但效率是比StringBuider要高的
1、便于实现字符串池
因为在java中会大量使用String,每次操作都会生成一个新的对象,造成内存的浪费,之后就有了字符串池,初始化String变量的时候,如果该字符串已经存在,就不会再创建一个新的对象,而是会在字符串池中里调用
2、多线程安全
不可变性和常量池优化及其被fianl修饰
因为String是不可变性,所以在创建字符串的时候,其hashcode已经被缓存下来,不需要重新计算,所以其效率肯定是比其他字段要高
int是基本类型,integer是引用类型
int存储的数值,而integer其实是对象的引用,存储的是引用地址
int的初始值为0,integer的初始值为null
int可以直接使用,而integer必须实例化后使用
非new的变量指向的是常量池中的对象,而new的变量指向的是堆中的对象。存储的位置不一样
在运行状态中,对于任何一个类的属性和方法,都能都知道,并且可以调用其属性和方法。
1 字符常量是以单引号引起来的单个字符,而字符串常量是以双引号引来的0个或者多个字符
2 字符常量可以看做是一个整数,可以参加运算,而字符串常量其实对应的是一个内存地址
3 字符常量在java中占2个字节,而字符串常量占若干个字节
在日常开发中,我们经常会用到字符串,每次操作字符串就会生成新的对象,这样很浪费内存,所以就产生了一个概念就是字符串常量池,当我们在赋值的时候,不是先去创建一个新的对象,而是先去字符串常量池中去看看有没有相同的字符串,如果有就去引用字符串常量池中的对象
1、可以通过Class.forName
2、类名.Class
3、对象名.getClass
1 Class 反射的核心类,可以获取类的属性和方法
2 Field 表示类的成员变量
3 Method 表示类的方法
4 Constructor 表示类的构造方法
1、第一步是获取到类的Class对选哪个
2、第二步就是获取到类的方法
3、第三步通过反射api来进行操作
泛型就是将类型参数化,只又在编译的时候才被确定下来
1、在编译期就能检测出类型转换的错误,错误越早发现越好
2、消除了类型的强制转化,使用的时候就能准确获取到想要的类型。
不会,因为序列化只针对对象,而static的不是对象,是属于类
Error和Exception有共同的父类是Trowable
Error程序无法进行处理,不能被cathc捕获,如内存不足,系统崩溃等。而Exception是程序可以处理的异常,可以被catch捕获到,io异常,SQLException,ClassNotFoundException等
未完待续-------