父类public,子类private,正在尝试分配更低的访问权限
为什么?因为这不符合原则,这样如果允许,就不能多肽了。
从设计模式来说,接口开放,实现可以混淆。
有区别吗?没有
从JVM的角度来看,这2个东西,在JVM里面,都是标记为abstruct的类。所以接口可以理解为是一种特殊的类。并且在java8开始,接口也可以有默认实现。
这是从JVM的角度来看,从设计的角度来看呢?
https://developer.ibm.com/zh/articles/l-javainterface-abstract/
可以参考上面的链接。
抽象类,是is a的关系。接口是like a的关系。
反射是虚拟机特有的一个case,C++是不支持这个的。
当类加载了以后,它的所有信息都在虚拟机里保存了,所以可以通过classloader的方式,找到类的全部信息,包括private的信息,但是这个方式其实是不推荐的,一个是效率低,二是这样不符合设计原则。
把类型当作型参来处理,本质上就是参数化类型。
C++上的实现是每个基本类,都复制一份代码,这个是很老的设计了。JVM的实现更彻底,就是用Object来代表,是有一份实现。所以类型就会丢失掉。然后在使用的时候,编译器会优化这部分代码,进行强制转换。
@Override public void testA() { List a = new ArrayList<Integer>(); this.method(a); } public static String method(List<String> list){ return list.get(0); }
Integer 传给了String,对的,是这个case。
因为啥?List a 是这个什么类型,就是List类型。在方法传递的时候,method只知道传递进去list类型。
所以这部分code在list.get(0)的时候,会变为如下代码
return (String)list.get(0);
所以可以编译通过,but,在运行的时候会抛异常,类型不符。
注解的主要方式,就是通过反射的方式,然后获取
f(field.isAnnotationPresent(FruitName.class)){ FruitName fruitName = field.getAnnotation(FruitName.class); TraceLog.i(fruitName.value()); }
这样就是annotation的方式。