内部类
内部类简单使用类内部的类就是内部类。
位置:把一个类定义到另一个类中,那么内部的类就是内部类。
注意:内部类不能直接创建
创建内部类的语法:
外部类.内部类 变量名 = new 外部类对象.new内部类对象
内部类的外部类的方法如果想要访问内部类的方法,必须创建内部类的对象,根据内部类的对象来访问。
普通内部类
class Outter{
int num;
public void outMethod(){
System.out.println("我是外部的类的方法");
}
class Inner{
int innerNum;
public void inMethod(){
System.out.println("我是内部的类的方法");
}
}
}
public class TestInner{
public static void main(String[] args){
//创建内部类的对象 外部类.内部类 变量名 = new 外部类对象.new内部类对象
Outter.Inner inner = new Outter().new Inner();
inner.innerNum = 13;
inner.inMethod();//我是内部的类的方法
}
}
内部类的编译后的class
内部类的特点
-
本类可以直接创建内部类的对象
-
内部类的方法可以访问外部类的属性和方法
匿名内部类
什么是匿名类:没有名字的类,这种类需要在接口上实现。
匿名类和匿名内部类都需要接口或者抽象类的支持。
创建一个匿名的类的对象这个类的对象实现OuterInter的接口,在大括号中实现接口中的方法,方法调用完毕后就会被垃圾回收
- 接口中的匿名内部类
interface Outter{
public void outMethod();
}
class OutterImpl implements Outter {
public void outMethod(){
}
}
public class TestInner{
public static void main(String[] args){
Outter outter = new OutterImpl();
outter.outMethod();
//创建的不是接口本身,new Outter() 后面的大括号就是一个匿名内部类,
// 实现了Outter接口
Outter o = new Outter() {
@Override
public void outMethod() {
System.out.println("我是匿名内部类的方法");
}
};
o.outMethod();
}
//我是匿名内部类的方法
}
-
抽象类中的匿名内部类
abstract class Outter{ public abstract void outMethod(); } public class TestInner{ public static void main(String[] args){ //创建的不是接口本身,new Outter() 后面的大括号就是一个匿名内部类, // 实现了Outter接口 Outter o = new Outter() { @Override public void outMethod() { System.out.println("我是匿名内部类的方法"); } }; o.outMethod(); } //我是匿名内部类的方法 }
Object
Object概述
-
Object是所有类的根类,所有的类都是直接或者间接的去继承Object类。
-
类 Object 是类层次结构的根类。每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。
-
在定义一个类时,没有使用extends关键字,也就是没有显式地继承某个类,那么这个类直接继承Object类。所有的对象都继承这个类的方法。
基本方法
- toString()方法
返回当前对象本身的有关信息,返回字符串对象。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。
Object中的toString的实现
Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于: 获得类的名称 “@” getClass().getName() + ‘@’ + Integer.toHexString(hashCode())
public class Test{
public static void main(String[] args) {
Object o = new Object();
System.out.println(o.toString());
}
}//java.lang.Object@1540e19d
public class Test{
private String name = "张三";
private int age = 10;
@Override
public String toString() {
return "name='" + name + '\'' + ", age=" + age ;
}
public static void main(String[] args) {
Test t=new Test();
System.out.println(t.toString());
}
}//name='张三', age=10
- getClass()
getClass()返回值是Class(类的类对象),与反射有关。通过getClass().getName()获得对象的类名。
- hashCode()
由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。
- finalize()
用于垃圾回收,我们不用手动的去调用,由jvm来调用,
当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
-
equals(Object obj),返回值为布尔类型
equals用于比较两个对象是否相等
public class Test {
public static void main(String[] args) {
//1. 创建Object类型的对象
Object obj1 = new Object();
Object obj2 = new Object();
//2. 测试Object类中的成员方法
//2.1 hashCode:不同对象的哈希码值一般不同
int code1 = obj1.hashCode();
int code2 = obj2.hashCode();
System.out.println(code1);//356573597
System.out.println(code2);//1735600054
//2.2 Class<?> getClass():一个类只有一个字节码对象。
Class cls1 = obj1.getClass();
Class cls2 = obj2.getClass();
System.out.println(cls1);//class java.lang.Object
System.out.println(cls2);//class java.lang.Object
//2.3 String toString():返回对象的字符串形式,默认返回的是地址值,不同的对象有不同的返回值
//地址值的组成:全类名@该对象的哈希码的无符号十六进制形式
String s1 = obj1.toString();
String s2 = obj2.toString();
System.out.println(s1);//java.lang.Object@1540e19d
System.out.println(s2);//java.lang.Object@677327b6
//2.4 boolean equals():比较两个对象是否相等,默认比较地址值(无意义),子类一般会重写。
boolean b = obj1.equals(obj2);
System.out.println(b);//false
}
}