复习:接口
定义
访问权限修饰符 interface 接口名{ }
组成
1.公共静态常亮
2.公共静态方法
3.公共抽象方法
4.default修饰的普通方法(default和public差不多)
使用
场景1:一个接口继承多个接口
语法: 访问权限修饰符 interface 子接口名 extends 父接口名1,父接口名2,父接口名3{ } 接口数量随意,接口对接口用extends,是继承
注意 :
1.如果多个父接口提供相同的方法(方法名相同,形参列表也相同),此时子类将会将其合并,如果是default修饰的方法,那么子类必须重写
2.父接口的静态方法不能被继承
3.不能直接创建对象,也有人会把创建对象称为实例化对象
场景2:一个类可以实现多个接口
语法: 访问权限修饰符 class 类名 implements 接口名1,接口名2{ }
这个类就是接口1,2的实现类
如果实现的接口中有抽象方法,那么实现类要重写所有的抽象方法(自己是抽象类也可以)
今日
内部类
概念:在类中写类,就是内部类
//例 public class A{ public class B{ } } //此时B就是内部类,A就是外部类
内部类分类
1.成员内部类
定义位置: 类中,方法外
没有使用static修饰
2.静态内部类
定义为重: 类中方法外
使用static修饰
3.局部内部类
定义位置: 类中,方法中
4.匿名内部类 ☆☆
定义位置: 值或实参中
成员内部类
定义位置 : 类中,方法外
可以定义什么?
除静态成员(静态属性,静态方法和静态代码块)外皆可定义
如何创建对象?
情况1 : 在所在外部类中创建该类的内部类对象 内部类名 内部类对象名 = new 内部类名(实参列表); 只是省略this关键字,所以这种创建方式不能在静态方法中使用 this省略在new前,表示的的是外部类的对象.外部类的成员(此时指的是"new 内部类...")class A{ //外部类 B b = new B(); //内部类对象 B b = this.new B(); //没有省略this的创建内部类对象 class B{ //内部类 } }情况2: 外部类类名.内部类类名 对象名 = 外部类对象.new 内部类类名(实参列表);class A{ //外部类 class B{ //内部类 } } class C{ //和A(外部类)没有关系的类 A.B ab = new A().new B(); //new A(),创建A的对象,也可以分开写,如下 A a = new A(); //创建A的对象 A.B ab2 = a.new B(); //需注意,如果C类不在同一个包下,需导包 }
静态内部类
定义位置 : 类中,方法外
可以定义什么?
什么都可以定义
如何创建对象?
外部类类名.内部类类名 对象名 = new外部类类名.内部类类名(实参列表);public class Test { //外部类 Test.A a = new Test.A(); //创建内部类对象 public static void main(String[] args) { Test.A a = new Test.A(); //创建内部类对象 } static class A{ //内部类 } }
局部内部类
定义位置 : 类中,方法中
注意 :
1.此时不能使用访问权限修饰符
2.只能在当前方法中使用
可以定义什么?
除静态成员(静态属性与静态方法等)以外皆可定义
如何创建对象? 内部类类名 对象名 = new 内部类类名(实参列表);
class Test { public void aa(){ //方法 class A{ //写在方法中 } A a = new A(); //创建对象,,千万注意,写在内部类的顺序之下 } }
匿名内部类☆☆
先来了解匿名对象
匿名对象
类名 对象名 = new 类名(实参列表); //这是正常的对象,有对象名 对象名.方法(); //用对象名调方法 new 类名(实参列表).方法名; //这就是上面的简写,没有对象名 //new 类名(实参列表)就是创建对象,也就是说上面可以理解为对象调用方法没有对象名的对象
语法:
new 类名(实参列表).方法名();
缺点 : 只能使用一次
优点 : 编写方便
匿名内部类
一般用于只创建一次对象的类,用匿名内部类
概念 : 没有类名的内部类称为内部类
定义位置:值或实参中
Int a = 10; 10的位置就是值的位置
aa(Int a); Int a的位置就是实参位置, (这是调用方法)
语法:
父类名或父接口名 对象名 = new 父类名或父接口名(){ 属性 方法 //没有构造函数,因为没有类名 }; "="后面的才是匿名内部类,前面的就是接收一下.注意 :
1.一个类只创建一个对象时,可以使用匿名内部类
2.不能定义静态的成员与方法
包装类
概念:8个基本数据类型对应的引用数据类型
包装类有
byte Byte
short Short
int Integer
float Float
double Double
char Char
boolean Boolean
其实这8个基本数据类型也是引用数据类型,只是包装了一下
Scanner sca = new Scanner(System.in); //分析一下,Scanner说白了也是个类,所以是引用数据类型 //这句代码就是创建了Scanner的对象(工具)
Integer a = new Integer(10); //和int对应 //Ctrl加鼠标左键点击Integer,可以看源码
提供的方法
自动装箱
概念:将基本数据类型转换为其对应的引用数据类型的对象
如 :
Integer i = 10; //是int的包装类 String str = new String("XXX"); String str02 = "xxx" //和上面一样,只不过sString有自动装箱
自动拆箱
概念 : 将引用数据类型的对象转换为对应的基本数据类型的变量
String str03 = str; //str明显是对象"new String("XXX")",这就是自动拆箱
整数缓冲区
-128~127
原因: 因为系统中已经创建了-128到127之间的对象(用数组存的),在系统自动装箱时,如果值在该范围内,直接使用已经创建好的对象,如果超过这个,返回需要重新创建对象
Integer i1 = 127; Integer i2 = 127; i1 == i2; true i1 = 128; i2 = 128; i1 == i2; false
System
含义:系统
本质:由JDK提供的一个类
提供的属性和方法:
static native void arraycopy(Object src,int srcPos, Object dest, int destPos, int length) 作用:将原数组中的一段数据复制到新数组 1参:原数组 2参:复制开始的位置 3参:新数组 4参:新数组开始的位置 5参:复制的长度 ☆☆ 计算代码执行时间 static native long currentTimeMillis() 作用:获取当前时间与1970年1月1日00:00:00:000的时间差(格林威治时间) static void exit(int status) 作用:结束当前程序 1参:终止状态码 0:正常退出 1:异常退出 static void gc() 作用:手动调用垃圾回收机制 ...