匿名内部类
匿名内部类是在抽象类和接口基础之上建立起来的一种结构,必须以抽象类和接口为主
实例
interface A{
public void fun();
}
public class TextDemo14{
public static void main(String[] args) {
A a = new A(){
public void fun(){
System.out.println("Hello World!");
}
};
a.fun();
}
}
Object类
在整个Java设计过程中,实际上已经很好的考虑到了参数统一问题,毕竟在整个Java的环境下,类至少有几十亿个,那么在进行语言设计时就必须考虑到这几十亿个类的统一问题,所以才提出了Object的概念。
在每定义一个类的时候,如果此类没有明确的继承一个类,则将默认继承Object类,即:所有的类但是Object子类,那么以下两种类的定义结构完全相同。
| class Person{ } | class Person extends Object{//默认是Object子类 } |
范例:利用Object类接收所有类对象
class Person extends Object{ //默认隐含Object
}
public class TextDemo14{
public static void main(String[] args) {
Object objA = new Person();
Object objB = "HELLO";
System.out.println(objA); //Person@64ea66
System.out.println(objB); //HELLO
}
}
在Object类里面定义了许多方法,那么其中在用户定义简单Java类的时候从标准来讲应该覆写Object类之中的三个方法:
- 取得对象信息:public String toString(),代替之前的getInfo();
- 对象比较:public boolean equals(Object obj);
- 对象哈希码:public int hashCode()
取得对象信息;toString()
既然所有的类但是Object类的子类,那么就证明,Object之中所有的方法每一个类都会继承。当用户输出对象的时候,实际上都会默认调用toString()方法,如果子类,没有覆写此方法,则会调用Object类之中提供的toString(),而此方法的默认实现是输出对象的公共属性--对象地址数据
那么一般可以由用户自己进行toString()方法的覆写
范例:覆写toString()方法
class Person{ //默认隐含Object
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String toString(){
return "姓名:" + this.name + ",年龄:" + this.age;
}
}
public class TextDemo14{
public static void main(String[] args) {
Person per = new Person("李四",30);
System.out.println(per);
System.out.println(per.toString());
}
}
对象比较:public boolean equals(Object obj)
在学习String类的时候已经接触到了equals()方法,是进行字符串比较的,因为String类的equals()方法就是覆写Object类的equals()方法而来。所以严格来讲,对象比较的方法不是之前的compare()而应该换成equals()
范例
class Person{ //默认隐含Object
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public boolean equals(Object obj){
if(obj == null){
return false;
}
if(this == obj){
return true;
}
if(!(obj instanceof Person)){//不是本类实例
return false;
}
Person Person = (Person)obj; //向下转型
if(this.name.equals(Person.name)&&this.age == Person.age){
return true;
}
return false;
}
public String toString(){
return "姓名:" + this.name + ",年龄:" + this.age;
}
}
public class TextDemo14{
public static void main(String[] args) {
Person perA = new Person("李四",30);
Person perB = new Person("李四",30);
System.out.println(perA.equals(perB));
System.out.println(perA.equals("ABC"));
}
}
结果
接收所有引用数据
既然Object是属于类的父类,那么一定可以接收所有的类对象,可是在Java设计的过程中,考虑到参数统一问题,让Object类的功能扩大了,即:使用Object可以接收数组或者是接口对象。
范例:使用Object接收数组
public class TextDemo14{
public static void main(String[] args) {
Object obj = new int[]{1,2,3};
if(obj instanceof int[]){
int result[] = (int[]) obj;
for(int x = 0 ; x < result.length ; x++){
System.out.prin(result[x] + "、"); //输出1、2、3、
}
}
}
}
范例:利用Object接收接口对象
interface A{
}
class B implements A{
public String toString(){
return "HELLO";
}
}
public class TextDemo14{
public static void main(String[] args) {
A a = new B(); //接口实例化
Object obj = a; //使用Object接收接口对象
A temp = (A)obj; //向下转型
System.out.println(temp); //输出HELLO
}
}
所有的引用类型都可以使用Object接收,以后可以利用Object作为参数的统一了



