【继承】(超详解)

【继承】(超详解)1 通过派生类对象访问父类与子类同名方法时 如果父类和子类同名方法的参数列表不同 重载 根据调用方法适传递的参数选择合适的方法访问 如果没有则报错 2 成员方法不同名时 在子类方法中或者通过子类对象访问方法时 则优先访问自己的 自己没有时再到父类中找 如果父类中也没有则报错

1.继承

1.1为什么要继承

面向对象思想中提出了继承的概念,专门用来进行共性抽取,实现代码复用。在子类中,访问父类的成员方法和成员变量。

1.2继承概念

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

1.3继承的语法

1.4父类成员访问

1.4.1子类中访问父类的成员变量

在子类方法中 或者 通过子类对象访问成员时:
1.如果访问的成员变量子类中有,优先访问自己的成员变量。
2.如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
3.如果访问的成员变量与父类中成员变量同名,则优先访问自己的。
对于同名的成员变量和不同名的成员变量
成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。

1.4.2子类中访问父类的成员方法

1.5super关键字

【注意事项】
1.只能在非静态方法中使用
2.在子类方法中,访问父类的成员变量和方法。
在这里插入图片描述
用法:

public class Test5{ 
    protected int a=19; } public class Test extends Test5{ 
    public void func(){ 
    System.out.println(super.a); } public static void main(String[] args) { 
    Test test =new Test(); test.func(); } } 

1.6子类构造方法

1.要放在第一行
2.当子类承了父类之后,在构造子类对象的时候,一定要先帮助父类进行构造。调用父类的构造方法。

class Dog extends Animal{ 
    public Dog(String name,int age){ 
    //帮助初始化子类从父类继承下来的成员 super(name,age); } 

1.7super和this

【相同点】

  1. 只能在类的非静态方法中使用,用来访问非静态成员方法和字段(不能在main方法中使用,main方法是静态方法)
  2. 在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在

【不同点】
1.this是当前对象的引用,当前对象即调用实例方法的对象,super相当于是子类对象中从父类继承下来部分成员的引用
2. 在构造方法中:this(…)用于调用本类构造方法,super(…)用于调用父类构造方法,两种调用不能同时在构造方法中出现
4. 构造方法中一定会存在super(…)的调用,用户没有写编译器也会增加,但是this(…)用户不写则没有
在这里插入图片描述

1.8初始化

继承顺序:

package jic; class Person { 
    public String name; public int age; public Person(String name, int age) { 
    this.name = name; this.age = age; System.out.println("Person:构造方法执行"); } { 
    System.out.println("Person:实例代码块执行"); } static { 
    System.out.println("Person:静态代码块执行"); } } class Student extends Person{ 
    public Student(String name,int age) { 
    super(name,age); System.out.println("Student:构造方法执行"); } { 
    System.out.println("Student:实例代码块执行"); } static { 
    System.out.println("Student:静态代码块执行"); } } public class Test { 
    public static void main(String[] args) { 
    Student student1 = new Student("张三",19); System.out.println("==========================="); Student student2 = new Student("ling",20); } public static void main1(String[] args) { 
    Person person1 = new Person("hp![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6f7253af6ece42e7b23b5b1d.png#pic_center) ",10); System.out.println("============================"); Person person2 = new Person("ling",20); } } 

在这里插入图片描述
结论:
1.父类静态代码块优先于子类静态代码块执行,父类实例父类构造,子类实例子类构造。
2.第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行

1.9protected关键字

范围 protected
同一个包中的同一类
同一个包中的不同类
不同包中的子类
不同包中的非字类

1.9继承方式

java是单继承,不支持多继承。一般我们不希望出现超过三层的继承关系.

1.9final关键字

  1. 修饰变量或字段,表示常量(即不能修改,只能初始化一次)
final int a = 10; a = 30; // 编译出错 
  1. 修饰类:表示此类不能被继承
final public class Animal { 
    ... } public class Bird extends Animal { 
    ... } // 编译出错 
  1. 修饰方法:表示该方法不能被重写
今天的文章 【继承】(超详解)分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2025-01-04 17:27
下一篇 2025-01-04 17:21

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/101502.html