Javaの基本|継承

継承キーワード:extendsとsuper

拡張します

class Parent
{
    
    
	...
}

子类
class child extends Parent
{
    
    
	...
}

super
親クラスのパブリックプロパティまたはメソッドがサブクラスで呼び出される場合、キーワードsuperを使用する必要があります

super(name,age);

super.方法();

1.サブクラスが親クラスのプロパティを呼び出すと、superが使用されていない場合、次のエラーが表示され
ここに画像の説明を挿入
ます。2。サブクラスが親クラスのメソッドを呼び出すと、** superを使用せずに次のエラーが表示されます。 **
ここに画像の説明を挿入
サブクラスメソッドは親クラスメソッドを呼び出しますスーパーメソッド()が必要な場合スーパーメソッド()
はサブクラスのメソッドの外部では使用できません

main関数では、サブクラスオブジェクトはスーパークラスメソッドを直接呼び出すことができます。

class parent
{
    
    
	String name;
	int age;
	parent(String name,int age)
	{
    
    
		this.name=name;
		this.age=age;
	}
	public void speak()
	{
    
    
		System.out.println("我的名字"+name+",今年我"+age+"大了");
	}
	public void out()
	{
    
    
		System.out.println("调用父类方法");
	}
	/*private void speak_pri()
	{
		System.out.println("私有化输出:"+"我的名字"+name+",今年我"+age+"大了");
	}*/

	protected void speak_pro()
	{
    
    
		System.out.println("保护输出:"+"我的名字"+name+",今年我"+age+"大了");
	}
}
class Child extends parent
{
    
    
	String school;
	Child(String name,int age,String school)
	{
    
    
		super(name,age);
		this.name=name;
		this.age=age;
		this.school=school;
	}
	public void study()
	{
    
    
		System.out.println("我在"+school+"读书");
		super.speak();
		super.out();
		super.speak_pro();
	}
}
public class Inherit
{
    
    
	public static void main(String[] args)
	{
    
    
		Child c=new Child("张三",18,"电子大学");
		c.study();
		/*c.speak();
		c.out();*/
		parent p=new parent("李四",22);
		p.speak();
		p.speak_pro();
	}
}

継承の制限

制限1:多重継承はなく、多重継承のみです。
クラスCがクラスAとクラスBの機能を同時に継承したい場合

class A
{
    
    }
class B
{
    
    }
class C extends A B//这样是不行的
{
    
    }

上記は間違っています、多重継承は達成できません

AからBまでしか継承できず、CはB
を継承できます。つまり、クラスは一度に1回しか継承できません。複数のクラスの継承は多重継承によって完了できます
。通常の状況では、それ以上を継承することはお勧めしません。最大3レベル。


制約事項2:親クラスのプライベートメンバーは、サブクラスから直接継承することはできず、間接的にのみ呼び出すことができます。
サブクラスは親クラスに属しておらず、新しいクラスであるため、上記のテストはできません


制限3:サブ​​クラスがオブジェクトをインスタンス化する場合、親クラスから継承されたデータメンバーは、最初に親クラスのコンストラクターを呼び出すことによって初期化する必要があります。
制限3はどういう意味ですか?メソッドを構築するときは覚えておいてください

你调用父类的数据,其数据具体值必须在父类中的构造函数生成,也就是子类构造方法调用父类数据,此数据在父类中要先诞生

コードを見て、
親クラスの構築メソッドを理解します

class parent
{
    
    
	String name;
	int age;
	parent(String name,int age)
	{
    
    
		this.name=name;
		this.age=age;
	}
}

サブクラス工法

class Child extends parent
{
    
    
	String school;
	Child(String name,int age,String school)
	{
    
    
		super(name,age);
		this.name=name;
		this.age=age;
		this.school=school;
	}
}

上記の2つの段落をこのように書くのは問題ありませんが!親クラスの名前と年齢を初期化するためのコードを削除すると、エラーが発生します

class parent
{
    
    
	String name;
	int age;
}

サブクラス

class Child extends parent
{
    
    
	String school;
	Child(String name,int age,String school)
	{
    
    
		super(name,age);
		this.name=name;
		this.age=age;
		this.school=school;
	}
}

ここに画像の説明を挿入
したがって、サブクラスのコンストラクターによって呼び出される親クラスのデータメンバーは、親クラスのコンストラクターで初期化する必要があります。

**焦点を当ててください!**親クラスのデータメンバーを毎回呼び出すと、関連する構築メソッドを毎回書くのは面倒ですか?他の形式はありますか?
いくつか

class Person
{
    
    
	String name;
	int age;
}

class Student extends Person
{
    
    
	String School;
	Student(String name,int age,String School)
	{
    
    
		super.name=name;
		super.age=age;
		this.School=School;
	}

	public String talk()
	{
    
    
		//return super.talk()+"I am from:"+this.School;
		return "I am from:"+this.School;
	}

}
public class InheritFFF
{
    
    
	public static void main(String[] args)
	{
    
    
		Student S=new Student("jack",24,"zhongg");
		System.out.println(S.talk());
	}
}

表示:
直接スーパーデータメンバー、親クラスのコンストラクターを初期化する必要はありません

		super.name=name;
		super.age=age;

そしてサブクラスでは:

		super(name,age);
		this.name=name;
		this.age=age;

親クラスに存在する必要があります:コンストラクターのデータメンバーを初期化します

Person(String name,int age)
	{
    
    
		this.name=name;
		this.age=age;
	}

最初は、メソッドの外では、通常の関数のようだと思っていましたが、実際はそうではありません。上記の特性は、サブクラスの構築メソッド
範囲に沿っているだけです。構築方法ではないので、なんと言ってもいいですよ!

class A
{
    
    
	String name="张三";
	int age=11;
	int BBB=222;
	int CCC;
	
}
class B extends A
{
    
    
	String name="李四";
	int age=12;
	public B()
	{
    
    
		
		System.out.println(super.BBB);
	}
	public void print()
	{
    
    
		System.out.println(name);
		System.out.println(age);
		System.out.println(super.name);
		System.out.println(super.age);
	}
	public void test(int c)
	{
    
    
		CCC=c;
		System.out.println(CCC);
	}
}

public class InheritTTT
{
    
    
	public static void main(String[] args)
	{
    
    
		B b=new B();
		b.print();
		b.test(33);
	}
}

制限4:finalによって変更されたメソッドはサブクラスによって上書きできず、finalによって変更されたクラスは継承できません。

最終的な
finaは、Javaでは「ターミネーター」と呼ばれます。最終的にクラスのメソッドを変更する場合、2次的な変更は許可されません。クラスをファイナライズするときは、このクラスを継承できないことを示します。

クラスオーバーライド

サブクラスと親データメンバーの名前が同じ場合

class A
{
    
    
	String name="张三";
	int age=11;
}
class B extends A
{
    
    
	String name="李四";
	int age=12;
	public void print()
	{
    
    
		System.out.println(name);
		System.out.println(age);
		System.out.println(super.name);
		System.out.println(super.age);
	}
}
public class InheritTTT
{
    
    
	public static void main(String[] args)
	{
    
    
		B b=new B();
		b.print();
	}
}

ここに画像の説明を挿入
superが追加されていない場合、親データメンバーは上書きされます。
親クラスのデータメンバーを呼び出すサブクラスの構築メソッドでは、最初に親クラスのデータメンバーを初期化する必要が
あり、サブクラスはこの操作なしで親クラスのデータメンバーを呼び出す必要があります


親クラスのメソッドがサブクラスによってオーバーライドされる場合、親クラスのメソッドを呼び出す方法は?
例えば:

class Person
{
    
    
	String name;
	int age;
	public String talk()
	{
    
    
		return "I am: "+this.name+"I am"+this.age+"years age";
	}
}

class Student extends Person
{
    
    
	String School;
	public Student(String name,int age,String School)//这个不是需要父类初始化吗?
	{
    
    
		super.name=name;
		super.age=age;
		this.School=School;
	}

	public String talk()
	{
    
    
		return "I am from:"+this.School;
	}

}

public class InheritFFF
{
    
    
	public static void main(String[] args)
	{
    
    
		Student S=new Student("jack",24,"zhongg");
		System.out.println(S.talk());
	}
}

結果:
ここに画像の説明を挿入
ただし、戻り値にsuper.talk()
追加します。
ここに画像の説明を挿入
ここに画像の説明を挿入
これは通常のメソッドであるため、スーパーはありません。

おすすめ

転載: blog.csdn.net/weixin_46096297/article/details/114644818