首页IT科技java继承([JAVA]继承)

java继承([JAVA]继承)

时间2025-08-03 01:04:37分类IT科技浏览4371
导读:目录...

目录

1.继承的概念

2.继承的语法

3.父类成员访问 

3.1子类中访问父类成员变量

3.2子类中访问父类成员方法

4.super关键字 

5.子类构造方法

6.继承方式

7.final关键字和类的关系

面向对象思想中提出了继承的概念               ,专门用来进行共性抽取                      ,实现代码复用              。就像是数学中       ,提取每一个数的公因数一般       ,把相同的代码提取出来                      ,单独的成为一个类              ,但同时又可以被别的类使用其中的属性或方法                      。

1.继承的概念

继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段       ,它允许程序员在保持原有类特性的基础上进行扩展                      ,增加新功能              ,这样产生新的类,称派生类

       。继承呈现了面向对象程序设计的层次结构                      , 体现了由简单到复杂的认知过程              。继承主要解决的问题是:共性的抽取                     ,实现代码复用

 Cat和Dog类,既有从父类Animal继承的语句               ,也含有本身的语句                     。

class Animal{//父类 String name; int age; public void eat(){ System.out.println(this.name + " is eating."); } } class Cat extends Animal{ //Animal的子类 public void miaow(){ System.out.println("miaomiaomiao~"); } } class Dog extends Animal{ //Animal的子类 public void bark(){ System.out.println("wangwangwang~"); } }

2.继承的语法

修饰符 class 子类 extends 父类{……}

class Animal{//父类 String name; int age; public void eat(){ System.out.println(this.name + " is eating."); } } class Cat extends Animal{//子类 public void miaow(){ System.out.println("miaomiaomiao~"); } } public class Test { public static void main(String[] args) { Cat cat = new Cat(); System.out.println(cat.age); System.out.println(cat.name); } }

我们可以看到                     ,我们在main方法中       ,只实例化了cat对象               ,但是cat本身并没有定义任何成员变量                      ,却发现可以调用成员变量age和name        。而我们又使用了继承       ,由此可知对象cat当中的成员变量肯定来自于其父类Animal       ,同样的我们也可以同样的访问父类的方法       。

通过上面的举例                      ,我们值得注意的是:

子类本身要有属于自身的语句              ,如果和父类相同则没必要创建一个新的类                     。 子类会将父类的成员变量和方法继承到子类当中

3.父类成员访问 

3.1子类中访问父类成员变量

我们可以在子类中使用方法来访问父类的成员       ,使用this会先在子类中寻找成员                      ,如果找不到则会进入父类寻找              ,所以在子类中this也可以访问父类成员

class Animal{//父类 String name; int age; public void eat(){ System.out.println(this.name + " is eating."); } } class Cat extends Animal{ //Animal子类 public void setName(String name){ this.name = name; } public void miaow(){ System.out.println("miaomiaomiao~"); } }

还有另一种情况,就是子类中成员名和父类的相同               。

class Animal{//父类 String name; //注意1 int age; public void eat(){ System.out.println(this.name + " is eating."); } } class Cat extends Animal{ //Animal子类 String name; //注意2 public void setName(String name){ this.name = name; } public void miaow(){ System.out.println("miaomiaomiao~"); } }

此处                      ,子类和父类的成员名都相同                     ,那下面的setName方法中访问的是子类的成员还是父类的成员呢??

答案是:子类的       。就像是C语言中局部变量和全局变量一样,如果变量名相同               ,给其赋值局部变量会优先与全局变量(类似就近原则?)在这里也是同样的道理

“成员名相同                     ,访问父类成员变量的方法我们下面会有所提及               ”

于是       ,我们总结以下几点:

如果访问的成员变量子类中有               ,优先访问自己的成员变量                     。 如果访问的成员变量子类中无                      ,则访问父类继承下来的       ,如果父类也没有定义       ,则编译报错               。 如果访问的成员变量与父类中成员变量同名                      ,则优先访问自己的。 

3.2子类中访问父类成员方法

如果成员方法名不相同的情况:

和访问父类成员变量类似的              ,先在子类中寻找要访问的成员方法       ,如果有即可以访问                     。如果子类没有                      ,下一步是进入到父类寻找要访问的成员方法                      。父类中访问不到相应的成员方法              ,则编译器会报错。子类的优先级是大于父类的

 成员方法名相同的情况:

class Base{ public void methodA(){ System.out.println("Base中的方法"); } public void methodB(){ System.out.println("Base中的方法"); } } class A extends Base{ public void methodA(int a){ System.out.println("A中的参数为int的methodA方法"); } public void methodB(){ System.out.println("A中的methodB方法"); } } public class Test { public static void main(String[] args) { A a = new A(); a.methodA();//没有参数,访问的是父类中的methodA方法 a.methodA(5);//有参数                      ,访问的是子类中的methodA方法 a.methodB();//访问的是子类的方法                     ,不可能访问到父类的方法 //因为先在子类中访问再到父类 } }

 总结:

通过子类对象访问父类与子类中不同名方法时,优先在子类中找               ,找到则访问                     ,否则在父类中找       ,找到则访问               ,否则编译报错              。 通过派生类对象访问父类与子类同名方法时                      ,如果父类和子类同名方法的参数列表不同(重载)       ,根据调用方法适传递的参数选择合适的方法访问       ,如果没有则报错;

4.super关键字 

Java提供了super关键字                      ,该关键字主要作用:在子类方法中访问父类的成员                      。

class Base{ public void methodA(){ System.out.println("Base中的方法"); } public void methodB(){ System.out.println("Base中的方法"); } } class A extends Base{ public void methodA(int a){ System.out.println("A中的参数为int的methodA方法"); } public void methodB(){ System.out.println("A中的methodB方法"); super.methodB();//注意此处:用super关键字访问到了父类的成员方法 } } public class Test { public static void main(String[] args) { A a = new A(); a.methodA();//没有参数              ,访问的是父类中的methodA方法 a.methodA(5);//有参数       ,访问的是子类中的methodA方法 a.methodB();//访问的是子类的方法                      ,不可能访问到父类的方法 //因为先在子类中访问再到父类 } }

 注意事项:

只能在非静态方法中使用 在子类方法中              ,访问父类的成员变量和方法

5.子类构造方法

 因为父类和子类是继承关系,即子类会继承父类的成员变量除此还有自身额外的成员变量                      ,在构建子类的构造方法的时候要先调用父类的构造方法        。

class Base{ public Base(){ System.out.println("调用了父类的构造方法"); } } class A extends Base{ public A(){ super();//调用父类的构造方法 用户没有写的时候会默认自动添加 System.out.println("调用了子类的构造方法"); } } public class Test { public static void main(String[] args) { A a = new A(); } }

 注意:

若父类显式定义无参或者默认的构造方法                     ,在子类构造方法第一行默认有隐含的super()调用,即调用基类构造方法 如果父类构造方法是带有参数的               ,此时需要用户为子类显式定义构造方法                     ,并在子类构造方法中选择合适的父类构造方法调用       ,否则编译失败              。 在子类构造方法中               ,super(...)调用父类构造时                      ,必须是子类构造函数中第一条语句                     。 super(...)只能在子类构造方法中出现一次       ,并且不能和this同时出现

6.继承方式

 java中的继承方式分为3种:

第一种:单继承

即一个类被另一个类继承

class A{ …… } class B extends A{ …… }

第二种:多层继承

即有一个类A       ,类B继承了A                      ,类C继承了B

class A{ …… } class B extends A{ …… } class C extends B{ …… }

第三种:不同类继承同一个类

即有一个类A              ,类B继承A       ,类C继承A

class A{ …… } class B extends A{ …… } class C extends A{ …… }

7.final关键字和类的关系

当final修饰一个类的时候                      ,这个被修饰的类不能被继承

 编译器会报错

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
uniapp获取微信号(【uni-app】小程序实现微信授权登陆(附流程图)) parsing info not available(Parsing error: No Babel config file detected for xxx Either disable config file checking…报错解决方法)