Java基础
个人结合所学知识整理,如有错误理解敬请指正,感谢🙏
跨平台
- Java能够跨平台运行得益于其适配了不同平台的Java虚拟机JVM
- Java编程时生成的java文件需要在运行前先编译为.class文件,这些.class文件再由不同平台的JVM翻译为对应平台的机器指令,然后才能真正在这些不同的平台运行,因此,跨平台指的是Java文件或.class文件,而JVM不是跨平台的。
数据类型
1.数据类型
- Java中有两种数据类型,分别是基本数据类型和引用数据类型。
- 基本数据类型为:byte short int long float double boolean char,byte占用1字节,short占用2字节,int占用4字节,范围是-231~231-1
- 基本数据类型有默认值:byte默认值0,short默认值:0、int默认值:0、long默认值:0L、float默认值:0.0f,double默认值:0.0d,boolean默认值:false、char默认值:‘\u0000’
- 引用数据类型为:类(class)、接口(interface)、数组(list)、枚举(enum)、注解、字符串型(String、StringBuilder、StringBuffer)
2.包装类
- Java的基本数据类型除了boolean类型都有对应的包装类,分别是Byte、Short、Integer、Long、Float、Double、Character,包装类的默认值都是null
- Java是一种面向对象语言,而基本数据类型这种不符合面向对象理念的数据类型的引入是考虑到普遍的编程习惯,对应的包装类,遵循了面向对象的设计理念,可以在需要使用到Object方法时很方便的使用。
- 包装类之间可以进行转换,但是如果从大范围转换到小范围,比如int转为byte,很可能会导致数据精度丢失
3.自动拆箱和自动装箱
- 自动拆箱即可以将一个包装类型的对象直接赋值给基本数据类型,自动装箱即可以将一个基本数据类型的值直接赋值给一个包装类的引用。
- 使用场景:集合类的泛型只能是包装类、参数列表如果需要传入对象类型或者默认值是null的值,就需要用到包装类
4.包装类之间的大小比较
- 包装类一般不能直接进行==比较,因为其为引用数据类型,例如Integer和Double之间进行比较,需要先将它们拆装为基本数据类型再进行比较。
- Integer类型进行大小比较时,如果在范围-128~127之间,可以直接进行比较,因为为了效率,Java已经将这个区间的值放入到常量池中,而超过这个区间的值,则需要通过new的方式新建,此时引用地址不同,无法直接比较数值
面向对象
1.面向对象的思想
- 面向对象编程是一种更加优秀和编程方式,它将现实中的事物特征和行为抽象为类,以更加符合人类对现实认知的方式在程序中模拟现实事物的运行。相比面向过程编程时的事无巨细,面向对象更关心事物自身的行为特征和相互之间的关联,虽然程序效率比面向过程稍低,但编程速度会比面向过程快得多,且更易于理解。
- 面向对象的三大特征:封装、继承和多态
2.封装
- 封装即将对象的属性或方法通过private关键字隐藏起来,对外只暴露调用的接口方法,比如setter和getter
- 封装的目的是保持对象数据的完整性、安全性,防止被外部随意修改而产生严重的错误
- 封装的原则是内部各部分之间高内聚,与其他类之间低耦合
3.继承
- 继承指两个对象之间通过extends关键字产生子父类关系,子类会直接继承父类所有的非private的属性和方法
- 继承使代码量进一步减少,可重用性进一步提高,继承的的使用场景主要为当一些类具有共同的行为特征,但具体的实现又不同时,可以将这些具体的特征抽取到一个单独的类,然后再继承这个类即可,既使得代码更加规范,也在需要增加新的子类时更节省编程时间
- Java只支持直接单继承,既一个派生类只能直接继承一个父类,但是可以间接继承多个类,如父类的父类或所有类的基类Object
4.多态
- 多态的前提是继承,具体表现为父类引用指向子类实现,在编译期表现为父类类型,但在运行期表现为子类的行为特征
- 多态的必要条件:有继承关系,子类需要重写父类的方法,父类引用指向子类实现
- 多态的具有继承的所有优点,而当同一个类型的引用调用相同的方法时可能会表现出不同的结果,同时子类之间不会互相影响它们原有的属性方法,这又大大增加了代码的扩充性和灵活性。
5.重写和重载
- 重写发生在父子类中,子类重写父类方法时,方法名相同,参数列表相同,访问修饰符需要大于等于父类,抛出的异常需要小于等于父类,返回值类型要小于等于父类
- 重载发生在同一个类中,具有重载关系的方法之间方法名相同,参数列表不同,重载与返回值和修饰符无关
- 重写和重载都增加了代码的扩展性
访问修饰符
1.修饰成员变量和方法
- Java修饰成员变量和方法的修饰符有四个:default、public、private、protected
- default:默认的,能够被内部和同一个包下的成员访问
- public:公开的,能够被同一工程所有的包下的成员访问
- private:私有的,只能在内部访问
- protected:受保护的,能够被内部、同一包下及子类访问
2.修饰类
-
修饰类的修饰符有两个:default和public
-
default:默认的,能够被同一java文件和同一包下的其他类访问,一个java文件中可以编写多个default修饰的类,但编译后会生成独立的.class文件
-
public:公开的,可以被同一工程下所有类访问,一个java文件中只能有一个public修饰的类,且必须和java文件同名
final和static
1.final
- final表示最终的,不可变的
- 当修饰类时,这个类无法被继承;当修饰成员变量和方法时,成员变量无法被子类继承,方法无法被子类重写
- final修饰变量时,这个变量会变成一个常量,创建后被常量池管理,值无法被再次变更
2.static
- static表示静态的,被static修饰的成员会成为类成员,属于整个类而不再属于某个单独的对象
- static常用与静态代码块,作为初始化操作,随着JVM的启动而加载一次
- static修饰内部类时被称为静态内部类,修饰变量时成为静态变量,修饰方法时成为静态方法
- 静态变量和静态方法可以通过类名直接访问
- 类成员不能访问实例成员,因为类成员随着类的加载而创建,很可能会出现类成员已将创建完毕,实例成员还没初始化的情况
泛型
ArrayList<String> arr = new ArrayList();
1.泛型
-
泛型是JDK5时引用的特性,它的本质是参数化类型,即给类型指定一个参数,在使用时再指定此参数具体的值,主要作用是编译时数据类型检查
-
使用泛型可以消除集合中元素取出时的强制类型转换,提高了代码的重用性
List list1 = new ArrayList(); list1.add("hello"); String s1 = (String) list1.get(0); //-------------------------------- List<String> list2 = new ArrayList(); list2.add("hello"); String s2 = list.get(0);
2.泛型擦除
-
当一个具有泛型的集合对象赋值给一个没有泛型的引用时,泛型中的类型参数会被抹除,通过新的引用取出元素时,会将元素看作Object类型
List<String> list1 = new ArrayList(); list1.add