.Net转Java自学之路—基础巩固篇九(Object、内部类)
Object:
所有类的父类,即跟类。Java中的类直接或间接的继承自Object
该类中封装了所有对象都具备的方法:
boolean equals(Object obj) 对象比较;默认比较内容地址。所以很多对象都会对该方法复写。
String toString() 字符串转换。
int hashCode() 对象哈希值。
void finalize() 垃圾回收调用的垃圾回收方法。
内部类:
也称:内置类、嵌套类。将类定义在另一个类中。内部类可以直接访问外部类的成员。外部类访问内部类,需建立内部类的对象。
什么时候定义内部类?
当分析一个事物时,该事物内部还有具体的事物,这个具体的事物在使用该事物的其他成员。这时就将这个具体的事物用内部类来描述。
而且内部类通常都不会直接对外提供,都会封装到外部类中,外部类一般会通过对外提供方法的形式对其访问。
对内部类的访问:
外部类.内部类 对象=new 外部类().内部类()
通常情况下内部类不被其它类访问。一般定义为private私有化。
当内部类中如果有静态成员时,该内部类必须是静态的;而静态内部类只能访问外部类的静态成员。
在执行静态内部类方法时的俩种情况:
1、内部类静态,方法非静态:该方法需要对象调用执行。
2、内部类静态,方法静态:类名.方法名
非静态内部类之所以可以访问外部类的成员,那是因为内部类汇总都只有一个外部类对象引用;外部类.this.成员
若内部类定义在局部位置上,那么只能访问该局部中被final修饰的常量。
匿名内部类:
没有名字的内部类。优点:简化了内部类的书写。
简化的前提:内部类必须继承或实现实现一个外部类或外部接口。
格式:
new 父类/接口名 { 实现方法/子类内容(覆盖父类的方法,可以添加自己的方法)}
匿名内部类其实就是一个子类匿名对象。这是一个带有内部的对象。
特殊实例:
new Object /*第一种情况*/ { void method() { /*Code;*/ } }.method(); Object obj=new Object /*第二种情况*/ { void method() { /*Code;*/ } }; obj.method();
第一种情况正常运行。
第二种情况不能正常运行。
原因:等号右边是一个Object类的子类对象,用匿名对象来表示的。当把这个对象赋值给Object类型的obj时,该类的对象就相当于转换成为Object。而obj中时没有定义method方法的。这就是在多态时,一般非静态函数调用时,编译看左边,运行看右边的原理。