1. private,protected,public

父类public,子类private,正在尝试分配更低的访问权限
为什么?因为这不符合原则,这样如果允许,就不能多肽了。
从设计模式来说,接口开放,实现可以混淆。

2. 接口和抽象类

有区别吗?没有
从JVM的角度来看,这2个东西,在JVM里面,都是标记为abstruct的类。所以接口可以理解为是一种特殊的类。并且在java8开始,接口也可以有默认实现。
这是从JVM的角度来看,从设计的角度来看呢?
https://developer.ibm.com/zh/articles/l-javainterface-abstract/
可以参考上面的链接。
抽象类,是is a的关系。接口是like a的关系。

3. 反射

反射是虚拟机特有的一个case,C++是不支持这个的。
当类加载了以后,它的所有信息都在虚拟机里保存了,所以可以通过classloader的方式,找到类的全部信息,包括private的信息,但是这个方式其实是不推荐的,一个是效率低,二是这样不符合设计原则。

4. 异常

  • Error和Exception的区别:Error通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常时,Java虚拟机(JVM)一般会选择终止线程;Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常

5.泛型

5.1 泛型的本质

把类型当作型参来处理,本质上就是参数化类型。

5.2 虚拟机上的实现

C++上的实现是每个基本类,都复制一份代码,这个是很老的设计了。JVM的实现更彻底,就是用Object来代表,是有一份实现。所以类型就会丢失掉。然后在使用的时候,编译器会优化这部分代码,进行强制转换。

5.3 类型搽除

    @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,在运行的时候会抛异常,类型不符。

6. 注解

  • 生成文档。这是最常见的,也是java 最早提供的注解。常用的有@param @return 等
  • 跟踪代码依赖性,实现替代配置文件功能。比如Dagger 2 依赖注入,未来java 开发,将大量注解配置,具有很大用处;
  • 在编译时进行格式检查。如@override 放在方法前,如果你这个方法并不是覆盖了超类方法,则编译时就能检查出
    注解的主要方式,就是通过反射的方式,然后获取

    f(field.isAnnotationPresent(FruitName.class)){
                FruitName fruitName = field.getAnnotation(FruitName.class);
                TraceLog.i(fruitName.value());
            }

    这样就是annotation的方式。

7. Java & C++ 区别

  • java是跨平台的,C++是平台相关的(linux,windows,mac等)
    java是通过JVM来解决跨平台的问题。
  • java是纯面向对象,而C++是C语言版本的面向对象
  • java没有指针,而C++有
  • java有GC,C++需要自己管理
  • java不支持多继承,c++支持
  • java不支持操作符重载,而C++支持

发表评论

电子邮件地址不会被公开。 必填项已用*标注