『Java』面向对象--多态+Object篇

多态,是面向对象中的一大特点.其,在继承的基础上产生,就是使java世界中的实物具有多种存在形态.

 

多态定义:某一类事物的多种存在形态

体现(表现形式):父类的引用指向了自己的子类对象;或者也可以说父类的引用也可以接受自己的子类对象.

前提:必须是类与类之间有关系,要么继承,要么实现.通常还要存在覆盖.

好处:多态的出现大大提高了程序的扩展性

弊端,虽然提高了扩展性,但是也只能使用父类的引用访问父类中的成员而已

 

例子:   动物:猫  , 狗 , 

 

abstract class Animal{
	abstract void eat();
}
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 defend(){
		System.out.println("守家");
	}
}
public class DuoTaiDemo {
	public static void main(String[] args) {
		Animal a=new cat();//类型提升,向上转型
		a.eat();//打印出"吃鱼"
		//如果想要调用猫的特有方法,可以强制将父类的引用,转成子类类型.向下转型
		cat c=(cat)a;//向下转型
		c.catchMouse();
	}

}

 

 

 

 

 

(重)在多态中,成员函数的特点:

在编译时期:参阅引用型变量所属的类中是否有调用的方法.如果有,编译通过,如果没有编译失败.

在运行时期:参阅对象所属的类中是否有调用的方法.

 

在多态中,成员变量的特点:

当父类,子类出现重名变量时,无论编译还是运行,都参考左边(引用型变量所属的类)

 

在多态中,静态成员函数,变量特点:

无论编译和运行,都参考左边(只参考引用所属,与类静态绑定)

 

class Fu{
	int num=5;
	void method1(){
		System.out.println("fu_1");
	}void method2(){
		System.out.println("fu_2");
	}static void method4(){
		System.out.println("fu_4");
	}
}
class Zi extends Fu{
	int num=8;
	void method1(){
		System.out.println("zi_1");
	}void method3(){
		System.out.println("zi_3");
	}static void method4(){
		System.out.println("zi_4");
	}
}
public class DuoTaiDemo{
	public static void main(String[] args) {
		Fu f=new Zi();
		f.method1();
		f.method2();
		//f.method3();父类中没有,必须向下转型才可以调到
		System.out.println(f.num);//打印出5,是父类中的num
		Zi z=new Zi();
		z.method1();//打印出zi_1
		z.method2();//打印出fu_2,继承父类的,直接用
		z.method3();//打印出zi_3
		System.out.println(z.num);//打印出8,是子类中的num
		
		f.method4();//result:fu_4
		z.method4();//result:zi_4
		
	}
}

 

 

 

 

 

Object 类,是类层次结构的根类.每个类都使用Object作为超类(包括数组)都实现这个类的方法.[所有对象的直接或间接父类,就是上帝,该类中定义的是所有对象都具备的功能]

常见的有equals----Object类中提供的.

对,对象是否相同的比较方法.[如果自定义类中也有比较相同的功能,此时没必要重新定义,只要沿袭父类中的功能即可,建立自己特有的比较内容]

 

class Demo{//extends Object
	private int num;
	Demo(int num){
		this.num=num;
	}
	public boolean equals(Object obj){//Object obj=new Demo();
		if(!(obj instanceof Demo))//判断obj是否为demo类的对象
			return false;
		Demo d=(Demo)obj;//向下转型
		return this.num==d.num;
		
	}
	
}
public class  Test{
	public static void main(String[] args) {
		Demo d1=new Demo(4);
		Demo d1=new Demo(4);
		System.out.println(d1.equals(d2));//使用复写后的equals,结果为true
		//假设有一个person类
		person p=new person(4);
		System.out.println(d1.equals(p));//因为p不是demo类的对象,不能调用demo类中的equals方法,用的还是Object中的,所以结果是false
	}
}

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值