ホームページ  >  記事  >  Java  >  Javaの継承とは何ですか? Java で継承を使用するにはどうすればよいですか?

Javaの継承とは何ですか? Java で継承を使用するにはどうすればよいですか?

青灯夜游
青灯夜游転載
2018-10-20 18:01:003900ブラウズ

この記事では、Java 継承とは何かについて説明します。 Java で継承を使用するにはどうすればよいですか? 、初心者に継承の使用方法を教え、継承の概念を理解させます。アクセス修飾子とfinalキーワードの使い方をマスターしましょう。困っている友人は参考にしていただければ幸いです。

継承

継承を使用する理由

まず、これら 2 つのクラスを見てみましょう:

public class Teacher {
    private int teachingAge;
    private String name;
    private int age;
    
    public void teach() {
        
    }
    public void seyHi() {
        System.out.println("我是:"+this.name);
    }
}
public class Student {
    private int studentNo;
    private String name;
    private int age;
    
    public void learn() {
        
    }
    public void seyHi() {
        System.out.println("我是:"+this.name);
    }
}

Student クラスと Teacher クラスには、いくつかの類似点 プロパティとメソッド、これらは重複コードです。プログラム内に多数のクラスがある場合、大量の重複コードが生成されます。これらの繰り返しコードを抽出して他のクラスで使用して、単純化することはできますか?つまり、 を使用して を継承します。

継承の最適化を使用した後:

継承パッケージを作成します

親クラス: (パブリック コード クラス)

package inherit;

public class People {
    private String name;
    private int age;
    
    public void sayHi() {
        System.out.println("我是:"+this.name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    
}

サブクラス: Student.java

package inherit;

public class Student extends People{
    private int studentNo;
    public void learn() {
        System.out.println("学习课程");
    }
    public int getStudentNo() {
        return studentNo;
    }
    public void setStudentNo(int studentNo) {
        this.studentNo = studentNo;
    }
}

サブクラス: Teacher.java

package inherit;

public class Teacher extends People{
    private int teachingAge;
    
    public void teach() {
        System.out.println("教授课程");
    }
    
    public int getTeachingAge() {
        return teachingAge;
    }

    public void setTeachingAge(int teachingAge) {
        this.teachingAge = teachingAge;
    }
    
}

テスト クラス:

package inherit;

public class TestInherit {
    public static void main(String[] args) {
        //创建Student对象
        Student stu=new Student();
        stu.setName("张三");//父类中继承过来的方法
        stu.learn();//子类中特有的方法
        stu.sayHi();
        //创建Teacher对象
        Teacher teacher=new Teacher();
        teacher.setName("汤尼");
        teacher.setTeachingAge(2);//子类中特有的方法
        teacher.sayHi();
    }
}

上記のコード例を観察すると、次のことがわかります。

1. サブクラスのすべてのパブリック コードは次のとおりです。親クラス

#2に配置されます。サブクラスは独自のメソッドと属性を持つことができます

#3。サブクラスが親クラスを継承すると、親クラスの属性とメソッドを持つようになります。

4. コードを均一に変更しやすくするために、パブリック コードを親クラスに配置します。

#継承された構文

##キーワード:

extends

1. 親クラスを作成します<pre class="java">public class 父类{ //公共的属性和方法 }</pre>2. サブクラスを作成し、親クラスを継承します

#
public class 子类 extends 父类{
    //子类特有的属性和方法
}

#サブクラスは 1 つの親クラスのみを継承します

サブクラスは親クラスのメンバーにアクセスできます

サブクラスが親クラスのメンバーにアクセスしたい場合は、

super
キーワードを使用する必要があります。親クラス構造にアクセスするための親クラス オブジェクトを表します。メソッド:

super();//访问无参构造
super(参数);//访问有参构造

親クラス属性にアクセス:

super.name;
親クラス メソッドにアクセス:
super.print();
親クラスのコンストラクターにアクセスします。子クラスのコンストラクター メソッドで呼び出す必要があります。最初の文である必要があります。

super はサブクラスのメソッドとコンストラクターにのみ使用できます

super は親クラスのプライベート メンバーにアクセスできません

ノックノック: 親クラスのメンバーにアクセスします

パッケージ visitparent を作成し、レポートの下に次のクラスを作成します

親クラス
package visitparent;

public class Animal {
    private String name;
    private int legs;
    
    public Animal() {
        this.name="无名";
        this.legs=4;
    }
    public Animal(String name,int legs) {
        this.name=name;
        this.legs=legs;
    }
    
    public void eat(String food) {
        System.out.println(name+" 吃食物:"+food);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getLegs() {
        return legs;
    }

    public void setLegs(int legs) {
        this.legs = legs;
    }
    
}
サブクラス

package visitparent;

public class Cat extends Animal{
    private String hairColor;//毛发颜色
    private int age;
    
    public Cat () {
        super();//调用父类无参
    }
    public Cat(String name,int legs,String hairColor,int age) {
        super(name, legs);//这里调用相当于重用父类构造方法了
        this.hairColor=hairColor;
        this.age=age;
        //super(name, legs);//去掉注释试试
        //this.name="无名";//去掉注释试试
    }
    public void catchMouse() {
        System.out.println(super.getName()+":抓老鼠");
    }
    
    public void paly() {
        System.out.println(super.getName()+" 玩累了。");
        super.eat("小鱼干");
    }

    public String getHairColor() {
        return hairColor;
    }

    public void setHairColor(String hairColor) {
        this.hairColor = hairColor;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    
}

サブクラスは親クラスのプライベート メンバーを継承できません


サブクラスは、親クラスのプライベート メンバーを継承できません。デフォルトのアクセス権限を使用します (デフォルトのアクセス権限ではアクセス修飾子は書き込まれません)

サブクラスは親クラスのコンストラクタを継承できません

多重継承の実行プロセス

サブクラスを作成するとき、親クラスは何をしますか?

以下の 3 つのクラスを作成して、クラス C がクラス B を継承し、クラス B がクラス A を継承します。

A.java

public class A {
    public A() {
        System.out.println("A类的无参构造函数执行");
    }
}
B.java

public class B extends A{
    public B() {
        System.out.println("B类的无参构造函数执行");
    }
}

C.java

public class C extends B{
    public C() {
        System.out.println("C类的无参构造函数执行");
    }
}

TestRunFlow.java テスト クラス、実行結果の表示

public class TestRunFlow {
    public static void main(String[] args) {
        C c=new C();
    }
}

実行結果は次のとおりです。

クラス A のパラメータなしコンストラクタが実行されます。

クラス B のパラメータなしコンストラクタが実行されます。

クラス C のパラメータなしコンストラクタが実行されます。

サブクラス コンストラクターがスーパーを通じて親クラスの対応するコンストラクターを明示的に呼び出す場合、親クラスのパラメーターなしのコンストラクターは実行されません。メソッド

最上位の親クラスのパラメータなしのコンストラクタが実行されるまで、親クラスのパラメータなしのコンストラクタを呼び出します

上記のルールに従って、次のコードをコンパイルして渡すことができるかどうかを判断してください。
#親クラス

public class Pet {
    private String name;
    public Pet(String name) {
        this.name=name;
    }
}

サブクラス
public class Dog extends Pet{
}
答えは「ノー」です。親クラスにはパラメータ化されたコンストラクタのみがあり、パラメータなしのコンストラクタはありません。デフォルトでは、クラス内のコードには暗黙的なパラメータなしのコンストラクタがあり、サブクラスのパラメータなしのコンストラクタは、デフォルトで親クラスのパラメータなしのコンストラクタを呼び出しません。親クラスであるため、子クラスでエラーが報告されます。

解決策: 1. 親クラスにパラメーターなしのコンストラクターを明示的に追加します。 2. サブクラスのコンストラクターで親クラスのパラメーター化されたコンストラクターを明示的に呼び出します。
java のアクセス修飾子

protected アクセス修飾子は、変更後に、このクラス、サブクラス、および同じパッケージからプロパティとメソッドにアクセスできます。

#アクセス修飾子

このクラス

同じパッケージ

サブクラス

その他

#プライベート##デフォルト (フレンドリー)√√√√√

方法重写

在"继承优化后"的代码中,Teacher 继承了 People 类,(忘记代码可以翻回去再看一遍) People 类中有个一个打招呼的方法 sayHi() 用于输出人的名字,但是 Teacher 调用这个方法并不能打印出 Teacher 的属性 teachingAge 的值,但是我们还想用这个方法实现这个功能,应该怎么办呢?

我们可以使用 方法重写 解决这个问题,修改子类 Teacher 中的代码,下面看一下使用方法重写后的效果。

Teacher.java

package inherit;

public class Teacher extends People{
    //省略其他属性
    
    @Override
    public void sayHi() {
        System.out.println("我是:"+super.getName()+" ,从事教育行业 "+this.teachingAge+" 年了。");
    }

    //省略其他方法、getter、setter
}

在 Eclipse 中重写某方法的快捷键是 Alt+Shift+S+V ,按完后选择要重写的方法

在 Idea 中重写某方法的快捷键是 Ctrl+O ,按完后选择要重写的方法

@Override 注解的作用, 用来检测是否符合重写规则,不符合重写规则将报错,这个注解可以不写

构造方法不能重写,因为构造方法不能被继承

方法重写的规则:

1.方法名相同

2.参数列表相同

3.返回值类型相同或者是其子类

4.访问权限不能严于父类

final 关键字的使用

1.final 修饰变量后变为常量

private static final long serialVersionUID = -6849794470754667710L;

2.final 修饰类后,该类不能被继承

package java.lang;
public final class Math {
    //省略属性和方法……
}

3.final 修饰方法后,该方法不能被重写

public final void teach() {
        System.out.println("教授课程");
    }

4.final 修饰创建的对象后,该对像不能再次实例化(可以修改属性)

final Teacher teacher=new Teacher();
teacher.setName("汤尼");
//teacher=new Teacher();//去掉注释试试

String 类就是一个典型的被 final 修饰的类




#保護済み

public

以上がJavaの継承とは何ですか? Java で継承を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。