1.内部类
内部类特点:
- 编译后可生成独立得字节码文件
- 内部类可直接访问外部类的私有成员
- 可为外部类提供必要的内部组件
1.成员内部类
- 当作外部类的成员变量使用
- 里面不能声明静态成员,但可以声明静态常量
- 可以new多个对象
//分步创建内部类对象
Outer outer = new Outer();
Outer.Inner inner = outer.new Inner();
//合并创建内部类对象
Outer.Inner inner = new Outer().new Inner();
2.静态内部类
- 当作外部类的静态成员变量使用
- 不依赖外部类对象,可以直接创建或通过类名访问
- 可声明静态成员。
- 可以把静态内部类当成一个正常的类来使用
- 只有静态内部类才可以使用static修饰。普通类是不可以使用static修饰的,因为类加载,是依靠外部类的。所以普通类没有外部类,所以不能用static修饰!
定义静态内部类:
package com.qianfeng.demo02;
public class Outer {
private String name = "张三";
private int age = 20;
private static String sex = "男";//外部类的静态成员
static class Inner{
private String phone = "110";
private String address = "沈阳";
private String name = "李四";//与父类重名属性
//可以定义静态成员和静态常量
private static String contry = "中国";
private static final String word = "汉语";
public void show(){
//访问外部类成员 Outer.this.属性名
System.out.println(name);//当外部类与内部类存在同名属性时,优先访问内部类属
性
//如果访问外部类的成员属性,则必须创建外部类对象再访问
Outer outer = new Outer();
System.out.println(outer.name);//访问外部类属性
System.out.println(outer.age);
System.out.println(Outer.sex);//可以直接通过外部类的类名访问外部类的静态属
性
//访问内部类成员
System.out.println(this.phone);
System.out.println(this.address);
System.out.println(contry);
System.out.println(word);
}
}
}
测试:
public class Test {
public static void main(String[] args) {
Outer.Inner inner = new Outer.Inner();
inner.show();
}
}
3.局部内部类
- 局部内部类不可以加任何访问修饰符
- 因为当作局部变量来使用
- 局部内部类中不可以定义静态成员,但可以定义静态常量
- 局部内部类成员变量与所在方法的局部变量重名时,会覆盖局部变量
package com.qianfeng.demo03;
public class Outer {
private String name = "张三";
private int age = 20;
//外部类方法
public void outMethod(){
//这里必须是final常量,在jdk1.7时,局部变量定义时必须显示加final关键字,JDK1.8以后
自动加final,不需要显示写
final String phone = "110";
//局部内部类
class Inner{
String address = "沈阳";
String phone = "220";//覆盖上面的final String phone = "110";
//不可以包含静态成员
//private static String contry = "中国";
//可以定义静态常量
private final static String contry = "中国";
public void show(){
//如果外部类方法是静态时需要创建对象再访问
/* Outer outer = new Outer();
//访问外部类的属性
System.out.println(outer.name);
System.out.println(outer.age);*/
//如果外部类方法是非静态方法则可以直接访问外部类属性
System.out.println(name);
System.out.println(age);
//访问方法中的局部变量,这里的局部变量必须是常量
//然而这个局部变量在后面是不可以改变它的值的
System.out.println(phone);
//访问内部类的属性
System.out.println(address);
}
}
//创建内部类对象
Inner inner = new Inner();
inner.show();
}
}
测试:
public class Test {
public static void main(String[] args) {
Outer outer = new Outer();
outer.outMethod();
}
}
4.匿名内部类
package com.qianfeng.demo04;
public class Test {
public static void main(String[] args) {
//使用接口创建鼠标对象
/*Usb usb = new Mouse();
usb.service();*/
//创建一个局部内部类
/*class Fan implements Usb{
@Override
public void service() {
System.out.println("风扇链接成功,开始工作.............");
}
}
Usb fan = new Fan();
fan.service();*/
//如果某些类只被使用一次,后面不再使用,可以将其定义成匿名内部类
Usb keybord = new Usb() {
@Override
public void service() {
System.out.println("键盘连接成功,开始工作............");
}
};
keybord.service();
}
}
2.Object类
1.getClass()
返回引用中存储的对象实际类型,返回的是类的字节码对象(反射)。
2.hashCode()
返回一个对象的十进制哈希码值。哈希算法根据对象地址或字符串或数字计算出来的int类型的数值。
1.常见哈希码
1、Object类的hashCode返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一
样,所以哈希码也不一样。
2、String类的hashCode根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符
串所在的堆空间相同,返回的哈希码也相同。
3、Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new
Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一
样。
3.toString()
返回一个对象的字符串表示(表现形式)
一般都是重写,把对象转化为字符串
4.equals()
对象类型:默认用的是Object类中的equals方法,比较地址,这是原生的,其他都是继承Object类的。
String类:默认比较字符串内容,重写过。
Number类型:默认比较整数值,重写过。
5.finalize()
- 当对象被判定为垃圾对象时,由JVM自动调用此方法,用以标记垃圾对象,进入回收队列。
- 垃圾对象指的是没有有效引用指向的对象
- 垃圾回收,由GC销毁垃圾对象,释放数据存储空间
- 自动垃圾回收机制:JVM的内存耗尽,一次性回收所有垃圾对象。
- 手动回收机制:使用System.gc();通知JVM执行垃圾回收。
- 程序员一般不做垃圾回收操作,都是由系统自动完成,即使调用System.gc()也只是通知,但具体
- 是否回收还是由系统来决定
案例:
@Override
protected void finalize() throws Throwable {
System.out.println(this.name+"被回收了");
}
测试:
package com.qianfeng.lianxi06;
public class Test04 {
public static void main(String[] args) {
Person p1 = new Person("张三1",23);
Person p2 = new Person("张三2",24);
Person p3 = new Person("张三3",25);
Person p4 = new Person("张三4",26);
Person p5 = new Person("张三5",27);
p1 = new Person("李四1",23);
p2 = new Person("李四2",24);
p3 = new Person("李四3",25);
p4 = new Person("李四4",26);
p5 = new Person("李四5",27);
System.gc();
}
}
3.包装类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RR2PwEH4-1685336299088)(C:\Users\蒋铭基\AppData\Roaming\Typora\typora-user-images\image-20230525082314647.png)]
1.装箱
基本类型-----包装类(引用类型)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ge9HYw6p-1685336299090)(C:\Users\蒋铭基\AppData\Roaming\Typora\typora-user-images\image-20230525083119298.png)]
装箱方法:(基本类型----引用类型)
-
使用构造方法 Integer i = new Integer(10); 等价于把基本类型10封装到Integer对象中
-
使用Integer.valueOf(num);Double.valueOf(num)静态方法
2.拆箱
包装类(引用类型)------基本类型 拆箱
对象名.intValue();
1.装箱
基本类型-----包装类(引用类型)
[外链图片转存中…(img-ge9HYw6p-1685336299090)]
装箱方法:(基本类型----引用类型)
-
使用构造方法 Integer i = new Integer(10); 等价于把基本类型10封装到Integer对象中
-
使用Integer.valueOf(num);Double.valueOf(num)静态方法
2.拆箱
包装类(引用类型)------基本类型 拆箱
对象名.intValue();