1、Object类
Object类:Java中所有类的公共父类,如果一个类未明确地继承其他类则一定是Object的子类。
Object类的主要方法 |
---|
方法名称 | 类型 | 描述 |
---|---|---|
public Object() | 构造 | 构造方法 |
public boolean equals(Object obj) | 普通 | 对象比较 |
public int hashCode() | 普通 | 取得hash码 |
public String toString | 普通 | 对象打印时调用 |
equals()方法默认比较的是地址,toString()方法默认打印的是对象地址。平常使用这两种方法时为方便开发会覆写这两种方法。
public class ObjectDemo01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Demo01 d1=new Demo01();
System.out.println(d1);
System.out.println(d1.toString()); //调用Object原有的toString()
Demo02 d2=new Demo02("张三");
System.out.println(d2.toString()); //调用被覆写的toString()
}
}
class Demo01{}
class Demo02{
private String name;
public Demo02(String name) {
this.setName(name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() { //覆写Object的toString()
return "姓名是:"+this.getName();
}
}
//[email protected]
//[email protected]
//姓名是:张三
对象在输出时一定会调用Object类的toString()打印内容,因此可以通过toString()取得对象的信息。——为取得对象具体的信息就需调用被自己覆写的toString()。
2、内部类的扩展
在一个抽象类中可以定义多个抽象类或接口,在一个接口中也可以定义多个接口或抽象类。
在抽象类中可以定义多个内部抽象类,在接口中可以定义多个内部接口。
public class InnerExtDemo01 {
public static void main(String[] args) {
// TODO Auto-generated method stub
A.B b=new X().new Y(); //实例化内部接口对象
b.printB(); //调用内部接口的抽象方法
}
}
abstract class A{
abstract void printA();
interface B{ //定义内部接口
abstract void printB();
}
}
class X extends A{
public void printA() {
System.out.println("抽象类中的抽象方法");
}
class Y implements B{ //定义内部类实习内部接口
public void printB() {
System.out.println("接口中的抽象方法");
}
}
}
//结果
//接口中的抽象方法
区别点 | 抽象类 | 接口 |
---|---|---|
定义 | 包含一个抽象方法的类 | 包含全局常量和抽象方法的集合 |
组成 | 构造方法、抽象方法、普通方法、常量、变量 | 抽象方法、全局常量 |
使用 | 子类继承抽象类(extends) | 子类实现接口(implements) |
特殊点或关系 | 抽象类可以包含或实现多个接口 | 接口可以包含多个抽象类但不能继承抽象类,但能继承多个接口 |
常见设计模式 | 模板设计 | 工厂设计、代理设计 |
对象 | 都通过对象的多态产生实例化对象 | |
局限 | 抽象类有单继承的局限 | 接口无此局限 |
实际 | 作为一个模板 | 作为一个标准或表示一种能力 |
选择 | 如果抽象类和接口都能使用,优先选择接口(避免单继承的局限) |
3、匿名内部类
定义:没有具体名称的类。
作用:可利用内部类创建不具有名称的对象,并利用它访问类中的成员。
常见的应用:避免接口实现类使用次数太少而去单独定义一个类。
public class NoInnerClassDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
new X().fun2();
}
}
interface A{
abstract void print();
}
class X{
public void fun1(A a) { //方便接受接口的实例化对象
a.print(); //调用接口方法
}
//1、实例化接口对象
//new A(){} //接口本身不能直接实例化,使用{}方法在实例化后实现接口抽象方法
//2、实现接口方法
//new A(){
// **********
// }
public void fun2() {
this.fun1(new A() { //匿名内部类
public void print() { //实现接口的方法
System.out.println("实现接口抽象方法");
}
});
}
}
//结果:
//实现接口抽象方法