Java基础概念与语法

目录

一、字面量

二、数据类型

三、不同进制的形式

四、标识符命名规则

五、类型转换:不同类型数据进行运算/赋值需转换成相同类型

六、无符号右移运算符>>>:不论正负,高位补0

七、初始化语句

八、程序控制

九、switch语句

十、数组(引用类型)

十一、类(所有类占用空间必须为8B的整数倍,不足则补齐)

十二、泛型

十三、代码块

十四、包

十五、Throwable类:Error类和Exception类的父类

十六、IO流:用于读写数据(本地文件、网络文件等)

十七、基本数据类型的包装类

十八、Java内存分配


一、字面量

        1.字面量类型:整数、小数、字符串、字符、布尔、空

        2.特殊字面量:字符'\t'把前面字符串的长度(不是占用内存的字节数)补齐到8的倍数,至少补1个,至多补8个

二、数据类型

        1.基本数据类型

                (1)整数:byte、short、int、long(初始化long变量的数据过大时,需在该数字后加L以表示该字面量是long类型,java中整数字面量默认是int类型,不加L,会超出int的范围,出现错误)

                (2)浮点数:float(初始化float变量的小数需加F,小数字面量默认是double型)、double

                (3)字符:char(java的char占2B,用Unicode表示,c++的char占1B,用ASCII表示)

                (4)布尔:boolean

        2.引用数据类型

                (1)变量存储内容:引用数据类型底层用指针实现,变量存储的是该对象的地址值,数据值存储在其它空间中。因此引用数据类型直接比较是否相等时比较的是存储的地址是否相等

                (2)修改值:修改引用数据类型的变量值,实际修改的是该变量存储的地址值,不会修改原指针指向的对象;只有调用方法才能通过指针修改指向的对象。修改变量值后,若原地址值指向的对象没有变量指向它,则会删除该对象,类似C++ shared_ptr的引用计数。

                (3)字符串

                        ①java的字符串字面量均被视为String类的对象,因此用字符串字面量给字符串变量赋值实际赋值该字符串的地址值。字符串字面量存储在串池StringTable(位于堆内存)中,每次使用字符串字面量时会在串池中检查该字面量对象是否已存在,若不存在,创建新的字符串对象,若已存在,复用已存在的那个字符串对象。

                        ②因此用String s="123"赋值,相当于用对象赋值,直接赋值地址,若"123"已存在,则不会创建新的对象,可节省空间。但用String s=new String("123")的方式赋值时,new会创建一个新的对象,相当于用已有字符串"123"的内容在堆中创建一个新的字符串对象,并将新对象的地址赋值给s,所以此时即使串池中已存在该字符串,依旧会开辟新的空间。

                        ③总结:在实际编程中,将字符串字面量看作已存在的String类型的变量即可。

三、不同进制的形式

        1.2进制:0b开头

        2.10进制:无前缀

        3.8进制:0开头

        4.16进制:0x开头

四、标识符命名规则

        1.小驼峰命名法:方法、变量

        2.大驼峰命名法:类名

        3.全部大写且单词间下划线隔开:常量名

五、类型转换:不同类型数据进行运算/赋值需转换成相同类型

        1.隐式转换:把取值范围小的转换成取值范围大的、子类引用转换为父类引用

        2.显式转换:把取值范围大的转换成取值范围小的、父类引用转换为子类引用

        3.引用类型转换:引用转换中若源类引用所指对象内的所属类标识不是目标类,则会抛出强转异常;注意,子类属于父类,因此子类是父类,但父类不是子类;a instanceof A 判断引用a所指对象是否属于A类,JDK 16新特性——a instanceof A b若引用a所指对象属于A类,则将强转后的引用赋值给引用类型为A的b变量并返回true,否则返回false。

        4.特殊转换:byte、short、char三种数据运算时都会先转成int再运算;字符串+其他类型对象(int会自动装箱为Integer)会调用对象的toString()方法将其他类型转换为字符串。编译器会对没有变量参与的字符串拼接进行优化,在编译时就已经是最终结果了,对于这种情况,不会创建中间的字符串字面量对象,而JDK8后对于有变量参与的字符串拼接底层先预估最终结果的长度L,然后创建长度为L的字符数组,用此数组实现拼接,再通过此数组new一个新的String对象,对于这种情况,不会产生最终结果的字符串字面量;+=、-=、/=、*=等运算符底层都有强制类型转换

六、无符号右移运算符>>>:不论正负,高位补0

七、初始化语句

        1.初始化语句的本质:初始化语句包含定义和赋值两个语句

        2.注意事项:在if或while中有初始化语句时必须加大括号。

八、程序控制

        1.break label、continue label:类似c语言中的goto

        2.System.exit(0):停止运行虚拟机

九、switch语句

        1.可以匹配的值:byte、short、int、char、枚举、String。

        2.default语句可以放在任何位置。

        3.case穿透:匹配到值后会一直执行直至遇到break,可以在case后接多个字面量简化case穿透,字面量之间用“,”隔开。

        4.switch新特性

                (1)case 1,2->{...}({}中不用加break,执行完{}中的语句就会退出switch,{}中只有一个语句时可以省略{})

                (2)用switch表达式返回值:case 1,2->{...}形式返回值时,如果分支是表达式,返回值为表达式的值,如果分支是代码块,用break语句返回值;case 1,2:{...}形式返回值时,不论分支是表达式还是代码块都用break返回值。用switch返回值时,注意代码结尾处加“;”

十、数组(引用类型)

        1.一维数组定义/初始化语法:int arr[];arr=new int[5]、int arr[]=new int[5]、int[] arr=new int[5]、int[] arr=new int[]{1,2,3}、int[] arr={1,2,3}、arr=new int[]{1,2,3}

        2.二维数组定义/初始化语法:int arr[][];arr=new int[3][4]、int[][] arr=new int[2][];arr[0]=new int[]{1,2};arr[1]=new int[4]、int[][] arr=new int[3][4]、int[][] arr=new int[][]{{1,2},{3,4,5}}、int[][] arr={{1,2},{3,4,5}}

        3.数组名存储数组首地址,由于数组是引用类型,用数组名赋值采用浅拷贝(赋值地址)

        4.可以用变量设置数组的容量

        5.变量:数组长度arr.length();方法:拷贝数组arr.clone()

        6.数组默认初始化值(成员变量/静态成员变量默认初始值相同,但局部变量无默认初始值)

                (1)整数/小数:0/0.0

                (2)字符:'/u0000'空格

                (3)布尔:false

                (4)引用数据类型:null(引用底层实现是指针)

十一、类(所有类占用空间必须为8B的整数倍,不足则补齐)

        1.定义语法

                (1)类:访问权限修饰符 非访问权限修饰符 class 类名 extends... implements...,...{...}

                (2)成员变量:访问权限修饰符 非访问权限修饰符 类型 变量名=初值;(不写赋默认值) 

                (3)成员方法:访问权限修饰符 非访问权限修饰符 返回值 方法名(参数){方法体}

        2.访问权限修饰符(范围从大到小,可修饰内部类、成员变量、成员方法、构造方法)

                (1)public:可在本类、同包的其它类、不同包中的子类、不同包下的无关类中访问。

                (2)protected:可以在本类、同包中的其它类、不同包中的子类中访问。

                (3)package-private/friendly/default:只能在本类、同包中的其它类中访问。

                (4)private:只能在本类中访问。

                (5)外部类修饰符:仅可用public/default修饰外部类,1个.java文件可定义多个类,但只有1个类可为public且类名需与文件名相同,其余类只能在同包中使用,均为default。

        3.非访问权限修饰符(这类修饰符同时出现时建议放置顺序以序号大小为准)        

                (1)transient:对象序列化时不会对transient修饰的成员进行序列化

                (2)interface:只能修饰类,interface替换class定义接口,子类用implements实现接口

                (3)abstract:被abstract修饰的方法不能定义方法体,是抽象方法

                (4)final

                        ①final方法:最终方法,不能被重写,但不影响继承

                        ②final类:最终类,不能被继承

                        ③final变量:常量,一般存配置信息,只能被赋值一次,定义时必须赋值,无法使用默认初始值。final修饰引用时,不能改变的是地址值,因此此时仍可改变引用所指的对象内容。

                (5)static(可以修饰内部类,但不能修饰外部类)

                        ①静态成员可用类名直接调用(推荐)或者用对象名调用。

                        ②静态成员变量被该拥有该变量的所有类的所有对象共享,不属于对象,属于类,随着类的加载(使用)存储在堆内存的静态区中,优先于该类对象出现。

                         ③静态成员方法多用在测试类或工具类(构造函数私有化、均为静态方法)中,很少在JavaBean中使用,无this指针、super指针(非静态成员方法有隐藏的形参this指针),因此只能在静态成员方法中调用静态成员变量或其它静态成员方法。

        4.构造函数:

                (1)定义语法:访问权限修饰符 类名(参数){函数体}

                (2)默认构造函数:未定义构造函数时提供无参的默认构造函数,定义后不提供。默认构造函数的访问权限修饰符为public

                (3)注意:进入构造函数的函数体后对象存储的内容已经形成,此时可以使用this指针

                (4)在构造函数中调用构造函数用this(...)

        5.继承

                (1)支持单继承、多层继承,不支持多继承,方法区加载子类文件时也加载父类文件

                (2)每个类都直接或间接继承自Object类

                (3)Java只支持C++中的public继承,不提供类似于C++的private或protected继承机制

                (4)继承内容

                        ①不可继承:构造方法(子类构造时需先调用父类的构造方法,即使不写,执行时也会加上,不加super(...)默认为super(),若写则必须放在第一句,也有this(...))、私有成员方法

                        ②可继承:除构造方法、私有成员方法都可继承(包括static、final成员,继承不等于访问),因此子类对象所占空间大小也需计算从父类中继承的私有成员变量,但是子类无法访问父类的私有成员变量,不过仍可通过父类的方法get/set间接访问

                (5)虚方法表(从父类继承的static、final成员方法不在虚方法表中)

                        ①每个类都有虚方法表,随着类文件的加载一起存储在方法区中

                        ②虚方法表存储该类中非private、非static、非final的方法(虚方法)

                        ③子类的虚方法表会在父类虚方法表的基础上中增加自己的虚方法

                        ④调用虚方法时直接查表即可找到方法入口地址

                        ⑤调用非虚方法时将通过继承关系一层层往上找所调用方法的地址

                        ⑥从父类直接继承下来的虚方法不会改变this指针的类型,因此子类从父类直接继承的虚方法的this指针类型为父类的引用类型,所以若子类的name隐藏了父类的同名成员变量name,当用继承的虚方法使用name的值时将使用父类的name

                (6)this、super指针:this指针是引用类型,通过该引用调用成员符合多态规则,具体过程详见方法.重写.多态部分;super是关键字,不是引用类型,底层实现为插入额外代码直接指明使用父类部分的成员,所以不会触发多态,无论this所指对象的真实类型是本类还是子类,super指针都是访问该对象中属于本类的父类的部分。

        6.方法:程序中的最小执行单元,ctrl+alt+m抽取方法

                (1)传参:传基本类型将值的拷贝赋给形参,传引用类型将地址值的拷贝赋给形参,java并不支持形参默认值,可用重载实现参数较少的版本,间接调用多参数的版本实现默认赋值。

                (2)修改引用类型的形参:用赋值运算修改引用类型的形参时,由于形参与实参不是同一个变量,只是修改了形参的地址值,因此不会修改实参的值。只有通过方法或直接修改形参的成员变量时,才会通过指针修改实参的值。

                (3)返回类型:数组是引用类型,存储在堆区,因此方法可以返回数组。

                (4)可变参数:void call(int n,int...arr),int型数组arr存可变参数,必须放在形参列表最后;可以传数组代表多个实参,但使用泛型的可变参数方法<T> void call(T...arr)会把传入的存储引用数据类型的数组看作一个参数,如数组类型为List[],则T=List[]。

                (5)方法引用:函数式接口的一种代替方式,被引用方法(必须已经存在)的形参和返回值必须和函数式接口的抽象方法保持一致。

                        ①引用静态成员方法:类名::静态方法名

                        ②引用非静态成员方法:对象::非静态方法名,本类方法引用this::非静态方法名,父类方法引用super::非静态方法名;类名::非静态方法名,此时该方法引用的第一个参数是该方法所属类的引用

                        ③引用构造方法:类名::new,构造方法的返回值为所属类的引用。引用数组的构造方法——数据类型[]::new

                (6)重载(静态/final/非静态非final成员方法,可私有)

                        ①同类、同名、不同参,可改返回类型和访问权限(这二者与重载无关)

                        ②调用call(byteA,byteB)时,若有相同优先级的void(int,long)和void(long,int)会报错

                        ③从父类继承来的方法属于子类的一部分,与子类方法也可构成重载关系

                        ④静态成员方法也可重载,但静态成员方法与非静态成员方法不可构成重载关系

                (7)重写(@Override使虚拟机检查重写语法,非静态非final非私有成员方法)

                        ①多态:指向子类对象的父类引用调用重写的方法。通过引用使用成员时,设引用所属类为Father类,引用所指对象属于Son类,调用成员变量从引用所属类(Father)部分往上找,调用非静态方法从对象所属类(Son,对象中有标识所属类的信息)的所有方法(包含虚方法表)开始往上找,调用静态方法从引用所属类(Father)的静态方法开始往上找。

                        ②重写方法的名称、参数列表(不一致为重载)必须与父类中的一致,子类方法返回类型需小于等于父类方法(便于多态时用返回值赋值时能隐式转换),子类方法访问权限需大于等于父类(保证多态时能访问父类方法情况下肯定能访问子类方法,default<protected<public),重写机制为子类虚方法覆盖虚方法表中与从父类继承过来的参数列表、方法名相同的虚方法。

                        ③java中所有非静态非final非私有成员方法都是虚函数,可重写,在类内部访问实现了重写的方法也能触发多态。如对于实现了重写的方法call,在成员函数中调用call()或this.call()时,如果父类引用指向的对象属于子类,则会调用子类的call()(this指针类型为所在类的引用,但可将该类引用指向子类对象,因此this指针指向的对象可能是子类对象,从而触发多态)。

                        ④由于实现多态需根据对象类型调用对应版本,而静态方法底层实现与对象无关,而是直接根据类名调用对应方法,因此静态成员方法无法参与重写;final成员方法由于不可重写,因此无法被子类重写。

                        ⑤每个类都直接或间接继承Object,可重写Object类的equals、hashCode等方法。

                (8)隐藏(非私有静态/final/非静态非final成员变量、局部变量、非私有静态成员方法)

                        ①成员变量可交叉隐藏,静态成员变量与非静态成员变量可互相隐藏,且可改变量类型,但隐藏不代表父类同名变量在子类消失,可通过super指针访问、修改父类同名变量的值。

                        ②内层作用域会隐藏外层作用域中的同名变量。因此方法中与成员变量同名的变量会隐藏该成员变量,但可使用this指针找到并使用隐藏的成员变量。

                        ③非静态成员方法间不能隐藏,只能为重载或重写(@override可不写,参数列表相同时认定为方法重写),方法中只有静态成员方法能隐藏,也可用super访问隐藏的静态方法。

        7.JavaBean类

                (1)public修饰的类

                (2)有public的无参构造

                (3)所有属性都是private,并且提供对应的set和get方法(alt+insert快速构建方法,或者流量下载ptg插件,在类中右键选择ptg to JavaBean)

        8.抽象类

                (1)abstract修饰,可定义抽象方法(只有抽象类/接口才能定义抽象方法

                (2)抽象类不能创建对象

                (3)抽象类的子类若不能重写所有抽象方法,则也需定义成抽象类

        9.接口(一般无法抽象到抽象类中但又较通用的方法可以抽象到接口中)

                (1)interface替换class,接口是一种规则,对行为的抽象,可定义抽象方法

                (2)接口不能创建对象

                (3)接口和子类是实现关系,子类若不能实现接口的所有抽象方法,则需定义成抽象类

                (4)一个类虽然只能单继承,但可以同时实现多个接口(拥有多个行为)

                (5)实现类是接口的子类,因此实现类对象也属于接口类,可用接口类的引用实现多态

                (6)接口与接口间是继承关系,可以多继承,用extends关键字

                (7)接口中的成员

                        ①成员变量:只能是常量,修饰符必须是public static final,不写默认是此修饰符

                        ②构造方法:因为没有成员变量可赋值,所有接口无构造方法(底层实现也没有)

                        ③成员方法:只能是抽象方法,修饰符必须是public abstract,不写默认是此修饰符

                        ④JDK8新特性:可定义有方法体的方法。public default默认方法,接口升级后由于增加了抽象方法,子类必须重写否则无法运行,因此为了版本兼容性,定义不是抽象方法、有方法体的默认方法,修饰符public可省略,default不能省略,若子类实现的多个接口中存在名字和参数列表相同且返回值兼容的默认方法(返回值不兼容无法同时实现),此时必须重写默认方法,因为方法体会不一致;public static静态方法,允许接口定义静态方法,静态方法只能用接口名调用,不能用类名或对象名调用,public可省略,static不能省略,注意静态方法不能重写,即使子类定义了相同的静态方法,作用机制是隐藏,此时用指向子类的接口引用调用静态方法不会触发多态。

                        ⑤JDK9新特性:可定义私有方法,用于抽取有方法体的方法中的重复过程。为public default服务的普通private方法(不加default);为public static服务的private static方法。

                (8)实现的多个接口/父类中出现同名方法

                        ①参数列表不同:方法间构成重载关系。

                        ②参数列表相同:若返回值兼容,则重写一次即可同时覆盖多个接口中的同名方法;若返回值不兼容则不能同时实现出现同名方法的接口/父类

                (9)有多个父类时的super格式:父类名.super

                (10)函数式接口:只有1个抽象方法的接口,接口上可加@FunctionalInterface注解用于检查接口定义是否正确

        10.内部类(可以单独import公有的内部类)

                (1)访问内部类:外部类必须创建对象来访问内部类的非静态成员

                (2)成员内部类(一般指非静态的成员内部类)

                        ①写在类的成员位置,是外部类的成员,因此也可被访问权限、static等修饰符修饰

                        ②内部类单独出现没有意义,依赖于依赖外部类对象,在语义上是外部类的一部分

                        ③成员内部类可以直接访问外部类的成员,包括私有成员

                        ④JDK16后可以在成员内部类中定义静态成员变量

                        ⑤创建成员内部类对象:外部类中提供获取成员内部类对象的方法(return this.new Inner();,内部类私有时,外界只能用兼容的类型父类引用存储返回的内部类对象,如Object引用);外部类名.内部类名 变量名=外部类对象.new 内部类名()(Outer.Inner oi=new Outer().new Inner();,成员内部类依赖外部类对象,因此无法单独创建,必须用外部类对象创建)

                        ⑥成员内部类中指明访问外部类成员:外部类名.this.call(),成员内部类中有隐藏的外部类名.this指针,指向所在的外部类对象

                (3)静态内部类

                        ①static修饰的成员内部类,不依赖于外部类对象,可以独立存在

                        ②无外部类名.this指针,只能访问外部类的静态成员,访问非静态需创建外部类对象。由于没有外部类名.this指针,因此指明访问外部类的静态成员时用—外部类名.静态成员

                        ③创建静态内部类对象:静态内部类非私有时,外部类名.内部类名 变量名=new 外部类名.内部类名();(不依赖于外部类对象);静态内部类私有时,创建方法见成员内部类

                        ④调用非私有内部类的非私有静态成员:外部类名.内部类名.成员,静态成员与对象无关,调用非私有成员内部类中的非私有静态成员的方式相同

                (4)局部内部类

                        ①定义在方法中的内部类,类似于局部变量,因此可用的修饰符与局部变量一样,且外界无法使用,只能在方法内创建局部内部类的对象

                        ②可直接访问方法的局部变量;定义在非静态方法中的局部内部类可以直接访问外部类的成员(方法中有this指针),用外部类名.this.成员指明访问外部类的成员;若定义在静态方法中,只能通过外部类对象访问其非静态成员,用外部类名.静态成员指明访问外部类的静态成员

                        ③局部内部类在局部代码块中,因此生命周期只在方法中(即使局部内部类可以定义在静态方法中,但生命周期依旧只在方法中)。所以无法定义为静态内部类,但可以声明静态成员,且在方法中可以通过局部内部类的类名直接访问其静态成员

                (5)匿名内部类

                        ①隐藏了名字的内部类,可以定义在成员位置,也可以定义在局部方法内

                        ②定义+创建格式:[继承的父类名/实现的接口名 对象名=]new 继承的父类名/实现的接口名(){必须重写继承的所有抽象方法};([]中的部分可省略)

                        ③匿名内部类是只创建一次对象的类,且对象不用引用变量保存就只能用一次,可以将匿名内部类对象传入方法中实现多态,可以简化代码

                        ④Lambda表达式:属于函数式接口的匿名内部类的简化写法;定义语法为()->{};可以小括号内可以省略形参的类型,如果只有1个参数,小括号也可以省略,如果方法体只有一行,"return"、";"、"{}"都可以省略

                        ⑤由于匿名内部类也是非静态的内部类,因此可以直接访问外部类的成员

十二、泛型

        1.<T,E>,T和E可以视为存储类型的常量,只支持引用数据类型

        2.Java中的泛型是伪泛型,为了兼容容器存Object对象的版本,无论是存什么引用类型的容器,其底层的存储类型依旧是Object类型,只是在存进容器时会检查类型是否符合,获取容器中的对象时会进行相应类型的显式转换。因此编译成class文件后ArrayList<String> arr=new ArrayList<>()变为ArrayList arr=new ArrayList()(泛型的擦除

        3.泛型类:当类中某个变量的数据类型不确定时,可以定义带有泛型的类

        4.泛型方法:泛型类定义的泛型参数除了静态方法(不依赖于对象而存在)外其余所有方法都能用,泛型方法定义的泛型只有该方法能用;泛型方法的泛型参数可推导,使用时可以不指出

        5.泛型接口:泛型接口的类型参数可以由实现类给出(class MyArrayList implements ArrayList<String>),也可以由实现类创建对象时确定(class MyArrayList<T> implements ArrayList<T>)

        6.定义语法:class 类名<T> {}、修饰符<T> void call(){}、interface 接口名<T> {}

        7.限定泛型参数类型:<T extends Object> void call(T t){}(T只能为Object及其子类);void call(List<? super Collection>  t){}(?只能为Collection及其父类) 

        8.可将没有限定类型的泛型视为Object,将只能为Type及其子类的泛型可将其视为Type,方便判断重载。由于泛型擦除,只有1个List形参的方法与令一个只有1个List形参的方法无法构成重载,即使List存储的类型不同,此规则可判断有只能为Type及其父类的泛型的方法的重载。

十三、代码块

        1.局部代码块:方法中的代码块,用于提前结束变量的生命周期(已淘汰)

        2.构造代码块:在类中定义{..}(定义位置无要求),每个构造函数开始处都会执行构造代码块,但不灵活,可将构造方法中相同部分抽取为方法实现相同功能,也可构造方法调用构造方法

        3.静态代码块:在类中定义static{..},随着类的加载而加载,加载完后自动执行,因此只执行一次,一般用于私有静态成员变量的初始化,由于静态代码块中没有this关键字,因此无法操作类中的非静态成员。

        4.同步代码块

                (1)同步代码块语法:synchronized(变量lock){...},传入Object类型的变量lock作为代码块的进入条件,同一时间只能执行将lock作为进入条件的所有同步代码块中的至多一个代码块,其余执行到代码块入口的线程阻塞式等待,一般将lock设置为所在类的字节码文件Class类的对象Object.class(同一个类的字节码文件相同)

                (2)同步方法:将synchronized作为非访问限定符放到其它限定符后、返回值前的方法,同步方法相当于在方法体外加了层synchronized(变量lock){方法体}控制方法体的访问,非静态同步方法的lock为this,静态同步方法的lock为所在类的字节码文件对象Object.class

                (3)同步代码块原理:同步代码块入口相当于调用了互斥锁类的lock方法,出口处相当于调用了互斥锁类的unlock方法;Object类有wait、notify、notifyAll方法,但变量lock的这些方法只能在以变量lock为进入条件的同步代码块中使用,其中lock.wait()的效果类似于绑定互斥锁的条件变量的await方法,lock.notify()、lock.notifyAll()的效果类似于绑定互斥锁的条件变量的signal方法、signalAll方法

十四、包

        1.功能:文件夹,用来管理不同功能的Java类,方便后期代码维护

        2.命名规则:公司域名反写+包的作用,如com.luomi.tool,类的全名(全类名)即为com.luomi.tool.Config

        3.导包作用:import com.luomi.tool.*或import com.luomi.tool.Config将类的定义从com.luomi.tool.Config config=new com.luomi.tool.Config()简化为Config config=new Config()

        4.导包规则

                (1)使用同一个包中的类或者java.lang包中的类时,不需要导包,其它情况都需要导包

                (2)同时使用两个包中相同名字的类时,不能导入这两个类,需要用全类名创建对象

                (3)导包时必须要具体到类名为止,且不论包之间的层级关系,都要导全类名import com.luomi.tool.Config,用*导一个包中的所有类import com.luomi.tool.*

十五、Throwable类:Error类和Exception类的父类

        1.Error类:系统级别的错误,如内存溢出,属于严重问题,一般开发人员无法处理这类问题,Error类是给sun公司自己用的。

        2.Exception类:异常,RuntimeException和其它异常的父类。代表程序出现的问题,也可以在方法中抛出异常通知调用者方法的执行情况。

                (1)异常的子类

                        ①RuntimeException及其子类:编译阶段不会出现异常提醒,编译阶段不需要处理,代码运行时(java命令运行字节码文件的阶段)出现的异常(如数组索引越界)。

                        ②其它异常:编译阶段(javac命令将.java文件编译为字节码文件的阶段,该阶段不运行代码,只检查语法错误或做一些性能的优化)就会出现异常提醒的(如日期解析异常),编译阶段必须手动处理,否则代码报错。

                        ③异常的抛出:抛出异常后若未在本方法中捕获处理,则结束本方法的执行并将异常抛给上一级方法(throws 异常类名1,异常类名2...,写在方法定义处,作用为告诉调用者本方法可能会有哪些异常,本方法中未被捕获处理的编译时异常必须要写,本方法中未被捕获处理的运行时异常可以不写),直到被捕获处理或在main方法中依旧未被处理后由JVM用默认方式处理。

                        ④运行有问题的代码时程序throw抛出异常

                        ⑤throw 异常对象:手动throw抛出异常

                (2)异常的处理方式

                        ①JVM默认的处理方式:把main中未捕获的异常信息打印在控制台上并停止程序。

                        ②捕获异常并处理:try(变量1;变量2//此处的变量所属类需实现AutoCloseable接口,该接口有close抽象方法,try-catch-finally语句结束后会自动调用每个变量的close方法以释放该变量所用的资源,如变量1为IO流对象,则语句结束后会自动调用变量1.close()关闭打开的文件){}catch(异常类名1|异常类名2 变量名){//try中throw抛出的异常被catch捕获后在此处理}catch(异常类名3 变量名){}finally{}。catch代码块中抛出的异常不会被本try-catch-finally捕获。异常捕获后,程序可以继续执行。

十六、IO流:用于读写数据(本地文件、网络文件等)

        1.分类

                (1)按照流向分类:输出流、输入流

                (2)按照操作文件的类型分类:字节流(可操作所有类型的文件)、字符流(以字符为单位进行读/写,只能操作纯文本文件,即用记事本打开并能读懂的文件,如txt、md、xml等)

        2.读写文件的原理:IO流读写文件即为操作系统中进程读写文件的过程。IO流对象创建时,进程打开文件,IO流对象调用close方法时,进程关闭文件

        3.IO流体系(抽象类)

                (1)字节流:字节输入流InputStream、字节输出流OutputStream

                (2)字符流:字符输入流Reader、字符输出流Writer

十七、基本数据类型的包装类

        1.包装类(创建后内部的值不可修改)

                (1)整数:byte→Byte、short→Short、int→Integer、long→Long

                (2)浮点数:float→Float、double→Double

                (3)字符:char→Character

                (4)布尔:boolean→Boolean

        2.自动装箱:将基本数据类型自动转换为封装类型,编译器代替执行Integer.valueOf(...)

        3.自动拆箱:将封装类型自动转换为基本数据类型,编译器代替执行Integer.intValue(...)

        4.自动装箱、拆箱的应用:Integer a=1;Integer b=2;Integer c=a+b;

        5.Integer类的静态方法

                (1)valueOf:提前创建了-128到127的对象,传入的int在此范围时不会创建新对象

                (2)parseInt:传入字符串,返回int型整数

                (3)toBinaryString/toOctalString/toHexString:用相应进制表示int型数字,返回String 

十八、Java内存分配

        1.栈:方法运行时使用的内存,比如main方法运行,执行过程在方法区中

        2.堆:存储new创建的对象或数组(栈中存储堆中对象的地址)

        3.方法区:存储可以运行的class文件

        4.本地方法栈:JVM在使用操作系统功能时使用

        5.寄存器:CPU使用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值