当前位置: 首页 > news >正文

继承的使用以及super关键字和重写以及Object类

文章目录

  • 继承
    • 继承的语法格式
  • super关键字
  • 继承条件下的构造方法
  • 子类继承父类的什么
  • 使用继承
    • 何时使用继承?
  • 方法重写
  • Object类
  • 案例

在这里插入图片描述

继承

什么是继承?
继承是面向对象的三大特征之一,继承可以解决编程中代码冗余的问题,是实现代码重用的重要手段之一。

继承是软件可重用的一种表现,新类可以在不增加自身代码的情况下,通过从现有的类中继承其属性和方法,来充实自身内容,这种现象或行为就称为继承。此时,新类称为子类,现有的类称为父类。

继承最基本的作用就是使得代码可重用,增加软件的可扩充性。

Java中只支持单根继承,即每个类只能有一个直接父类。

继承表达的是“XX is a XX”的关系,或者说是一种特殊和一般的关系。如Dog is a Pet.
在这里插入图片描述

继承的语法格式

[访问修饰符] class <SubClass> extends <SuperClass>{
		//代码
}
  • 在Java中,继承通过extends关键字实现,其中SubClass称为子类,SuperClass称为父类或基类。
  • 访问修饰符如果是public,那么该类在整个项目中可见。
  • 若不写访问修饰符,则该类只在当前包中可见。
  • 在Java中,子类可以从父类中继承以下内容:
    1)可以继承public和protected修饰的属性和方法,不论子类和父类是否在同一个包里。
    2)可以继承默认访问修饰符修饰的属性和方法,但是子类和父类必须在同一个包里。
    3)无法继承父类的构造方法

super关键字

在这里插入图片描述
(1) 使用super关键字,super代表父类对象
(2) 在子类构造方法中调用且必须是第一句
(3) 不可以访问父类中定义为private的属性和方法

super关键字来访问父类的成员
super只能出现在子类的方法和构造方法中
super调用构造方法时,只能是第一句
super不能访问父类的private成员

继承条件下的构造方法

继承条件下构造方法的调用规则

  1. 子类构造方法没有通过super显式调用父类的有参构造方法,也没通过this显式调用自身其他构造方法
    系统默认调用父类的无参构造方法

  2. 子类构造方法通过super显式调用父类的有参构造方法
    执行父类相应构造方法,而不执行父类无参构造方法

  3. 子类构造方法通过this显式调用自身的其他构造方法 在相应构造方法中应用以上两条规则

子类继承父类的什么

  • 继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包里
  • 继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里
    在这里插入图片描述
    访问修饰符protected
  • 可以修饰属性和方法
  • 本类、同包、子类可以访问

使用继承

何时使用继承?

  • 继承与真实世界类似
    只要说“猫是哺乳动物”,猫的很多属性、行为就不言自明了
    藏赘是一种狗
    符合is-a关系的设计使用
  • 继承继承是代码重用的一种方式
    将子类共有的属性和行为放到父类中

在这里插入图片描述

方法重写

如果从父类继承的方法不能满足子类的需求,可以在子类中对父类的同名方法进行重写(覆盖),以符合需求。

方法重写(方法覆盖)必须满足如下要求:
–>重写方法和被重写方法必须具有相同的方法名
–>重写方法和被重写方法必须具有相同的参数列表
–>重写方法的返回值类型必须和被重写方法的返回值类型相同或者是其子类
–>重写方法不能缩小被重写方法的访问权限。

方法重载和方法重写的区别:
在这里插入图片描述

Object类

  1. Object类是所有类的父类。
    在这里插入图片描述
  2. 在Java中,所有的类都直接或者间接地继承了java.lang.Object类。
  3. Object类是所有Java类的祖先。
  4. 在定义一个类时,没有使用extend是关键字,也就是没有显示地继承某个类,那么这个类直接继承Object类。
  5. 所有对象都继承Object类中的方法。
    在这里插入图片描述
  6. Object类中的equals()方法用来比较两个对象是否是同一对象,若是,返回true,字符串对象的equals()方法用来比较两个字符串的值是否相等,java.lang.String类重写了Object类中的equals()方法。

案例

package cn.bdqn.demo02;

public class Animal {
	// 将demo01包中Dog类和Penguin类中相同的代码提取到这个Animal类中
	private String name;
	private int health;
	private int love;

	public Animal() {
	}

	public Animal(String name, int health, int love) {
		this.name = name;
		this.health = health;
		this.love = love;
	}

	public String getName() {
		return name;
	}

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

	public int getHealth() {
		return health;
	}

	public void setHealth(int health) {
		this.health = health;
	}

	public int getLove() {
		return love;
	}

	public void setLove(int love) {
		this.love = love;
	}

	public void print() {
		System.out.println("宠物信息-->昵称:" + this.getName() + ",健康值:"
				+ this.getHealth() + ",亲密度:" + this.getLove());
	}

}

package cn.bdqn.demo02;

public class Dog extends Animal {
	//在这个Dog类中只定义Dog类中特有的属性和方法,原来和Penguin类中相同的代码在Animal类中,通过继承获取,使用extends关键字来获取
	
	private String strain;

	public Dog() {
		super();//表示使用Animal类中的无参构造方法
	}

	public Dog(String name, int health, int love, String strain) {
		super(name, health, love);//表示使用Animal类中的有参构造方法
		this.strain = strain;
	}

	public String getStrain() {
		return strain;
	}

	public void setStrain(String strain) {
		this.strain = strain;
	}
	
	//定义Dog类中特有的方法
	public void eat(){
		System.out.println("狗吃骨头......");
	}
	
	public void printInfo(){
		super.print();
		System.out.println("品种:"+this.getStrain());
	}

}

package cn.bdqn.demo02;

public class Penguin extends Animal {
	//定义企鹅类中特有的属性
	private String sex;

	public Penguin() {
		super();//表示使用Animal类中的无参构造方法
	}

	public Penguin(String name, int health, int love, String sex) {
		super(name, health, love);
		this.sex = sex;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}
	
	//定义Penguin类中特有的方法
	public void swimming(){
		System.out.println("企鹅会仰泳.......");
	}


	
}

package cn.bdqn.demo02;

public class Test {

	public static void main(String[] args) {
		//创建Dog类对象
		Dog dog1 = new Dog();
		dog1.setName("旺财");
		dog1.setHealth(90);
		dog1.setLove(99);
		dog1.setStrain("金毛");
		//print()方法是Animal类中的
		dog1.print();
		//eat()方法是Dog类中的
		dog1.eat();
		dog1.printInfo();
		
		Penguin p1 = new Penguin("QQ", 90, 98, "公");
		//print()方法是Animal类中的
		p1.print();
		//swimming()是Penguin类中的
		p1.swimming();
		

	}

}

在这里插入图片描述

相关文章:

  • Spring中的AOP翻转的使用与在事务管理中的表现
  • DataOps: A New Discipline 数据治理的下一步
  • 一些现代 Javascript 技巧
  • Java学习 --- 类方法(静态方法)
  • 网课答案搜题方法详细步骤
  • promise函数
  • 何云伟全国相声巡回演,首场定在北京吉祥戏楼,不知道送不送鸡蛋
  • 秋招面试!阿里、字节、美团等大厂面试我只刷这份《Java面试题》没想到还真拿下了offer!
  • Day741.Redis消息队列 -Redis 核心技术与实战
  • C 语言的特性
  • python使用xlwings模块生成excel文件、并将数据写入生成的excel文件中、将数据写入指定表单的指定单元格中
  • 游戏客户端--个人学习路线总结、指北
  • 电场与磁场中的物理量
  • 【C++】基础入门(一):域、命名空间、C++输入输出
  • Hadoop生态及Hive、HBase、Impala、HDFS之间的关系
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Fastjson的基本使用方法大全
  • Intervention/image 图片处理扩展包的安装和使用
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • react 代码优化(一) ——事件处理
  • React-生命周期杂记
  • Web Storage相关
  • 订阅Forge Viewer所有的事件
  • 前端存储 - localStorage
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 用mpvue开发微信小程序
  • 正则学习笔记
  • 数据可视化之下发图实践
  • ​io --- 处理流的核心工具​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • (3)nginx 配置(nginx.conf)
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (Note)C++中的继承方式
  • (Python) SOAP Web Service (HTTP POST)
  • (Python第六天)文件处理
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (深度全面解析)ChatGPT的重大更新给创业者带来了哪些红利机会
  • (十六)串口UART
  • (转)Groupon前传:从10个月的失败作品修改,1个月找到成功
  • (转)http协议
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .net core 6 集成 elasticsearch 并 使用分词器
  • .NET Core 项目指定SDK版本
  • .NET 常见的偏门问题
  • .NET 发展历程
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET命令行(CLI)常用命令
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • @angular/cli项目构建--Dynamic.Form
  • [ C++ ] STL---stack与queue
  • [ vulhub漏洞复现篇 ] Hadoop-yarn-RPC 未授权访问漏洞复现