java 的继承,java类的继承怎么写
00-1010前言继承重写和隐藏父类方法的优点父类中的重写方法父类中的隐藏方法重写和隐藏修饰符子类使用super关键字调用父类的私有成员参数构造方法/父类的参数构造方法附:继承的使用和理解总结
00-1010继承是面向对象语法的三大特征之一。继承可以减少代码编写的冗余,提高编程的效率。通过继承,子类得到父类的成员变量和方法。子类如何继承父类的字段和方法,如何修改从父类继承的子类的方法?今天,我们开始学习Java继承。
00-1010继承是指子类继承了父类的特征和行为,这样子类对象(实例)就拥有了父类的实例域和方法,或者子类继承了父类的方法,这样子类就拥有了与父类相同的行为。
继承的作用:通过继承可以快速创建新类,实现代码重用,提高程序可维护性,节省创建新类的时间,提高开发效率和质量。
在Java中,可以通过extends关键字声明一个类是从另一个类继承的。一般形式如下:
类别父类别{.//成员变量,成员方法}类子类扩展父类{.//类主体}
例如:
Class teacher{ //声明一个教师类作为父类字符串名称;//定义父类的成员变量name和age int ageVoid show(){ //定义父类成员方法,将成员变量输出到system . out . println(name);System.out.println(年龄);} } Class Student Extensions Teacher {//将学生类声明为子类并继承父类} Public Class my first { Public static void main(string[]args){ system . out . println( Student );学生学生=新生();//声明Student类student.name=Tom 的实例对象;//子类调用父类的成员变量名,赋值student.age=19//子类调用父类的成员变量age并赋值student . show();//子类调用父类的成员方法show }},运行结果是:
学生汤姆19
注意:
子类不能选择性地从父类继承;Java不支持多重继承,但是一个类可以实现多个接口,克服了单一继承的缺点;子类不继承构造函数,但是可以从子类调用父类的构造函数。
00-1010继承的字段和方法可以像其他任何字段和方法一样直接使用;可以在子类中声明一个与父类同名的新字段或静态方法,从而将父类中的字段或方法“隐藏”起来;可以在父类之外的子类中声明新的字段和方法;可以在子类中写一个与父类同名的新实例方法,称为“方法重写”或“方法重写”;您可以编写一个子类构造方法来调用子类中的父类构造方法,要么隐式调用,要么使用关键字super。
00-1010子类继承父类中的所有成员和方法,但在某些情况下,子类中该方法所代表的行为与其父类中该方法所代表的行为并不完全相同。比如在父类的语言中定义了说话的方法,但是在子类中说话的方法是不一样的:外国人说英语,中国人说汉语,所以我们需要重写或者隐藏父类的这个方法。
00-1010当子类中的实例方法与其父类中的实例方法具有相同的签名(参数的名称、数量和类型)和返回值时,就说子类中的方法“重写”了父类的方法。例如:
A类{ public void sayHello() {//输出英文welcome system.out.println(您好,欢迎使用Java!);} public void say bye(){ system . out . println(大家再见);} }类B扩展了一个{ publi
c void sayHello() { //输出中文欢迎 System.out.println("大家好,欢迎学习Java!!!"); }}public class myfirst { public static void main(String[] args) { B b=new B(); //创建子类B的一个实例对象,使用默认构造方法 b.sayHello(); //调用子类中重写的方法 b.sayBye(); //调用父类中的方法 }}运行结果为:
大家好,欢迎学习Java!!!GoodBye,everyone
注意:重写的方法具有与其所重写的方法相同的名称、参数数量、类型和返回值。
隐藏父类中的方法
如果一个子类定义了一个静态类方法,而这个类方法与其父类的一个类方法具有相同的签名(指名称、参数格式和类型)和返回值,则称在子类中的这个类方法隐藏了父类中的该类方法。
当调用被重写的方法时,调用的版本是子类的方法;当调用被隐藏的方法时,调用的版本取决于是从父类中调用还是从子类中调用。
class A{ public static void sayHello() { //静态类方法 System.out.println("大家好,这是A的静态类方法"); } public void sayHello2() { //实例方法 System.out.println("大家好,这是A中的实例方法"); }}class B extends A { public static void sayHello() { //静态类方法 System.out.println("大家好,这是B的静态类方法"); } public void sayHello2() { //实例方法 System.out.println("大家好,这是B的实例方法"); }}public class myfirst { public static void main(String[] args) { B b=new B(); //创建B类的实例对象b A a=b; //隐式对象类型转换 A.sayHello(); //调用A类的静态类方法 a.sayHello(); //调用a对象的静态类方法 B.sayHello(); //调用B类的静态方法 a.sayHello2(); //调用a对象的实例方法 b.sayHello2(); //调用b对象的的实例方法 A a2=new A(); //创建A类的实例对象a2 a2.sayHello2(); //调用a2对象的实现方法 }}
运行结果为:
大家好,这是A的静态类方法大家好,这是A的静态类方法大家好,这是B的静态类方法大家好,这是B的实例方法大家好,这是B的实例方法大家好,这是A中的实例方法
可以看出,得到调用的隐藏方法是父类中的方法,而得到调用的重写方法是子类中的方法。
方法重写和隐藏后的修饰符
在子类中被重写的方法,其访问权限允许大于但不允许小于被其重写的方法,例如:父类中一个受保护的实例方法(protected)在子类中可以是公共的(public)的,但不可以是私有的(private)。如果一个方法在父类中是static方法,那么在子类也必须是static方法;如果一个方法在父类中是实例方法,那么在子类中也必须是实例方法。
子类访问父类私有成员
子类继承其父类的所有public和protected成员,但不能继承其父类的private成员。那么如何在子类中访问到父类中的字段呢,我们可以在父类中提供用来访问其私有字段的public或protected方法,子类使用这些方法来访问相应的字段。例如:
class A{ //父类A private int value=10; //声明一个私有变量value并赋值为10 public int getvalue() { //声明一个公有成员方法getvalue,返回value return value; }}class B extends A{ //A的子类B}public class myfirst { public static void main(String[] args) { B b=new B(); //创建子类B的一个实例对象 System.out.println("子类通过父类提供的公共接口访问A中的私有字段value:"+b.getvalue()); }}
运行结果为:
子类通过父类提供的公共接口访问A中的私有字段value:10
使用super关键字
使用super调用父类中重写的方法、访问父类中被隐藏的字段子类重写了父类中的某一个方法,隐藏父类中的字段,假如想在子类中访问到父类中被重写的方法和隐藏父类的字段,可以在子类中通过使用关键字super来调用父类中被重写的方法和访问父类中被隐藏的字段。例如:
package first;class A{ public String name="张飞"; //添加成员变量 public void say() { //添加成员方法say System.out.println("我是父类A成员方法say"); }}class B extends A{ public String name="关羽"; //与父类中同名的字段,隐藏父类 public void say(){ //重写方法say super.say(); //使用super关键字调用父类中的方法 System.out.println("我是子类B成员方法say"); System.out.println("父类的name名字:"+super.name); //使用super关键字访问父类中的变量 }}public class myfirst { public static void main(String[] args) { B b=new B(); //创建子类的一个实例对象 b.say(); //调用子类中重写的方法 System.out.println("子类的name名字:"+b.name); //调用子类中的name }}
运行结果为:
我是父类A成员方法say我是子类B成员方法say父类的name名字:张飞子类的name名字:关羽
使用super调用父类的无参数构造方法/有参数构造方法
子类不继承其父类的构造方法。
当使用无参数的super()时,父类的无参数构造方法就会被调用;当使用带有参数的super()方法时,父类的有参数构造方法就会被调用。例如:
class SuperClass { //创建父类SuperClass private int n; //声明一个私有变量n SuperClass(){ //父类无参数构造方法 System.out.println("这是父类SuperClass无参数构造方法"); } SuperClass(int n) { //父类有参数构造方法 System.out.println("这是父类SuperClass有参数构造方法"); this.n = n; } } class SubClass extends SuperClass{ // SubClass类继承SuperClass类 private int n; //声明一个私有变量n SubClass(){ // 自动调用父类的无参数构造器 System.out.println("这是子类无参数构造方法"); } public SubClass(int n){ //子类有参数构造方法 super(300); //调用父类中带有参数的构造器 System.out.println("这是子类有参数构造方法"+n); this.n = n; } }public class myfirst { public static void main(String[] args) { SubClass sc1 = new SubClass(); //创建子类SubClass实例对象,调用其无参数构造方法 SubClass sc2 = new SubClass(100); //创建子类SubClass实例对象,调用其有参数构造方法 }}
运行结果为:
这是父类SuperClass无参数构造方法这是子类无参数构造方法这是父类SuperClass有参数构造方法这是子类有参数构造方法100
注意
如果要初始化父类中的字段,可以在子类的构造方法中通过关键字super调用父类的构造方法;对父类的构造放的调用必须放在子类构造方法的第一行;如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器;如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表;子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。
附:继承的使用和认识
1、继承是怎么实现的?
使用extends 和 implements 关键字
extends 继承的都是对象
implements 继承实现并实现的是接口
2、在继承的场景下,同一样东西,怎么区分是你老爹的还是你自己的?
使用super 与 this 关键字
super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
this关键字:指向自己的引用。
3、父类的某些方法不想被子类继承,怎么处理?
对方法或属性进行 private 关键字或final关键字修饰
private 关键字修饰,子类无法使用和继承
final关键字修饰,无法继承,但是否可以被使用需要看权限属性
总结
到此这篇关于Java继承的文章就介绍到这了,更多相关Java继承介绍内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。