若是咱们须要产生多个对象,每一个对象的逻辑彻底同样,只是对象内的成员变量的类型不一样。那么咱们该如何去作?编程
① 建立多个类文件,给每一个类中的成员变量设置指定的数据类型;安全
1 public class Demo1{ 2 public static void main(String []args){ 3 MyClass1 myclass1=new MyClass1("张三"); 4 System.out.println(myclass1.getData()); 5 MyClass2 myclass2=new MyClass2(10); 6 System.out.println(myclass2.getData()); 7 } 8 } 9
10 class MyClass1{ 11 private String data; 12 public MyClass1(String data){ 13 this.data=data; 14 } 15
16 public void setData(String data){ 17 this.data=data; 18 } 19 public String getData(){ 20 return data; 21 } 22 } 23
24 class MyClass2{ 25 private int data; 26 public MyClass2(int data){ 27 this.data=data; 28 } 29
30 public void setData(int data){ 31 this.data=data; 32 } 33 public int getData(){ 34 return data; 35 } 36 }
缺点:这种方式会致使类的膨胀,重用性太差;ide
① 建立一个类文件,给这个类中的成员变量设置Object数据类型;this
1 public class Demo11{ 2 public static void main(String []args){ 3 MyClass myClass1=new MyClass("张三"); 4 System.out.println((String)myClass1.getData()); 5 MyClass myClass2=new MyClass(10); 6 System.out.println((Integer)myClass2.getData()); 7 //以上能够执行 8 //但int类型不能装换为String类型
9 System.out.println((String)myClass2.getData()); 10 } 11 } 12
13 class MyClass{ 14 private Object data; 15 public MyClass(Object data){ 16 this.data=data; 17 } 18
19 public void setData(Object data){ 20 this.data=data; 21 } 22 public Object getData(){ 23 return data; 24 } 25 }
缺点:编译时正常,但运行时可能会异常;spa
泛型类就能解决以上两个问题;3d
泛型简介code
① 泛型是JDK4.5引入的新特性,也是最重要的一个特性;对象
② 泛型能够再编译的时候检查类型安全,而且全部的强制转换都是自动和隐式的;blog
③ 泛型的原理就是“类型的参数化”,即把类型看做参数。也就是说把所要操做的数据类型看做参数,就像方法的形式参数是运行时传递的值的占位符同样;继承
④ 简单的说,类型变量扮演的角色就如同一个参数,它提供给编译器用来类型检查的信息;
⑤ 泛型能够提升代码的扩展性和重用性;
总结:所谓泛型,即经过参数化类型来实如今同一份代码上操做多种数据类型,泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用;
泛型类示例:
1 public class GenClass <T>{ 2 private T obj; 3 public GenClass(T obj){ 4 this.obj=obj; 5 } 6 public T getObj(){ 7 return obj; 8 } 9 public void setObj(T obj){ 10 this.obj=obj; 11 } 12 }
T表明类型,好比Integer,String
用泛型类解决以上问题
1 public class GenericDemo1{ 2 public static void main(String []args){ 3 //建立一个泛型类对象
4 GenClass<String> gen1=new GenClass<String>("张三"); 5 System.out.println(gen1.getData()); 6 GenClass<Integer> gen2=new GenClass<Integer>(10); 7 System.out.println(gen2.getData()); 8 //使用了泛型以后再作强制类型转换编译没法经过 9 //System.out.println((String)gen2.getData());
10 } 11 } 12
13 //建立一个泛型类
14 class GenClass<T>{ 15 private T data; 16 public GenClass(T data){ 17 this.data=data; 18 } 19
20 public void setData(T data){ 21 this.data=data; 22 } 23 public T getData(){ 24 return data; 25 } 26 }
泛型的用法
① 泛型的参数类型可使泛型类;
1 public class GenericDemo1{ 2 public static void main(String []args){ 3 //一个泛型类做为另外一个泛型类的参数
4 GenClass<GenClass<Student>> gen1=new GenClass<GenClass<Student>>(); 5 GenClass<Student> gen2=new GenClass<Student>(); 6 gen2.setData(new Student("张三")); 7 gen1.setData(gen2); 8
9 System.out.println(gen1.getData().getData()); 10 } 11 } 12
13 //建立一个泛型类
14 class GenClass<T>{ 15 private T data; 16 public GenClass(){ 17
18 } 19 public GenClass(T data){ 20 this.data=data; 21 } 22
23 public void setData(T data){ 24 this.data=data; 25 } 26 public T getData(){ 27 return data; 28 } 29 } 30
31 class Student{ 32 private String name; 33 public Student(String name){ 34 this.name=name; 35 } 36 public String toString(){ 37 return "我是:"+name; 38 } 39 }
② 泛型类能够同时设置多个类型参数;
1 public class GenericDemo1{ 2 public static void main(String []args){ 3 //带2个参数的泛型
4 GenClass2<String,Integer> gen1=new GenClass2<String,Integer>("张三",20); 5 System.out.println(gen1.getData1()); 6 System.out.println(gen1.getData2()); 7 } 8 } 9
10 class GenClass2<T1,T2>{ 11 private T1 data1; 12 private T2 data2; 13 public GenClass2(T1 data1,T2 data2){ 14 this.data1=data1; 15 this.data2=data2; 16 } 17 public T1 getData1(){ 18 return data1; 19 } 20 public T2 getData2(){ 21 return data2; 22 } 23 }
③ 泛型类能够继承泛型类;
1 public class GenericDemo2{ 2 public static void main(String []args){ 3 //一个泛型类继承另外一个泛型类
4 SubClass<String,Integer> sub=new SubClass<String,Integer>("张三",20); 5 System.out.println(sub.show1()); 6 } 7 } 8
9 class SuperClass<T1>{ 10 private T1 var1; 11 public SuperClass(T1 var1){ 12 this.var1=var1; 13 } 14
15 public T1 show1(){ 16 return var1; 17 } 18 } 19
20 class SubClass<T1,T2> extends SuperClass<T1>{ 21 private T2 var2; 22 public SubClass(T1 var1,T2 var2){ 23 super(var1); 24 this.var2=var2; 25 } 26 //重写父类的方法
27 public T1 show1(){ 28 return super.show1(); 29 } 30 }
④泛型类能够实现泛型接口;
1 public class GenericDemo2{ 2 public static void main(String []args){ 3 //一个泛型类继承另外一个泛型类
4 SubClass<String,Integer> sub=new SubClass<String,Integer>("张三",20); 5 System.out.println(sub.show1()); 6 //实现接口的方法
7 sub.show2(100); 8 } 9 } 10
11 class SuperClass<T1>{ 12 private T1 var1; 13 public SuperClass(T1 var1){ 14 this.var1=var1; 15 } 16
17 public T1 show1(){ 18 return var1; 19 } 20 } 21
22 interface IInfo<T2>{ 23 public void show2(T2 var3); 24 } 25
26 class SubClass<T1,T2> extends SuperClass<T1> implements IInfo<T2>{ 27 private T2 var2; 28 public SubClass(T1 var1,T2 var2){ 29 super(var1); 30 this.var2=var2; 31 } 32 //重写父类的方法
33 public T1 show1(){ 34 return super.show1(); 35 } 36 //实现接口的方法
37 public void show2(T2 var3){ 38 System.out.println(var3); 39 System.out.println(var2); 40 //虽然都是Integer类型,但泛型会先将其转为Object类型,因此不能相加 41 //System.out.println(var2+var3);
42 } 43 }