4.3对象的多态性

本文详细解析了Java中的多态性概念,包括子类自动转化为父类及父类转化为子类的机制。同时,通过实例展示了如何使用instanceof关键字判断类是否实现了接口。此外,还介绍了Object类及其三个重要方法的复写,以及如何通过匿名内部类简化代码。文章结合实例,旨在帮助读者深入理解Java面向对象编程的核心特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Java的多态性指的就是:子类可以自动转化为父类,父类如果想转化为子类需要做强制转化。

二、我们可以用instanceof来判断是否一个类实现了某一个接口,格式为: 对象instanceof 类(或接口)

三、object类:Object类

      所有的类都继承自Object类,这是所有类的一个基类.

      一个比较好的类,需要复写Object类中的三个方法.

   |- public String toString()     

   |- public boolean equals(Object obj)

   |- public int hashCode()

      在下面的例子中,类Student复写了上面的toString()方法和equals()方法,而且使用到了instanceof关键字,算是一个小复习题目了~      

 

class Student  //任意类都是继承了Object类,最好复写里面的toString()和equals()方法
{
	private String name;
	private int age;
	public Student(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	
	//复写Object类中的toString()方法,实现自定义toString()
	public String toString()
	{
		return "该学生的姓名是: "+name+",该学生的年龄是: "+age;
	}
	//复写Object类中的equals()方法,注意,Object类中equals()接收的是Object对象
	public boolean equals (Object obj)
	{
		//如果被比较对象和比较对象的内存地址都是一样的,那肯定是同一对象
		//注意: 内存地址的比较使用"=="
		if (this == obj)
		{
			return true;
		}
		else
		{
			//如果obj不是Student的实例,肯定不相等了,返回false;
			if(!(obj instanceof Student))
			{
				return false;
			}
			else
			{	
				//走到这步,说明obj是Student的实例对象,进行类型转换后对比之
				Student stu = (Student) obj;
				if(this.name.equals(stu.name)&&this.age == stu.age)
				{
					return true;
				}
				else
				{
					return false;
				}			
			}
		}
	}
}
public class Demo04
{
	public static void main(String args[])
	{
		Student stu1 = new Student("newsainton",23);
		Student stu2 = new Student("newsainton",23);
		
		//使用toString()方法输出stu1对象
		System.out.println(stu1.toString());
		//使用toString()方法输出stu2对象
		System.out.println(stu2.toString());
		//比较stu1和stu2是否相等
		System.out.println("比较stu1和stu2是否相等: "+ stu1.equals(stu2));
	}
 四、匿名内部类:
     
     

    java的匿名内部类的语法规则看上去有些古怪,不过如同匿名数组一样,当你只需要创建一个类的对象而且用不上它的名字时,使用内部类可以使代码看上去简洁清楚。它的语法规则是这样的:

new interfacename(){......}; 或 new superclassname(){......};

下面接着前面继续举例子:

public class Goods3 {      public Contents cont(){           return new Contents(){                private int i = 11;                public int value() {                     return i;                }           };      } }

这里方法cont()使用匿名内部类直接返回了一个实现了接口Contents的类的对象,看上去的确十分简洁。

在java的事件处理的匿名适配器中,匿名内部类被大量的使用。例如在想关闭窗口时加上这样一句代码:

frame.addWindowListener(new WindowAdapter(){      public void windowClosing(WindowEvent e){           System.exit(0);      } });

    有一点需要注意的是,匿名内部类由于没有名字,所以它没有构造函数(但是如果这个匿名内部类继承了一个只含有带参数构造函数的父类,创建它的时候必须带上这些参数,并在实现的过程中使用super关键字调用相应的内容)。如果你想要初始化它的成员变量,有下面几种方法:

  1. 如果是在一个方法的匿名内部类,可以利用这个方法传进你想要的参数,不过记住,这些参数必须被声明为final。
  2. 将匿名内部类改造成有名字的局部内部类,这样它就可以拥有构造函数了。
  3. 在这个匿名内部类中使用初始化代码块。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值