java中的继承和重写
发布日期:2022-02-06 00:26:58 浏览次数:36 分类:技术文章

本文共 3689 字,大约阅读时间需要 12 分钟。

继承语法:

修饰符   subClass  extends  SuperClass{						//类定义部分}

继承(inheritance)通过 extends 关键字来实现,其中的subClass称为子类,SuperClass称为父类基类或超类。修饰符如果是public,则该类在整个项目中可见;若无public修饰符,则该类只在当前包可见;不可以使用private和protected修饰类。

(java中只支持单继承,即每个类只能有一个直接父类)

还有在java中,子类可以从父类中继承到那些“财产”?

1.继承public和protected修饰的属性和方法,无论子类和父类是否在同一个包里;

2.继承默认权限修饰符修饰的属性和方法,但子类和父类必须在同一个包里;
3.无法继承private修饰的属性 方法

父类

public class Pet {	/**	 * 宠物类,狗狗和企鹅的父类	 */	private String name="无名氏";	private int health=100;	private int love=0;	public String getName() {		return name;	}	public int getHealth() {		return health;	}	public int getLove() {		return love;	}	/**	 * 有参构造方法	 */	public Pet(String name){		this.name=name;	}	/**	 * 输出宠物信息	 */	public void print(){		System.out.println("宠物的自白:\n我的名字:"+this.name				+"健康值:"+this.health+"我和主人的亲密程度是:"+this.love);	}

子类 狗狗类

public class Dog extends Pet {	private String strain;//品种	public String getStrain(){		return strain;	}	/**	 * 有参构造方法	 */	public Dog(String name,String strain){		super(name);//此处不能是使用this.name=name		this.strain=strain;	}

测试类

public class Test {	public static void main(String[] args) {		Dog dog=new Dog("花花","拉布拉多");		dog.print();	}

运行结果:

宠物的自白:

我的名字:花花,健康值:100,我和主人的亲密度为:0

重写

但从运行过来看,子类的strain属性值并未运行出来,这是因为父类的实例方法中没有给它点化出来,那么怎样才能让他从控制台输出出来呢?总不可能从父类在写给实例方法,那就坏了,因此我们就用到了重写方法

重写和继承关系中的构造方法
子类重写父类方法
在子类中可以根据需求对父类继承的方法进行重新编写,称为方法的重写或方法的覆盖(overriding)

public class Dog extends Pet {	private String strain;//品种	public String getStrain(){		return strain;	}	/**	 * 有参构造方法	 */	public Dog(String name,String strain){		super(name);//此处不能是使用this.name=name		this.strain=strain;	}/** * @author 21600 *子类重写父类 */	public void print(){		super.print();		System.out.println("品种为:"+this.strain);	}	}

运行结果:

宠物的自白:

我的名字:花花,健康值:100,我和主人的亲密度为:0,品种为:拉布拉多

***重写方法要求 ***

1.重写方法和被重写方法必须具有相同的方法名。
2.重写方法和被重写方法必须具有相同的参数列表。
3.重写方法的返回值类型必须和被重写的方法的返回值类型相同或是(其子类)。
4.重写方法不能缩小被重写方法的访问权限

来看一下各个修饰符的访问权限-----

在这里插入图片描述

重载(overloding)和重写(overrding)有什么区别和联系?

1.重载涉及同一个类中的同名方法,要求方法名相同,参数列表不同。与(无)返回值类型,访问修饰符无关;

2.重写涉及得是子类和父类之间的同名方法,要求方法名相同,参数列表相同,返回值类型相同(或是其子类),访问修饰符不能严于父类。

Super代表当前对象的直接父类对象的默认引用

1.Super必须出现在子类(子类的方法和构造方法)中,而不是其他位置。

2.可以访问父类的成员,如父类的属性,方法,构造方法。
3.注意访问权限的限制,如无法通过super访问Private成员。

在构造方法中,如果有this语句或super语句出现,则只能是第一条语句

在一个构造方法中不允许同时出现使用this和supper语句调用构造方法(否则就有两条第一条语句)。
在类方法中不允许出现this和supper关键字
在实例方法中,this和supper语句不要求是第一条语句,可以共存。

抽象类

抽象类和抽象方法

创建pet类实际上是没有意义的,因为实际生活中有狗狗,猫猫,蛋蛋等,而没有一种称为宠物的动物,宠物只是我们抽象出来的一个概念。那么如何把pet限制为不能被实例化呢?

使用java中的抽象类来实现,用abstract来修饰pet类。抽象类不能通过new实例化。

Public abstract  class  Pet{			publilc Pet(String name){			this.name=name;			}			public void print(){			//输出内容.......			}           类定义部分.......    }
public class Test {	public static void main(String[] args) {	Pet pet=new Pet("贝贝");//抽象类不能实例化,程序报错	pet.print();	}}
抽象方法呢就是在父类实例方法中参入abstract来修饰方法,那么子类就必须重写该父类的方法,道理和上面的抽象类差不多相同,如果子类没有重写父类的方法,那么就会程序报错!

抽象类和抽象方法的特点如下

1.抽象类和抽象方法都通过abstract关键字来修饰
2 ** 抽象类不能实例化 **。抽象类中可以没有、有一个、或多个抽象方法,甚至全部方法都可以是抽象方法。
3.抽象方法只有方法声明,没有方法实现。有抽象方法的类必须声明为抽象类。 子类必须重写所有的抽象的方法才能实例化,否则子类还是一个抽象类

abstract 可以用来修饰类和方法,但不能用来修饰属性和构造方法。

final修饰符

1.用final修饰的类不能再被继承、

2.修饰的方法不能被子类重写、
3.修饰的变量(包括成员变量和局部变量)将变成常量,只能赋值一次

注意了老铁们!

1.final和abstract是功能相反的两个关键字,可以对比记忆。

2. abstract 可以用来修饰类和方法,不能用来修饰属性和构造方法
final可以用来修饰类、方法、和属性,不能修饰构造方法

final修饰引用型变量:

Class Dog{		String name;		public Dog(String name){		this.name=name;		}}Class TestDog{		public static void main(String[] args) {		final  Dog dog=new Dog("单身狗");		dog.name="我是单身狗";//正确		dog=new Dog("我还是单身狗");  //程序报错}}

对于引用型变量,一定要区分对象的引用值对象的属性值两个概念。使用final修饰引用型变量,变量不可以另外的对象,所以“dog=new Dog(“我还是单身狗”);" 是错误的。但是所指对的内容却是可以改变的,所以“dog.name=“我是单身狗”;”是正确的。

结论:

使用final修饰引用型变量时,变量的值是固定不变的,而变量所指向的对象的属性值是可变的斜体样式

abstract不能和Private同时修饰一个方法

abstract不能和static同时修饰一个方法
abstract不能和final同时修饰一个方法和类

转载地址:https://blog.csdn.net/weixin_46175284/article/details/105031974 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Java中的封装和this关键字
下一篇:java中的单例

发表评论

最新留言

很好
[***.229.124.182]2024年03月07日 04时17分57秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

java 自助更改密码 api_搭建ldap自助修改密码系统--Self Service Password 2019-04-21
php继承exten,stylus中文文档 » 继承(@extend) » 张鑫旭-鑫空间-鑫生活 2019-04-21
mysql函数大全 pdf,MySQL函数大全 2019-04-21
php 常用文件系统函数,php 文件系统函数整理介绍 2019-04-21
android pm.java,java – AM / PM的Android DateFormat因设备而异 2019-04-21
oracle存储过程调用sql文件,oracle - 在SQL Developer中运行存储过程? 2019-04-21
oracle同时报604和12507,V$SES_OPTIMIZER_ENV 查不到刚修改的隐含参数, 2019-04-21
zblog的php更换域名,zblogphp更换域名后,原zblog里使用了固定域名,登录不进去怎么办... 2019-04-21
oracle dnfs 配置,Source of Oracle参数解析(dnfs_batch_size) - django-\/\/ i K | 2019-04-21
oracle所需的环境,转:面对一个全新的oracle环境,首先应该了解什么? 2019-04-21
linux 小数四则运行,shell四则运算(整数及浮点数)的方法介绍 2019-04-21
linux系统分区后进入紧急模式,Linux系统的救援模式应用详解 2019-04-21
linux配置匿名ftp服务器,在Linux环境中使用vsftpd搭建ftp实现匿名上传详细配置 2019-04-21
linux创建硬盘分区lvm,LVM创建及分区调整、更换LVM硬盘 2019-04-21
FreeBSD可以安装Linux软件吗,在Linux服务器上面通过网络安装FreeBSD 2019-04-21
.net core linux 桌面应用,C# dotnet core + AvaloniaUI 开发桌面软件,hello world 2019-04-21
linux tcp 113错误,linux系统报tcp_mark_head_lost错误的处理方法 2019-04-21
南昌工程学院c语言答案,南昌工程学院C语言程序设计基础课件第3讲运算符和表达式... 2019-04-21
python学画画_python学画画(下) 2019-04-21
云栖社区 mysql_【直播结束,已更新回放】PG、MySQL到底哪个好?云栖说这次请来五位专家撕了一下-阿里云开发者社区... 2019-04-21