Java面向对象之类的继承介绍

 更新时间:2022年02月14日 09:32:14   作者:凤文Studying  
大家好,本篇文章主要讲的是Java面向对象之类的继承介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下

继承的作用

如果没有继承机制是怎么样的?

有以下两个类,分别是Student、Teacher,它们的实现类如下:

/**
 * 老师类 封装了姓名、年龄
 * 
 * @author Administrator
 *
 */
public class Teacher {
	private String name;
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

public class Student {
	private String name;
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

我们发现,这两个类中的属性和方法都是一样的,或者说这两个类都有相同的某些特性。

使用继承机制后的示例?

先写一个Person父类:

public class Person {
	private String name;
	private int age;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}
}

两个类继承Person

public class Teacher extends Person {

}
public class Student extends Person {

}

再写个测试类看一下:

public class Test {
	public static void main(String[] args) {
		Student s = new Student();
		s.setName("学生");
		Teacher t = new Teacher();
		t.setName("老师");
		System.out.println(s.getName() + " " + t.getName());
	}
}

在这里插入图片描述

类的继承是什么?

通过上面的演示,我们发现继承了Person类后,就算在Student、Teacher类中不写对应的方法,也能使用父类的方法,这说明了子类继承了父类的属性和方法。其中Person叫做父类,Student、Teacher这样的由Person衍生的类叫做子类。继承的关键字是extends

继承的作用:减少重复的、冗余的相同属性和方法。

多个类中存在相同的属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些相同的属性和行为,只有继承那个类即可。

子类和父类的继承机制

继承关系是两个类,一个为子类(派生类),一个是(父类)。子类继承父类,使用关键字extends表示(extends的意思是扩展,所以子类是对父类的扩展,就是说,我们还可以在子类中添加独属于它的属性和方法)。Java中的类只有单继承,没有多继承(一个儿子只能有一个爸爸,但是爸爸可以有多个儿子)

Java单继承

Java不支持多继承,只允许一个类直接继承另一个类;
子类只能有一个父类,extends 关键字后面只能有一个类名

public class Animal {

}
public class Person {

}

我们让Student继承Animal和Person:

在这里插入图片描述

发现不允许多继承。这里提一下,虽然不能多继承,但是可以实现多个接口。

虽然不能多继承,但不代表不能多重继承(爸爸的爸爸是爷爷):

public class Person extends Animal{

}
public class Student extends Person {

}

学生是人类,人类是动物,所以学生也是动物。

Java继承的顶级父类:Object

Object类是Java中所有类的始祖,Java中的每一个类都是由它扩展而来,但是并不明确写出要继承它,根据继承的特性,所有的Java类都拥有其方法

这里介绍Object中的常用方法:hashCode()toString()equals(Object obj),这也是所有类都有的方法。

hashCode()方法: 返回对象存储地址。

	public static void main(String[] args) {
		System.out.println(new Person().hashCode());
		System.out.println(new Person().hashCode());
	}

在这里插入图片描述

这个地址对于每个对象都是唯一的,如果两对象的hashCode值一样,说明它们是同一对象。

toString()方法:该方法用来返回对象的字符串表示形式。

	public static void main(String[] args) {
		System.out.println(new Person().toString());
		System.out.println(new Person().toString());
	}

默认的toString()方法是类名+@+hashCode()相关的唯一标识。

看源码如下:

在这里插入图片描述

现在我们重写一下toString()方法:

public class Person {
	private String name;
	private int age;

	public Person() {
		this.name = "未命名";
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
}

运行结果:

在这里插入图片描述

equals(Object obj): 该方法用于判断两个对象是否相同,如果没有被重写,其与==等价。

	public static void main(String[] args) {
		Person p1 = new Person();
		Person p2 = new Person();
		System.out.println(p1.equals(p2));
	}

在这里插入图片描述

equals方法源码如下:

在这里插入图片描述

Object的equals方法比较的就是两对象的地址。
String类的equals方法就被重写了。

对象的类型转换

对象向上转型

子类转换成为父类,向上转型
格式: 父类名称 对象名称 = new 子类名称();
含义: 把创建的子类对象当做父类看待和使用

public class Person {
	public void run() {
		System.out.println("Person run");
	}
}
public class Student extends Person{
	public void study() {
		System.out.println("Student study");
	}
}
public class Test {
	public static void main(String[] args) {
		// 子类的对象 当作 父类的类型 使用,向上转型
		Person stu = new Student();
		stu.run();
		// 父类不能调用子类特有的方法
//		stu.study();

	}
}

对象向下转型

父类转换为子类,向下转型
子类 引用 = (子类) 父类对象
强制类型转换

	public static void main(String[] args) {
		Person p = new Person();// 向下转型
		Student stu = (Student) p;

		Student stu1 = (Student) new Person();// 还可以这样写

		stu.run();
		stu.study();
	}

需要注意可能会报java.lang.ClassCastException异常;
当应用程序代码尝试将某一对象转换为某一子类时,如果该对象并非该子类的实例,JVM就会抛出ClassCastException异常。

在这里插入图片描述

以下情况就不会报类型转换的异常,因为原本就是Student类的,强转回来依旧是Student类

	public static void main(String[] args) {
		Person p = new Student();
		Student stu = (Student) p;
		stu.run();
		stu.study();
	}

明显地,类的类型转换就跟基本数据类型的转换写法一致。

总结

到此这篇关于Java面向对象之类的继承介绍的文章就介绍到这了,更多相关Java继承内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot集成Spring Security的方法

    SpringBoot集成Spring Security的方法

    Spring security,是一个强大的和高度可定制的身份验证和访问控制框架。这篇文章主要介绍了SpringBoot集成Spring Security的操作方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-07-07
  • IDEA中使用Git的图文教程

    IDEA中使用Git的图文教程

    本文主要介绍了IDEA中使用Git的图文教程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Java字符转码之UTF-8互转GBK具体实现

    Java字符转码之UTF-8互转GBK具体实现

    在Java程序中字符串默认的编码方式是UTF-16编码,因此需要将GBK编码转换为UTF-8编码,主要是为了避免出现乱码的情况,这篇文章主要给大家介绍了关于Java字符转码之UTF-8互转GBK具体实现的相关资料,需要的朋友可以参考下
    2023-11-11
  • JPA save()方法将字段更新为null的解决方案

    JPA save()方法将字段更新为null的解决方案

    这篇文章主要介绍了JPA save()方法将字段更新为null的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • java按照模板导出pdf或word文件详细代码

    java按照模板导出pdf或word文件详细代码

    有时候业务中我们需要使用pdf模板生成一份pdf文件,下面这篇文章主要给大家介绍了关于java按照模板导出pdf或word文件的相关资料,文中给出了详细的代码示例,需要的朋友可以参考下
    2023-11-11
  • mybatis-plus @DS实现动态切换数据源原理

    mybatis-plus @DS实现动态切换数据源原理

    本文主要介绍了mybatis-plus @DS实现动态切换数据源原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • java算法入门之有效的括号删除有序数组中的重复项实现strStr

    java算法入门之有效的括号删除有序数组中的重复项实现strStr

    大家好,我是哪吒,一个热爱编码的Java工程师,本着"欲速则不达,欲达则欲速"的学习态度,在程序猿这条不归路上不断成长,所谓成长,不过是用时间慢慢擦亮你的眼睛,少时看重的,年长后却视若鸿毛,少时看轻的,年长后却视若泰山,成长之路,亦是渐渐放下执念,内心归于平静的旅程
    2021-08-08
  • Java后端面试题最新整理

    Java后端面试题最新整理

    在本篇文章里小编给大家整理了一篇关于Java后端面试题最新整理内容,需要的朋友们可以参考下。
    2020-12-12
  • Java-JFrame窗体美化方式

    Java-JFrame窗体美化方式

    这篇文章主要介绍了Java-JFrame窗体美化方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • mybatis项目CRUD步骤实例详解

    mybatis项目CRUD步骤实例详解

    这篇文章主要介绍了mybatis项目CRUD步骤,包括pom.xml引入相应的依赖,在resources目录下写配置文件,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-09-09

最新评论