1.请问下面的实现可以吗?
1 public interface A{} 2 public interface B{} 3 public class C implements A, B{} 4 A a = new C(); 5 B b = (B) a;
答案是可以的,一个类实现了多个接口,该类的实例的类型可以在实现的接口之间转化。是通过接口实现多态的一种表现。
2.序列化应用场景举例
概念:序列化
java对象需要序列化到本地硬盘或者需要在网络中传输时需要将java对象进行实例化操作,被实例化的类需要实现serializable接口。该接口没有需要被实现的方法。
需要被实例化的类实现serializable接口只是说明该类可以被实例化。
从网络中接受到的实例化后的java对象需要进行反实例化操作从而得到java对象,方可进行后续操作
举例建设中...
3.泛型
使用泛型最大的作用是 数据的使用更加安全,可以将变量类型错误在编译阶段给暴露出来。
子概念:通配符
泛型进行引用传递时类型必须是一致的
1 class Info<T> 2 { 3 private T str; 4 5 public void setStr(T str) 6 { 7 this.str = str; 8 } 9 10 public T getStr() 11 { 12 return this.str; 13 } 14 } 15 16 public class GenericDemo 17 { 18 public static void main(Strings[] arg) 19 { 20 Info<String> info = new Info<String>(); 21 info.setStr("java"); 22 fun(info); //引用的传递 23 } 24 25 public static void fun(Info<Oject> temp) 26 { 27 System.out.println("temp: " + temp); 28 } 29 }
上述代码会报错;
解决方案1.修改fun()方法的声明,不加任何修饰符(该方案不是很妥当,之前已经声明过类型)
public static void fun(Info temp){}
解决方案2.修改fun()方法的声明,将类型改变为 "?"
public static void fun(Info<?> temp){}
在方案2中,
将
Info<String> info = new Info<String>();
info.setStr("java");
改为
Info<?> info = new Info<String>();
info.setStr("java");
java虚拟机在编译时会报错,"?"为通配符,并不指定具体类型
所以,使用 "?" 时只能作为接收时类型的指定。
泛型与子类继承的关系
一个类的子类可以通过对象的多态性为其父类实例化,但是在泛型操作中,泛型的子类是无法通过父类的泛型进行接收的。例如
1 Info<String> info1 = new Info<String>(); 2 Info<String> info2 = null; 3 4 info2 = info1;
这样操作时不允许的。
受限泛型: 关键字 extend super
4、泛型接口
1 public interface Info<T>{ 2 3 public T getInfo(); 4 5 }
泛型接口的两种实现方式:
a.在子类的定义上也声明泛型
1 interface Info<T> 2 { 3 public T getVar(); 4 } 5 6 public class InfoImpl<T> implements Info<T> 7 { 8 public T var; 9 public InfoImpl(T var) //通过构造方法设置属性 10 { 11 this.setVar(var); 12 } 13 14 public void setVar(var) 15 { 16 this.var = var; 17 } 18 19 public T getVar() 20 { 21 return var; 22 } 23 24 public static void main(String agrs[]) 25 { 26 Info<String> info = null; //声明接口对象 27 info = new InfoImpl<String>("java"); //通过子类实例化对象 28 29 System.out.prinln(info.getVar()); 30 } 31 32 33 }
b.在实现接口的时候具体制定类型即可
1 interface Info<T> 2 { 3 public T getVar(); 4 } 5 6 public class InfoImpl<T> implements Info<String> 7 { 8 public String var; 9 public InfoImpl(String var) //通过构造方法设置属性 10 { 11 this.setVar(var); 12 } 13 14 public void setVar(var) 15 { 16 this.var = var; 17 } 18 19 public String getVar() 20 { 21 return var; 22 } 23 24 public static void main(String agrs[]) 25 { 26 info = new InfoImpl(java"); 27 28 System.out.prinln(info.getVar()); 29 } 30 31 32 }