Java面向对象-继承(重载overload)

1.   面向对象的三大特性之二继承(重载overload

1)    方法的重载

重载:在同一个类中方法名相同,参数类型或者参数个数不同

 

重载的方法可以相互调用,但是不能同时互相调用,会死循环

2)    构造器的重载

除了方法外,类的构造器也可以实现重载

类的构造器可以相互调用,调用方式是使用this关键字实现

 

父类:

public class Person {

    public String name;
    public int age;
    protected String sex;
    private String title;

    public void setName(String s) {
        name = s;
    }

    public String getName() {
        return name;
    }

    //overload,方法重载
    public String getName(Boolean hasTitle) {
        if (hasTitle) {
            return title;
        } else {
            return "notitle";
        }
    }

    public void displayName() {
        System.out.println(name);
    }
}

子类:

public class Teacher extends Person {

    public String name;
    public String title;

    //以下为构造器的重载
    public Teacher() {
        System.out.println("调用了Teacher()");
    }

    public Teacher(String n) {

        name = n;
        System.out.println("调用了Teacher(n)");
    }

    public Teacher(String n, String t) {
//        通过this方法实现构造器之间的相互调用,调用上面的Teacher(String n)构造器
this(n);
// name=n; title = t; System.out.println("调用了Teacher(String n,String t)"); } public void displayName() { System.out.println("woshi laoshi"); } }

调用:

public class TestOverride {
public static void main(String[] args) {
Teacher ta = new Teacher();
ta.setName("xiaoming");
ta.displayName();

System.out.println(ta.getName());
// 调用重载方法
System.out.println(ta.getName(false));

}
}

3)    Super关键字

用法:

访问父类的成员变量: super.变量

访问父类中被重写的方法:super.方法([参数列表])

访问父类的构造器: super([参数列表])

父类:

public class Persona {

    public String name;
    public int age;
    protected String sex;
    private String title;

    public void setName(String s) {
        name = s;
    }

    public String getName() {
        return name;
    }

    public void displayName(){
        System.out.println(name);
    }

    public Persona(String n){
        System.out.println("父类构造器");
        name = n;
    }

}

子类:

public class Teacher1 extends Persona{

    public void setName(){
        super.name="teacher 1";
        System.out.println(super.name);

    }

    public void displayName(){
//        可以直接在子类中调用父类的方法
        super.displayName();
    }

    public void test(){
        super.displayName();
    }
//直接用super()来访问父类的构造器
    public Teacher1(String n){
        super(n);
    }

}

测试类:

public class TestSuper {

    public static void main(String[] args) {
        Teacher1  tc= new Teacher1("OO");
        tc.setName();
//        System.out.println();
        tc.displayName();
    }

}

4)    This关键字

this关键字:构造器中指该构造器所创建的新对象;方法中指调用该方法的对象

public class Thistest {

    private int number;

    public int getNumber(){
        return this.number;
    }

    public Thistest create(){
        this.number++;
//        返回当前对象
        return this;
    }
//这里调用好神奇
    public void test(){
        Test tt = new Test();
        tt.test(this);
    }

    public static void main(String[] args) {
        Thistest tt = new Thistest();
//        tt.create().create().create();
        tt.test();
        System.out.println(tt.number);
    }
}

调用:

public class Test {

    public void test(Thistest ii){
        ii.create();
        System.out.println(ii.getNumber());
    }

}

 

 

5)    Super()this()superthis

简要说:super是当子类调用父类时用的,this是调用当前类时使用的。

相同点:super()this()均需放在构造方法内第一行。

this()super()都指的是对象,所以,均不可以在static环境中使用

 

不同点:

    super():调用父类无形参的构造方法;
super(
形参):调用父类中某个带形参的构造方法;
this(
形参):调用本类中另一种形式的构造方法
注意:放在方法的首行;

 

    superthis的区别:
super.
父类的成员变量;
super.
父类的方法;
super
:当子类中的成员变量、方法和父类的相同时,实现调用父类的成员变量和方法;
this:
代表当前的对象;
使用的地方:若函数的形参和成员变量同名时,需要用this.成员变量名

 

重写代码示例:

父类:

public class Person {

    public String name;
    public int age;
    protected String sex;
    private String title;

    public void setName(String s) {
        name = s;
    }

    public String getName() {
        return name;
    }

    //overload,方法重载
    public String getName(Boolean hasTitle) {
        if (hasTitle) {
            return title;
        } else {
            return "notitle";
        }
    }

    public void displayName() {
        System.out.println(name);
    }
}

子类:

public class Teacher extends Person {

    public String name;
    public String title;

    //以下为构造器的重载
    public Teacher() {
        System.out.println("调用了Teacher()");
    }

    public Teacher(String n) {

        name = n;
        System.out.println("调用了Teacher(n)");
    }

    public Teacher(String n, String t) {
//        通过this方法实现构造器之间的相互调用
        this(n);
        //  name=n;
        title = t;
        System.out.println("调用了Teacher(String n,String t)");
    }

    public void displayName() {
        System.out.println("woshi laoshi");
    }
}

调用

public class TestOverride {
    public static void main(String[] args) {
        Teacher ta = new Teacher();
        ta.setName("xiaoming");
        ta.displayName();

        System.out.println(ta.getName());
//        调用重载方法
        System.out.println(ta.getName(false));

    }
}

 

posted on 2021-06-30 18:18  cStream  阅读(116)  评论(0)    收藏  举报