首先定义标识接口——信息
package four;
public interface Info {
}
第一个类用来实现联系方式
package four;
public class Contact implements Info {
private String address;
private String telphone;
private String zipcode;
public Contact(String address,String telphone,String zipcode) {
this.address = address;
this.telphone = telphone;
this.zipcode = zipcode;
}
public String getaddress() {
return address;
}
public String gettelphone() {
return telphone;
}
public String getzipcpde() {
return zipcode;
}
public String toString() {
return "联系方式:"+"\n"+"\t|- 联系电话:"+this.telphone+
"\t|- 联系地址:"+this.address+
"\t|- 邮政编码:"+this.zipcode;
}
}
ps:最后运用了toString的覆写方式,用于最后的输出
第二个类用来实现个人的基本信息
package four;
public class Intro implements Info {
private String name;
private String sex;
private int age;
public Intro(String name,String sex,int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getname() {
return name;
}
public String getsex() {
return sex;
}
public int getage() {
return age;
}
public String toString() {
return "基本信息:"+"\n"+"\t|- 名字:"+this.name+
"\t|- 性别:"+this.sex+
"\t|- 年龄:"+this.age;
}
}
ps:其实这两个类是没什么大的区别的,只是参数换了而已。都是用构造方法为属性设置值,然后用get方法来取得值而已。笔者很菜,暂时先用这个。
最后一个定义一个Person类,info属性的类型使用泛型
package four;
public class Person<T extends Info> {
private T info;
public Person(T info) {
this.info = info;
}
public T getinfo() {
return info;
}
public String toString() {
return this.info.toString();
}
}
ps:可以很清楚的看到,这个类里面的属性和方法都使用泛型。为泛型设置上限,规定泛型只能是Info接口的子类,然后继续运用构造方法和get方法设置与取得最后的值。
需要注意的是,最后toString方法中,调用的是Info接口子类中的toString方法,覆写Object类中的toString方法。
最后是主函数,分别实例化两个对象,用来实现不同的功能
package four;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
String a1 = in.next();
String a2 = in.next();
String a3 = in.next();
Person <Contact> a = new Person<Contact>(new Contact(a1,a2,a3));
System.out.println("——————————————————————————————————————————————");
System.out.println(a);
String b1 = in.next();
String b2 = in.next();
int b3 = in.nextInt();
Person <Intro> b = new Person<Intro>(new Intro(b1,b2,b3));
System.out.println(b);
}
}
ps:此时泛型的妙处就可以体现了,类型不相同的属性如果不用泛型转换会很恼火,但是此处只需要将泛型声明为Info的子类即可,整个属性也会随着子类的改变而改变。
**特别需要注意:**实例化Person对象时,还要实例化Info子类的对象,因为之前用于信息统计的两个类里面同样有方法的存在,所以要想使用方法,必须将该子类对象实例化。这个有时候会很难注意到。