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