Object-Oriented Programming (Advanced) 5: Keyword: super

Table of contents

5.1 Understanding of super

Use super in a Java class to call the specified operation in the parent class:

Notice:

5.2 Super usage scenarios

5.2.1 Call the overridden method of the parent class in the subclass

Example:

Summarize:

There are no super. and this. in front of the method.

The method is preceded by this.

The method is preceded by super.

5.2.2 Call the member variable with the same name in the parent class in the subclass

Example:

Summary: different starting points (proximity principle)

Variables are not preceded by super. and this.

Variables are preceded by this.

Variables preceded by super.

Special Note: Subclass declarations and member variables with the same name as the parent class should be avoided

5.2.3 Calling the parent class constructor in the subclass constructor

Scenario example 1:

Scenario example 2:

Scenario example 3:

Scenario example 4:

Scenario example 5:

Scenario example 6:

Scenario example 7:

Scenario example 8:

5.3 Summary: this and super

1. The meaning of this and super

this: the current object

super: Refers to the members declared by the parent class

2. The usage format of this and super

this

super

5.4 Exercises

**Exercise 1:**

**Exercise 2:**

Additional questions:

Exercise 3:


5.1 Understanding of super

Use super in a Java class to call the specified operation in the parent class:

  • super can be used to access properties defined in the parent class
  • super can be used to call member methods defined in the parent class
  • super can be used to call the constructor of the parent class in the constructor of the subclass

Notice:

  • Especially when there are members with the same name in the child parent class, you can use super to indicate that the member in the parent class is called
  • Super's traceability is not limited to the immediate parent class
  • The usage of super and this is similar, this represents the reference of the object of this class, and super represents the identity of the memory space of the parent class

5.2 Super usage scenarios

5.2.1 Call the overridden method of the parent class in the subclass

  • If the subclass does not override the method of the parent class, as long as the permission modifier allows, the method of the parent class can be directly called in the subclass;
  • If the subclass overrides the method of the parent class, it needs to be passed in the subclass to super.call the overridden method of the parent class, otherwise the method rewritten by the subclass is called by default

Example:

<span style="color:#303030"><span style="background-color:#ffffff"><span style="background-color:#282c34"><span style="color:#abb2bf"><code class="language-java"><span style="color:#c678dd">package</span> com<span style="color:#abb2bf">.</span>atguigu<span style="color:#abb2bf">.</span>inherited<span style="color:#abb2bf">.</span>method<span style="color:#abb2bf">;</span>

<span style="color:#c678dd">public</span> <span style="color:#c678dd">class</span> <span style="color:#d19a66">Phone</span> <span style="color:#abb2bf">{</span>
    <span style="color:#c678dd">public</span> <span style="color:#c678dd">void</span> <span style="color:#61afef">sendMessage</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
        <span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"发短信"</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
    <span style="color:#abb2bf">}</span>
    <span style="color:#c678dd">public</span> <span style="color:#c678dd">void</span> <span style="color:#61afef">call</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
        <span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"打电话"</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
    <span style="color:#abb2bf">}</span>
    <span style="color:#c678dd">public</span> <span style="color:#c678dd">void</span> <span style="color:#61afef">showNum</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
        <span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"来电显示号码"</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
    <span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>

<span style="color:#5c6370"><em>//smartphone:智能手机</em></span>
<span style="color:#c678dd">public</span> <span style="color:#c678dd">class</span> <span style="color:#d19a66">SmartPhone</span> <span style="color:#c678dd">extends</span> <span style="color:#d19a66">Phone</span><span style="color:#abb2bf">{</span>
    <span style="color:#5c6370"><em>//重写父类的来电显示功能的方法</em></span>
    <span style="color:#c678dd">public</span> <span style="color:#c678dd">void</span> <span style="color:#61afef">showNum</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
        <span style="color:#5c6370"><em>//来电显示姓名和图片功能</em></span>
        <span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"显示来电姓名"</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
        <span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"显示头像"</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>

        <span style="color:#5c6370"><em>//保留父类来电显示号码的功能</em></span>
        <span style="color:#c678dd">super</span><span style="color:#abb2bf">.</span><span style="color:#61afef">showNum</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span><span style="color:#5c6370"><em>//此处必须加super.,否则就是无限递归,那么就会栈内存溢出</em></span>
    <span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
</code></span></span></span></span>

Summarize:

  • There are no super. and this. in front of the method.

    • First find the matching method from the subclass, if not, then find it from the direct parent class, if not, continue to trace back
  • The method is preceded by this.

    • First find the matching method from the subclass, if not, then find it from the direct parent class, if not, continue to trace back
  • The method is preceded by super.

    • Find it from the direct parent class of the current subclass, if not, continue to trace back

5.2.2 Call the member variable with the same name in the parent class in the subclass

  • If the instance variable has the same name as the local variable, you can add this. in front of the instance variable to distinguish it
  • If the instance variable of the subclass and the instance variable of the parent class have the same name, and the instance variable of the parent class is still visible in the subclass, in order to access the instance variable declared by the parent class in the subclass, you need to add super. before the instance variable of the parent class, otherwise The default access is the instance variable declared by the subclass itself
  • If the instance variables of the parent and child classes do not have the same name, as long as the permission modifier allows, the instance variables declared in the parent class can be directly accessed in the subclass, and can also be accessed by using this.instance or super.instance variable

Example:

<span style="color:#303030"><span style="background-color:#ffffff"><span style="background-color:#282c34"><span style="color:#abb2bf"><code class="language-java"><span style="color:#c678dd">class</span> <span style="color:#d19a66">Father</span><span style="color:#abb2bf">{</span>
	<span style="color:#c678dd">int</span> a <span style="color:#61afef">=</span> <span style="color:#d19a66">10</span><span style="color:#abb2bf">;</span>
	<span style="color:#c678dd">int</span> b <span style="color:#61afef">=</span> <span style="color:#d19a66">11</span><span style="color:#abb2bf">;</span>
<span style="color:#abb2bf">}</span>
<span style="color:#c678dd">class</span> <span style="color:#d19a66">Son</span> <span style="color:#c678dd">extends</span> <span style="color:#d19a66">Father</span><span style="color:#abb2bf">{</span>
	<span style="color:#c678dd">int</span> a <span style="color:#61afef">=</span> <span style="color:#d19a66">20</span><span style="color:#abb2bf">;</span>
    
    <span style="color:#c678dd">public</span> <span style="color:#c678dd">void</span> <span style="color:#61afef">test</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
		<span style="color:#5c6370"><em>//子类与父类的属性同名,子类对象中就有两个a</em></span>
		<span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"子类的a:"</span> <span style="color:#61afef">+</span> a<span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span><span style="color:#5c6370"><em>//20  先找局部变量找,没有再从本类成员变量找</em></span>
        <span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"子类的a:"</span> <span style="color:#61afef">+</span> <span style="color:#c678dd">this</span><span style="color:#abb2bf">.</span>a<span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span><span style="color:#5c6370"><em>//20   先从本类成员变量找</em></span>
        <span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"父类的a:"</span> <span style="color:#61afef">+</span> <span style="color:#c678dd">super</span><span style="color:#abb2bf">.</span>a<span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span><span style="color:#5c6370"><em>//10    直接从父类成员变量找</em></span>
		
		<span style="color:#5c6370"><em>//子类与父类的属性不同名,是同一个b</em></span>
		<span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"b = "</span> <span style="color:#61afef">+</span> b<span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span><span style="color:#5c6370"><em>//11  先找局部变量找,没有再从本类成员变量找,没有再从父类找</em></span>
		<span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"b = "</span> <span style="color:#61afef">+</span> <span style="color:#c678dd">this</span><span style="color:#abb2bf">.</span>b<span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span><span style="color:#5c6370"><em>//11   先从本类成员变量找,没有再从父类找</em></span>
		<span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"b = "</span> <span style="color:#61afef">+</span> <span style="color:#c678dd">super</span><span style="color:#abb2bf">.</span>b<span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span><span style="color:#5c6370"><em>//11  直接从父类局部变量找</em></span>
	<span style="color:#abb2bf">}</span>
	
	<span style="color:#c678dd">public</span> <span style="color:#c678dd">void</span> <span style="color:#61afef">method</span><span style="color:#abb2bf">(</span><span style="color:#c678dd">int</span> a<span style="color:#abb2bf">,</span> <span style="color:#c678dd">int</span> b<span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
		<span style="color:#5c6370"><em>//子类与父类的属性同名,子类对象中就有两个成员变量a,此时方法中还有一个局部变量a		</em></span>
		<span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"局部变量的a:"</span> <span style="color:#61afef">+</span> a<span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span><span style="color:#5c6370"><em>//30  先找局部变量</em></span>
        <span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"子类的a:"</span> <span style="color:#61afef">+</span> <span style="color:#c678dd">this</span><span style="color:#abb2bf">.</span>a<span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span><span style="color:#5c6370"><em>//20  先从本类成员变量找</em></span>
        <span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"父类的a:"</span> <span style="color:#61afef">+</span> <span style="color:#c678dd">super</span><span style="color:#abb2bf">.</span>a<span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span><span style="color:#5c6370"><em>//10  直接从父类成员变量找</em></span>

        <span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"b = "</span> <span style="color:#61afef">+</span> b<span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span><span style="color:#5c6370"><em>//13  先找局部变量</em></span>
		<span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"b = "</span> <span style="color:#61afef">+</span> <span style="color:#c678dd">this</span><span style="color:#abb2bf">.</span>b<span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span><span style="color:#5c6370"><em>//11  先从本类成员变量找</em></span>
		<span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"b = "</span> <span style="color:#61afef">+</span> <span style="color:#c678dd">super</span><span style="color:#abb2bf">.</span>b<span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span><span style="color:#5c6370"><em>//11  直接从父类局部变量找</em></span>
    <span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
<span style="color:#c678dd">class</span> <span style="color:#d19a66">Test</span><span style="color:#abb2bf">{</span>
    <span style="color:#c678dd">public</span> <span style="color:#c678dd">static</span> <span style="color:#c678dd">void</span> <span style="color:#61afef">main</span><span style="color:#abb2bf">(</span><span style="color:#d19a66">String</span><span style="color:#abb2bf">[</span><span style="color:#abb2bf">]</span> args<span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
        <span style="color:#d19a66">Son</span> son <span style="color:#61afef">=</span> <span style="color:#c678dd">new</span> <span style="color:#d19a66">Son</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
		son<span style="color:#abb2bf">.</span><span style="color:#61afef">test</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
		son<span style="color:#abb2bf">.</span><span style="color:#61afef">method</span><span style="color:#abb2bf">(</span><span style="color:#d19a66">30</span><span style="color:#abb2bf">,</span><span style="color:#d19a66">13</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>  
    <span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
</code></span></span></span></span>

Summary: different starting points (proximity principle)

  • Variables are not preceded by super. and this.

    • If a variable is used in a constructor, code block, or method, first check whether it is declared by the current block 局部变量,
    • If it is not a local variable, start with the currently executing code本类去找成员变量
    • If it is not found in the class currently executing the code, it will look up 父类声明的成员变量(permission modifiers allow access in subclasses)
  • Variables are preceded by this.

    • When looking for a member variable through this, first find the member variable from the class of the currently executing code
    • If it is not found in the class currently executing the code, it will look up == member variables declared by the parent class (== permission modifiers allow access in subclasses)
  • Variables preceded by super.

    • Find member variables through super, and directly find member variables from the direct parent class of the currently executing code (permission modifiers allow access in subclasses)
    • If there is no direct parent class, go to the parent class of the parent class to find it (permission modifiers allow access in subclasses)

Special Note: Subclass declarations and member variables with the same name as the parent class should be avoided

It is clearly stated in Ali's development specifications and other documents:

5.2.3 Calling the parent class constructor in the subclass constructor

① When a subclass inherits the parent class, it does not inherit the constructor of the parent class. The constructor specified by the parent class can only be called through the "super (parameter list)" method.

② Provisions: "super (formal parameter list)" must be declared at the first line of the constructor.

③ As we said before, you can use "this (parameter list)" in the first line of the constructor to call the overloaded constructor in this class. Combined with ②, the conclusion: in the first line of the
constructor, "this (parameter list)" List)" and "super(parameter list)" can only be chosen one or the other.

④ If neither "this (parameter list)" nor "super (parameter list)" is explicitly called in the first line of the subclass constructor, the subclass constructor will call "super()" by
default , which calls the constructor with empty parameters in the parent class.

⑤ From ③ and ④, it is concluded that in any constructor of the subclass, either the overloaded constructor in this class will be called, or the constructor of the parent class will be called.
It can only be one of these two situations.

⑥ Obtained from ⑤: There are n constructors declared in a class, and at most n-1 constructors use "this (parameter list)", then the remaining one must use "super (parameter list)" .

Common mistakes in development:

If the constructor of the subclass does not explicitly call the constructor of the parent class or this class, and there is no constructor with empty parameters in the parent class, then 编译出错.

Scenario example 1:

<span style="color:#303030"><span style="background-color:#ffffff"><span style="background-color:#282c34"><span style="color:#abb2bf"><code class="language-java"><span style="color:#c678dd">class</span> <span style="color:#d19a66">A</span><span style="color:#abb2bf">{</span>

<span style="color:#abb2bf">}</span>
<span style="color:#c678dd">class</span> <span style="color:#d19a66">B</span> <span style="color:#c678dd">extends</span> <span style="color:#d19a66">A</span><span style="color:#abb2bf">{</span>

<span style="color:#abb2bf">}</span>

<span style="color:#c678dd">class</span> <span style="color:#d19a66">Test</span><span style="color:#abb2bf">{</span>
    <span style="color:#c678dd">public</span> <span style="color:#c678dd">static</span> <span style="color:#c678dd">void</span> <span style="color:#61afef">main</span><span style="color:#abb2bf">(</span><span style="color:#d19a66">String</span><span style="color:#abb2bf">[</span><span style="color:#abb2bf">]</span> args<span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
        <span style="color:#d19a66">B</span> b <span style="color:#61afef">=</span> <span style="color:#c678dd">new</span> <span style="color:#d19a66">B</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
        <span style="color:#5c6370"><em>//A类和B类都是默认有一个无参构造,B类的默认无参构造中还会默认调用A类的默认无参构造</em></span>
        <span style="color:#5c6370"><em>//但是因为都是默认的,没有打印语句,看不出来</em></span>
    <span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
</code></span></span></span></span>

Scenario example 2:

<span style="color:#303030"><span style="background-color:#ffffff"><span style="background-color:#282c34"><span style="color:#abb2bf"><code class="language-java"><span style="color:#c678dd">class</span> <span style="color:#d19a66">A</span><span style="color:#abb2bf">{</span>
	<span style="color:#d19a66">A</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
		<span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"A类无参构造器"</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
	<span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
<span style="color:#c678dd">class</span> <span style="color:#d19a66">B</span> <span style="color:#c678dd">extends</span> <span style="color:#d19a66">A</span><span style="color:#abb2bf">{</span>

<span style="color:#abb2bf">}</span>
<span style="color:#c678dd">class</span> <span style="color:#d19a66">Test</span><span style="color:#abb2bf">{</span>
    <span style="color:#c678dd">public</span> <span style="color:#c678dd">static</span> <span style="color:#c678dd">void</span> <span style="color:#61afef">main</span><span style="color:#abb2bf">(</span><span style="color:#d19a66">String</span><span style="color:#abb2bf">[</span><span style="color:#abb2bf">]</span> args<span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
        <span style="color:#d19a66">B</span> b <span style="color:#61afef">=</span> <span style="color:#c678dd">new</span> <span style="color:#d19a66">B</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
        <span style="color:#5c6370"><em>//A类显示声明一个无参构造,</em></span>
		<span style="color:#5c6370"><em>//B类默认有一个无参构造,</em></span>
		<span style="color:#5c6370"><em>//B类的默认无参构造中会默认调用A类的无参构造</em></span>
        <span style="color:#5c6370"><em>//可以看到会输出“A类无参构造器"</em></span>
    <span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
</code></span></span></span></span>

Scenario example 3:

<span style="color:#303030"><span style="background-color:#ffffff"><span style="background-color:#282c34"><span style="color:#abb2bf"><code class="language-java"><span style="color:#c678dd">class</span> <span style="color:#d19a66">A</span><span style="color:#abb2bf">{</span>
	<span style="color:#d19a66">A</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
		<span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"A类无参构造器"</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
	<span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
<span style="color:#c678dd">class</span> <span style="color:#d19a66">B</span> <span style="color:#c678dd">extends</span> <span style="color:#d19a66">A</span><span style="color:#abb2bf">{</span>
	<span style="color:#d19a66">B</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
		<span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"B类无参构造器"</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
	<span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
<span style="color:#c678dd">class</span> <span style="color:#d19a66">Test</span><span style="color:#abb2bf">{</span>
    <span style="color:#c678dd">public</span> <span style="color:#c678dd">static</span> <span style="color:#c678dd">void</span> <span style="color:#61afef">main</span><span style="color:#abb2bf">(</span><span style="color:#d19a66">String</span><span style="color:#abb2bf">[</span><span style="color:#abb2bf">]</span> args<span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
        <span style="color:#d19a66">B</span> b <span style="color:#61afef">=</span> <span style="color:#c678dd">new</span> <span style="color:#d19a66">B</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
        <span style="color:#5c6370"><em>//A类显示声明一个无参构造,</em></span>
		<span style="color:#5c6370"><em>//B类显示声明一个无参构造,        </em></span>
		<span style="color:#5c6370"><em>//B类的无参构造中虽然没有写super(),但是仍然会默认调用A类的无参构造</em></span>
        <span style="color:#5c6370"><em>//可以看到会输出“A类无参构造器"和"B类无参构造器")</em></span>
    <span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
</code></span></span></span></span>

Scenario example 4:

<span style="color:#303030"><span style="background-color:#ffffff"><span style="background-color:#282c34"><span style="color:#abb2bf"><code class="language-java"><span style="color:#c678dd">class</span> <span style="color:#d19a66">A</span><span style="color:#abb2bf">{</span>
	<span style="color:#d19a66">A</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
		<span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"A类无参构造器"</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
	<span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
<span style="color:#c678dd">class</span> <span style="color:#d19a66">B</span> <span style="color:#c678dd">extends</span> <span style="color:#d19a66">A</span><span style="color:#abb2bf">{</span>
	<span style="color:#d19a66">B</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
        <span style="color:#c678dd">super</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
		<span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"B类无参构造器"</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
	<span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
<span style="color:#c678dd">class</span> <span style="color:#d19a66">Test</span><span style="color:#abb2bf">{</span>
    <span style="color:#c678dd">public</span> <span style="color:#c678dd">static</span> <span style="color:#c678dd">void</span> <span style="color:#61afef">main</span><span style="color:#abb2bf">(</span><span style="color:#d19a66">String</span><span style="color:#abb2bf">[</span><span style="color:#abb2bf">]</span> args<span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
        <span style="color:#d19a66">B</span> b <span style="color:#61afef">=</span> <span style="color:#c678dd">new</span> <span style="color:#d19a66">B</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
        <span style="color:#5c6370"><em>//A类显示声明一个无参构造,</em></span>
		<span style="color:#5c6370"><em>//B类显示声明一个无参构造,        </em></span>
		<span style="color:#5c6370"><em>//B类的无参构造中明确写了super(),表示调用A类的无参构造</em></span>
        <span style="color:#5c6370"><em>//可以看到会输出“A类无参构造器"和"B类无参构造器")</em></span>
    <span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
</code></span></span></span></span>

Scenario example 5:

<span style="color:#303030"><span style="background-color:#ffffff"><span style="background-color:#282c34"><span style="color:#abb2bf"><code class="language-java"><span style="color:#c678dd">class</span> <span style="color:#d19a66">A</span><span style="color:#abb2bf">{</span>
	<span style="color:#d19a66">A</span><span style="color:#abb2bf">(</span><span style="color:#c678dd">int</span> a<span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
		<span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"A类有参构造器"</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
	<span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
<span style="color:#c678dd">class</span> <span style="color:#d19a66">B</span> <span style="color:#c678dd">extends</span> <span style="color:#d19a66">A</span><span style="color:#abb2bf">{</span>
	<span style="color:#d19a66">B</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
		<span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"B类无参构造器"</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
	<span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
<span style="color:#c678dd">class</span> <span style="color:#d19a66">Test05</span><span style="color:#abb2bf">{</span>
    <span style="color:#c678dd">public</span> <span style="color:#c678dd">static</span> <span style="color:#c678dd">void</span> <span style="color:#61afef">main</span><span style="color:#abb2bf">(</span><span style="color:#d19a66">String</span><span style="color:#abb2bf">[</span><span style="color:#abb2bf">]</span> args<span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
        <span style="color:#d19a66">B</span> b <span style="color:#61afef">=</span> <span style="color:#c678dd">new</span> <span style="color:#d19a66">B</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
        <span style="color:#5c6370"><em>//A类显示声明一个有参构造,没有写无参构造,那么A类就没有无参构造了</em></span>
		<span style="color:#5c6370"><em>//B类显示声明一个无参构造,        </em></span>
		<span style="color:#5c6370"><em>//B类的无参构造没有写super(...),表示默认调用A类的无参构造</em></span>
        <span style="color:#5c6370"><em>//编译报错,因为A类没有无参构造</em></span>
    <span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
</code></span></span></span></span>

Scenario example 6:

<span style="color:#303030"><span style="background-color:#ffffff"><span style="background-color:#282c34"><span style="color:#abb2bf"><code class="language-java"><span style="color:#c678dd">class</span> <span style="color:#d19a66">A</span><span style="color:#abb2bf">{</span>
	<span style="color:#d19a66">A</span><span style="color:#abb2bf">(</span><span style="color:#c678dd">int</span> a<span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
		<span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"A类有参构造器"</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
	<span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
<span style="color:#c678dd">class</span> <span style="color:#d19a66">B</span> <span style="color:#c678dd">extends</span> <span style="color:#d19a66">A</span><span style="color:#abb2bf">{</span>
	<span style="color:#d19a66">B</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
		<span style="color:#c678dd">super</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
		<span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"B类无参构造器"</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
	<span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
<span style="color:#c678dd">class</span> <span style="color:#d19a66">Test06</span><span style="color:#abb2bf">{</span>
    <span style="color:#c678dd">public</span> <span style="color:#c678dd">static</span> <span style="color:#c678dd">void</span> <span style="color:#61afef">main</span><span style="color:#abb2bf">(</span><span style="color:#d19a66">String</span><span style="color:#abb2bf">[</span><span style="color:#abb2bf">]</span> args<span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
        <span style="color:#d19a66">B</span> b <span style="color:#61afef">=</span> <span style="color:#c678dd">new</span> <span style="color:#d19a66">B</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
        <span style="color:#5c6370"><em>//A类显示声明一个有参构造,没有写无参构造,那么A类就没有无参构造了</em></span>
		<span style="color:#5c6370"><em>//B类显示声明一个无参构造,        </em></span>
		<span style="color:#5c6370"><em>//B类的无参构造明确写super(),表示调用A类的无参构造</em></span>
        <span style="color:#5c6370"><em>//编译报错,因为A类没有无参构造</em></span>
    <span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
</code></span></span></span></span>

Scenario example 7:

<span style="color:#303030"><span style="background-color:#ffffff"><span style="background-color:#282c34"><span style="color:#abb2bf"><code class="language-java"><span style="color:#c678dd">class</span> <span style="color:#d19a66">A</span><span style="color:#abb2bf">{</span>
	<span style="color:#d19a66">A</span><span style="color:#abb2bf">(</span><span style="color:#c678dd">int</span> a<span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
		<span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"A类有参构造器"</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
	<span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
<span style="color:#c678dd">class</span> <span style="color:#d19a66">B</span> <span style="color:#c678dd">extends</span> <span style="color:#d19a66">A</span><span style="color:#abb2bf">{</span>
	<span style="color:#d19a66">B</span><span style="color:#abb2bf">(</span><span style="color:#c678dd">int</span> a<span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
		<span style="color:#c678dd">super</span><span style="color:#abb2bf">(</span>a<span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
		<span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"B类有参构造器"</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
	<span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
<span style="color:#c678dd">class</span> <span style="color:#d19a66">Test07</span><span style="color:#abb2bf">{</span>
    <span style="color:#c678dd">public</span> <span style="color:#c678dd">static</span> <span style="color:#c678dd">void</span> <span style="color:#61afef">main</span><span style="color:#abb2bf">(</span><span style="color:#d19a66">String</span><span style="color:#abb2bf">[</span><span style="color:#abb2bf">]</span> args<span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
        <span style="color:#d19a66">B</span> b <span style="color:#61afef">=</span> <span style="color:#c678dd">new</span> <span style="color:#d19a66">B</span><span style="color:#abb2bf">(</span><span style="color:#d19a66">10</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
        <span style="color:#5c6370"><em>//A类显示声明一个有参构造,没有写无参构造,那么A类就没有无参构造了</em></span>
		<span style="color:#5c6370"><em>//B类显示声明一个有参构造,        </em></span>
		<span style="color:#5c6370"><em>//B类的有参构造明确写super(a),表示调用A类的有参构造</em></span>
        <span style="color:#5c6370"><em>//会打印“A类有参构造器"和"B类有参构造器"</em></span>
    <span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
</code></span></span></span></span>

Scenario example 8:

<span style="color:#303030"><span style="background-color:#ffffff"><span style="background-color:#282c34"><span style="color:#abb2bf"><code class="language-java"><span style="color:#c678dd">class</span> <span style="color:#d19a66">A</span><span style="color:#abb2bf">{</span>
    <span style="color:#d19a66">A</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
        <span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"A类无参构造器"</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
    <span style="color:#abb2bf">}</span>
	<span style="color:#d19a66">A</span><span style="color:#abb2bf">(</span><span style="color:#c678dd">int</span> a<span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
		<span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"A类有参构造器"</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
	<span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
<span style="color:#c678dd">class</span> <span style="color:#d19a66">B</span> <span style="color:#c678dd">extends</span> <span style="color:#d19a66">A</span><span style="color:#abb2bf">{</span>
    <span style="color:#d19a66">B</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
        <span style="color:#c678dd">super</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span><span style="color:#5c6370"><em>//可以省略,调用父类的无参构造</em></span>
        <span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"B类无参构造器"</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
    <span style="color:#abb2bf">}</span>
	<span style="color:#d19a66">B</span><span style="color:#abb2bf">(</span><span style="color:#c678dd">int</span> a<span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
		<span style="color:#c678dd">super</span><span style="color:#abb2bf">(</span>a<span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span><span style="color:#5c6370"><em>//调用父类有参构造</em></span>
		<span style="color:#d19a66">System</span><span style="color:#abb2bf">.</span>out<span style="color:#abb2bf">.</span><span style="color:#61afef">println</span><span style="color:#abb2bf">(</span><span style="color:#98c379">"B类有参构造器"</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
	<span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
<span style="color:#c678dd">class</span> <span style="color:#d19a66">Test8</span><span style="color:#abb2bf">{</span>
    <span style="color:#c678dd">public</span> <span style="color:#c678dd">static</span> <span style="color:#c678dd">void</span> <span style="color:#61afef">main</span><span style="color:#abb2bf">(</span><span style="color:#d19a66">String</span><span style="color:#abb2bf">[</span><span style="color:#abb2bf">]</span> args<span style="color:#abb2bf">)</span><span style="color:#abb2bf">{</span>
        <span style="color:#d19a66">B</span> b1 <span style="color:#61afef">=</span> <span style="color:#c678dd">new</span> <span style="color:#d19a66">B</span><span style="color:#abb2bf">(</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
        <span style="color:#d19a66">B</span> b2 <span style="color:#61afef">=</span> <span style="color:#c678dd">new</span> <span style="color:#d19a66">B</span><span style="color:#abb2bf">(</span><span style="color:#d19a66">10</span><span style="color:#abb2bf">)</span><span style="color:#abb2bf">;</span>
    <span style="color:#abb2bf">}</span>
<span style="color:#abb2bf">}</span>
</code></span></span></span></span>

5.3 Summary: this and super

1. The meaning of this and super

this: the current object

  • In constructors and non-static code blocks, objects that are being new
  • In an instance method, the object that calls the current method

super: Refers to the members declared by the parent class

2. The usage format of this and super

  • this

    • this.Member variable: represents a member variable of the current object, not a local variable
    • this.Member method: Indicates a member method of the current object, you can completely omit this.
    • this() or this (actual parameter list): call another constructor to assist in the instantiation of the current object, only in the first line of the constructor, only the constructor of this class will be found, and an error will be reported if it cannot be found
  • super

    • super. Member variable: Indicates a member variable of the current object, which is declared in the parent class
    • super. Member method: Indicates a member method of the current object, which is declared in the parent class
    • super() or super (list of actual parameters): Call the constructor of the parent class to assist in the instantiation of the current object, only in the first line of the constructor, only the corresponding constructor of the direct parent class will be found, and an error will be reported if it cannot be found

5.4 Exercises

**Exercise 1:**

Modify the employee() method in the class Kids defined in Exercise 2 of the method rewriting, call the employee() method of the parent class ManKind in this method, and then output "but Kids should study and no job."

**Exercise 2:**

Modify the Cylinder class defined in Exercise 3 in Inheritance, and override the findArea() method in the Cylinder class to calculate the surface area of ​​the cylinder. Consider: how to modify the findVolume method accordingly?

Create an object of the Cylinder class in the CylinderTest class, set the base radius and height of the cylinder, and output the surface area and volume of the cylinder.

Additional questions:

Create an object of the Circle class in the CylinderTest class, set the radius of the circle, and calculate the area of ​​the output circle. Experience the separate calls of the parent class and subclass members.

Exercise 3:

1. Write a class demo account named Account. The properties and methods of this class are shown in the figure below. Attributes included in this class: account id, balance balance, annualInterestRate; methods included: accessor method (getter and setter methods), method getMonthlyInterest() that returns monthly interest rate, withdrawal method withdraw(), deposit method deposit() .

Write a user program to test the Account class. In the user program, create an Account object with an account number of 1122, a balance of 20,000, and an annual interest rate of 4.5%. Use the withdraw method to withdraw 30,000 yuan and print the balance.
Then use the withdraw method to withdraw 2,500 yuan, use the deposit method to deposit 3,000 yuan, and then print the balance and monthly interest rate.

Tip: In the withdrawal method withdraw, it is necessary to judge whether the user's balance can meet the requirements of the withdrawal amount, and if not, a prompt should be given.
The running result is shown in the figure:

2. Create a subclass CheckAccount of the Account class to represent an account that can be overdrafted. An attribute overdraft is defined in the account to represent the overdraft limit. Override the withdraw method in the CheckAccount class, and its algorithm is as follows:

<span style="color:#303030"><span style="background-color:#ffffff"><span style="background-color:#282c34"><span style="color:#abb2bf"><code class="language- language-none">如果(取款金额<账户余额),
	可直接取款
如果(取款金额>账户余额),
	计算需要透支的额度
	判断可透支额overdraft是否足够支付本次透支需要,如果可以
		将账户余额修改为0,冲减可透支金额
	如果不可以
		提示用户超过可透支额的限额
</code></span></span></span></span>

Requirements: Write a user program to test the CheckAccount class. In the user program, create a CheckAccount object with an account number of 1122, a balance of 20,000, an annual interest rate of 4.5%, and an overdraft limit of 5,000 yuan.

Use the withdraw method to withdraw 5,000 yuan, and print the account balance and overdraft amount.

Then use the withdraw method to withdraw 18,000 yuan, and print the account balance and overdraft amount.

Then use the withdraw method to withdraw 3,000 yuan, and print the account balance and overdraft amount.

hint:

(1) The construction method of the subclass CheckAccount needs to initialize all the 3 attributes inherited from the parent class and the attributes of the subclass itself.

(2) The attribute balance of the parent class Account is set to private, but its value needs to be modified in the withdraw method of the subclass CheckAccount, so the balance attribute of the parent class should be modified and defined as protected.

The running result is shown in the figure below:

Guess you like

Origin blog.csdn.net/swx595182208/article/details/130014973