1、Object 类
Object类是类层次结构的根类,每个类都使用Object类作为父类,所有对象(包括数组)都实现这个类的方法。
Object类中定义了很多方法,每个类既然是Object类的子类,那么每个类都继承了Object类中的方法。
例如,1、Object类中定义了一个equals()方法:
boolean equals.(Object obj) { 指示其它对象与此对象是否“相等” };返回值为布尔类型。
2、Object类中还有个 toString()方法:
String toString() { 返回该对象的字符串表示 };
3、Object类中还有个getClass() 方法:
Class getClass() { 返回Object的运行时类 };可理解为“反编译”过程,把对象转换成Class类。
4、而 Class 类中有个方法:
String getName() { 以String 的形式返回此Class 对象所表示的实体(类、接口、数组类、基本类型或 void)名称。 }
代码示例:
class ObjectDemo {
public static void main(String[] args){
Demo d1 = new Demo();
Demo d2 = new Demo();
System.out.println(d1.equals(d2)); //判断d1和d2是不是一个对象
System.out.println(d1.toString()); //把d1这个对象以字符串形式输出,“类名+@+对象哈希值”
Class c = d1.getClass(); //把d1这个对象转成运行时类文件
System.out.println(c.getName()); //输出这个类文件的文件名
}
}
class Demo { //extends Object,默认继承Object类
}
编译运行结果:
2、多态
2.1 多态的定义
多态的思想可以理解为,一个事物的多种体现形态,就是多态。
2.2 多态的体现
现实中的举例:动物这种事物,可以体现成多种形态,比如猫是一种动物,狗也是一种动物,而猫和狗就是动物的多种体现形态。
体现到代码中举例:父类引用指向子类对象,父类引用也可以接收自己的子类对象。
所谓父类引用指向子类对象,就是 new一个子类对象,但是命名的变量定义为父类的类型。
多态通常伴随着向上转型和对象类型的强制转换。(参考继承的那篇博客)
多态代码示例:
class Animal {
public void eat(){
System.out.println("动物");
}
public void cc() {
System.out.println("CC");
}
}
class Cat extends Animal {
public void eat() {
System.out.println("吃鱼");
}
public void catchmouse() {
System.out.println("抓老鼠");
}
}
class Dog extends Animal {
public void eat() {
System.out.println("吃骨头");
}
public void kanjia() {
System.out.println("看家");
}
}
class DuoTaiDemo{
public static void main(String[] args){
Animal c = new Cat(); //父类引用指向子类对象,即多态
c.eat();
c.cc();
}
}
编译运行结果:
2.3 多态的前提
必须是类与类之间有关系,要么继承,要么实现。
通常还有一个前提:存在方法覆盖,也叫重写。
2.4 多态的好处
多态的出现提高了程序的扩展性和后期可维护性。
2.5 多态的弊端
多态提高了程序的可扩展性,但是只能使用父类的引用访问父类中的成员
。
如果想要访问子类的特有方法或者属性,还要强制让父类引用向下转型。
所以多态的出现,一致都是子类在来回转换角色,
向上转型父类引用指向子类对象,或者向下转型,访问子类特有的内容
所以多态的出现,一致都是子类在来回转换角色,
向上转型父类引用指向子类对象,或者向下转型,访问子类特有的内容
2.6 多态中成员的特点
(1)多态中成员函数的特点:
在编译时期:参考引用型变量所属的类中是否有调用的方法。如果有,编译通过;如果没有,编译失败。
在运行时期:参考对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态被调用时,编译看左边,运行看右边。
(2)多态中成员变量的特点:
无论编译和运行,都参考左边(引用型变量所属的类)
(3)多态中静态成员函数的特点:
无论编译和运行,都参考左边。