java中的继承和重写

继承语法:

修饰符   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同时修饰一个方法和类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值