1. super的用法
3.9.2 super和this的用法格式
super和this完整的用法如下,其中this,super访问成员我们已经接触过了。
this.成员变量 -- 本类的 super.成员变量 -- 父类的 this.成员方法名() -- 本类的 super.成员方法名() -- 父类的
接下来我们使用调用构造方法格式:
super(...) -- 调用父类的构造方法,根据参数匹配确认 this(...) -- 调用本类的其他构造方法,根据参数匹配确认
3.9.3 super(....)用法演示
代码如下:
class Person { private String name ="凤姐"; private int age = 20; public Person() { System.out.println("父类无参"); } public Person(String name , int age){ this.name = name ; this.age = age ; } // getter/setter省略 } class Student extends Person { private double score = 100; public Student() { //super(); // 调用父类无参构造方法,默认就存在,可以不写,必须再第一行 System.out.println("子类无参"); } public Student(String name , int age,double score) { super(name ,age);// 调用父类有参构造方法Person(String name , int age)初始化name和age this.score = score; System.out.println("子类有参"); } // getter/setter省略 } public class Demo07 { public static void main(String[] args) { // 调用子类有参数构造方法 Student s2 = new Student("张三",20,99); System.out.println(s2.getScore()); // 99 System.out.println(s2.getName()); // 输出 张三 System.out.println(s2.getAge()); // 输出 20 } }
注意:
子类的每个构造方法中均有默认的super(),调用父类的空参构造。手动调用父类构造会覆盖默认的super()。
super() 和 this() 都必须是在构造方法的第一行,所以不能同时出现。
super(..)是根据参数去确定调用父类哪个构造方法的。
问题:
1. java中,如果父类的方法带private,那么子类中的方法可以使用父类的这个方法吗
在Java中,如果一个父类的方法被声明为private
,那么子类是无法直接访问这个方法的。private
访问修饰符意味着该方法只能在定义它的类内部被访问。
当你在子类中创建一个与父类中private
方法同名的方法时,这实际上不是重写(Override),而是在子类中创建了一个全新的方法。这是因为父类中的private
方法对子类是不可见的,因此不可能发生重写。
如果你需要在子类中访问父类的某些功能,你可以:
-
更改访问修饰符:如果逻辑上可行,可以将父类方法的访问修饰符从
private
改为protected
或public
。这样,子类就可以访问这些方法了。 -
通过公共或受保护的方法间接访问:在父类中创建一个
public
或protected
方法,该方法内部调用private
方法。然后,子类可以通过继承的这个公共或受保护的方法来间接访问private
方法。
2. 子类中,如何使用父类的方法
在Java中,子类可以使用父类的方法,具体取决于这些方法的访问控制修饰符(如public
、protected
、private
)。以下是几种常见的情况和如何处理它们:
-
公共方法 (
public
): 子类可以直接访问继承自父类的公共方法。例如,如果父类中有一个public void show()
方法,子类可以直接调用这个方法。 -
受保护方法 (
protected
): 和公共方法类似,受保护的方法也可以在子类中直接访问。 -
默认访问(无修饰符): 如果父类中的方法没有访问修饰符,那么它具有包级私有性(package-private)。这意味着只有在同一个包中的类可以访问这些方法。如果子类位于相同的包中,则可以访问这些方法;如果不在,就不能访问。
-
私有方法 (
private
): 如前所述,私有方法不能被子类直接访问。如果需要在子类中使用私有方法的功能,可以在父类中提供一个非私有的访问器(例如,一个public
或protected
方法)。
如果子类需要调用父类中的方法,它可以使用super
关键字。例如,假设父类有一个名为doSomething()
的方法,子类可以这样调用它:
public class ParentClass {
public void doSomething() {
// ...
}
}
public class ChildClass extends ParentClass {
public void someOtherMethod() {
super.doSomething();
}
}
在这个例子中,ChildClass
使用super.doSomething()
调用了继承自ParentClass
的doSomething()
方法。这种使用super
的方式适用于public
、protected
和包级私有方法,但不适用于private
方法。
3. 一定要加这个super吗?
在Java中,子类调用父类的方法时,使用super
关键字是可选的,但在某些情况下是必要的。具体情况取决于你的代码结构和需求。以下是几种常见情况:
-
没有同名方法的情况:
- 如果子类没有与父类同名的方法,则可以直接调用继承自父类的方法,无需使用
super
关键字。 - 例如,如果父类有一个方法
parentMethod()
,子类中没有这个方法,那么子类可以直接调用parentMethod()
。
- 如果子类没有与父类同名的方法,则可以直接调用继承自父类的方法,无需使用
-
有同名方法的情况(方法覆盖):
- 当子类重写(Override)父类的方法时,如果在子类的方法中需要调用父类的同名方法,就必须使用
super
关键字。 - 例如,如果子类重写了
parentMethod()
,那么在子类中调用super.parentMethod()
会调用父类的parentMethod()
,而调用parentMethod()
则会调用子类自己的方法。
- 当子类重写(Override)父类的方法时,如果在子类的方法中需要调用父类的同名方法,就必须使用
-
构造函数中的使用:
- 在子类的构造函数中,可以使用
super()
来显式地调用父类的构造函数。如果没有显式调用super()
,Java会自动插入对父类无参构造函数的调用。如果父类没有无参构造函数,那么子类必须显式调用一个存在的父类构造函数。
- 在子类的构造函数中,可以使用
总结来说,super
的使用取决于你是否需要区分子类的方法与父类中同名的方法。如果子类中的方法与父类的方法名称不同,或者你不需要引用父类的同名方法,那么就不需要使用super
。