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()、super、this
简要说:super是当子类调用父类时用的,this是调用当前类时使用的。
相同点:super()和this()均需放在构造方法内第一行。
this()和super()都指的是对象,所以,均不可以在static环境中使用
不同点:
①
super():调用父类无形参的构造方法;
super(形参):调用父类中某个带形参的构造方法;
this(形参):调用本类中另一种形式的构造方法
注意:放在方法的首行;
②
super和this的区别:
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)); } }