版本:JDK1.8
注:观看尚硅谷视频的复习笔记
十五、包装类
继承自Number类
1、基本数据类型转换为包装类
int num = 10;
Integer integer = new Integer(num);
2、包装类转换为基本数据类型
integer.intValue();
float.floatValue();
3、自动装箱与拆箱
boolean b1 = true;//自动装箱不需要构造器
Boolean b2 = b1;//自动装箱
boolean b3 = b2;//自动拆箱
int i = 10;
method(i);//自动装箱
public void method(Object obj) {
}
4、基本数据类型、包装类转换为String类型
String.valueOf(数据类型);
int num1 = 10;
//方式1:连接运算
String str1 = num1 + "";
//方式2:调用String的valueOf(Xxx xxx)
float f1 = 12.3f;
String str2 = String.valueOf(f1);//"12.3"
Double d1 = new Double(12.4);
String str3 = String.valueOf(d1);
5、String转换为基本数据类型、包装类
parseXxx(String);
String str1 = "123"; //不标准就会报异常
int num2 = Integer.parseInt(str1);
String str2 = "true"; //不是true就是false
boolean b1 = Boolean.parseBoolean(str2);
十六、static
某些特定的数据在内存空间只有一份
1、修饰属性、方法、代码块、内部类
(一)、修饰属性
静态变量(静态属性、类变量)
1、创建了类的多个对象,多个对象共享同一个静态变量,当修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的。
2、静态变量随着类的加载而加载的
3、静态变量的加载早于实例变量
4、可以通过 类.静态变量 的方式进行调用
5、由于类只会加载一次,所以静态变量只存在一份,存在方法区的静态域中
(二)、修饰方法
静态方法
1、随着类的加载而加载
2、可以通过 类.方法名 的方式调用
3、静态方法中,只能调用静态的方法和属性
4、非静态方法中,既可以调用非静态方法,也可以调用静态方法。
5、在静态方法内不允许使用this和super
(三)、方法区
类的加载信息、静态域、常量池。
十七、代码块
1、在类中任意位置定义
2、作用:初始化类或对象
3、只能用static修饰
4、静态代码块
随着类的加载而执行
初始化类的信息
5、非静态代码块
随着对象的加载而执行
可以在创建对象时,对对象的属性进行初始化
十八、final
可以用来修饰:类、方法、变量
1、修饰类:不可以被继承。例如:String、System、StringBuffer
2、修饰方法:不可以被重写。例如Object类中getClass()
3、修饰变量:变为常量,不可以改变。
显式初始化、代码块中初始化、构造方法初始化。
4、修饰形参时:此形参变为常量,一旦调用以后,在此方法体内只能使用,不能改变。
5、static final :全局常量
十九、抽象类与抽象方法
1、关键字:abstract
(一)、修饰类
1、此类不能实例化
2、抽象类中也有构造器,便于子类实例化时调用。
(二)、修饰方法
1、只有方法的声明,没有方法体
public abstract void eat();
2、抽象方法只能存在抽象类中,反之抽象类中可以没有抽象方法。
3、不能修饰私有方法、静态方法、final的类和方法。
(三)、子类继承抽象类
1、子类必须重写父类所有的抽象方法。
2、若子类也是抽象类,则可以不用重写父类所有抽象方法。
(四)、抽象类的匿名子类
abstract class Person{
abstract void a() {
}
}
//创建匿名子类的对象
Person person = new Person() {
@Override
abstract void a() {
}
};
//创建匿名子类的匿名对象
new Person() {
@Override
abstract void a() {
}
};
二十、接口
1、关键字:interface
2、接口中都是public的
3、接口和类是并列的结构
4、接口中不允许定义构造器,意味着接口不能实例化。
5、接口通过让类实现(implements)的方式来使用。
(1)、子类要实现接口中所有抽象方法才可以实例化。
(2)、如果实现类没有实现接口中的所有抽象方法,则此类为一个抽象类。
6、JDK7:只能定义全局常量和抽象方法
(1)、全局常量:接口默认是public static final的,可以省略不写。
(2)、抽象方法:接口默认是public abstract的,可以省略不写。
7、JDK8:还可以定义静态方法和默认方法
8、接口的具体使用:体现多态性
9、接口实际上可以看做是一种规范
(一)、多实现
class A extendsB implements C,D{
}
(二)、多继承
interface A{}
interface B{}
interface C extends A,B{}
(三)、匿名实现类
//1.创建了接口的非匿名实现类的非匿名对象
Flash flash = new Flash();
com.transferData(flash);
//2. 创建了接口的非匿名实现类的匿名对象
com.transferData(new Printer());
//3. 创建了接口的匿名实现类的非匿名对象
USB phone = new USB(){
@Override
public void start() {
System.out.println("手机开始工作");
}
@Override
public void stop() {
System.out.println("手机结束工作");
}
};
com.transferData(phone);
//4. 创建了接口的匿名实现类的匿名对象
com.transferData(new USB(){
@Override
public void start() {
System.out.println("mp3开始工作");
}
@Override
public void stop() {
System.out.println("mp3结束工作");
}
});
(四)、接口JDK8新特性
可以定义静态方法和默认方法
public interface CompareA {
//静态方法
public static void method1(){
System.out.println("CompareA:北京");
}
//默认方法
public default void method2(){
System.out.println("CompareA:上海");
}
default void method3(){
System.out.println("CompareA:上海");
}
}
1、接口中定义的静态方法,只能通过此接口来调用。
2、接口中定义的默认方法,可以通过实现类的对象调用。
3、接口中定义的默认方法,可以通过实现类重写。
4、如果子类(实现类)继承的父类和实现的接口中有同名同参数方法,在子类没有重写此方法的情况请,默认调用父类的同名同参数的方法。
5、如果实现类实现了多个接口,这多个接口中定义了同名同参数的默认方法,那么在实现类没有重写此方法的情况下,报错(接口冲突),必须在实现类中重写此方法。
6、当父类与实现的接口中有同名方法,且此方法被子类重写
method();//调用自己重写方法
super.method();//调用父类方法
Compare.super.method();//调用接口中同名方法
二十一、内部类
(一)、成员内部类
定义在类内
1、作为外部类的成员
可以被四种权限修饰符修饰。
2、单独看做一个类:类内可以定义属性、方法、构造器等。
(1)、可以用final修饰,表示此类不能被继承。
(2)、可以用abstract修饰,表示此类不能被实例化。
3、静态
不可以调用外部类属性、方法
4、非静态
调用外部类属性、方法
外部类名.this.方法
5、实例化成员内部类对象
(1)、静态
外部类.内部类 对象名 = new 外部类.内部类构造器
(2)、非静态
外部类.内部类 对象名 = 外部类对象.new 内部类构造器
(二)、局部内部类
方法内、代码块内、构造器内
在局部内部类的方法中,如果调用局部内部类 所声明的方法中 的局部变量,则要求此局部变量声明为final(JDK8可以省略不写)