本文共 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!