当前位置 博文首页 > weixin_33728268的博客:Java基础知识(二)

    weixin_33728268的博客:Java基础知识(二)

    作者:[db:作者] 时间:2021-07-19 19:27

    • 一、基本概念
      • 1. Java程序初始化的顺序是怎么样的
      • 2. Java和C++的区别
      • 3. 反射
        • 先看一个知乎回答
        • 什么是反射
        • 主要用途
        • 获得Class对象
      • 4. 注解
        • 什么是注解
        • 为什么要用注解
        • 基本Annotation
        • 自定义注解类编写规则
        • 自定义注解实例
      • 5. 泛型
        • 通俗解释
        • 泛型方法
        • 泛型类
        • 类型通配符
      • 6. 字节与字符的区别
      • 7. 有哪些访问修饰符
      • 8. 深拷贝与浅拷贝
      • 9. Lamda表达式
        • 语法
        • Lambda 表达式实例
        • 变量作用域
      • 10. 字符串常量池
      • 11. 解释型语言与编译型语言的区别
    • 二、面向对象
      • 1. Java的四个基本特性,对多态的理解,在项目中哪些地方用到多态
      • 2. 什么是重载和重写
      • 3. 面向对象和面向过程的区别?用面向过程可以实现面向对象吗?
      • 4. 面向对象开发的六个基本原则,在项目中用过哪些原则
      • 5. 内部类有哪些
        • (一)成员内部类
        • (二)局部内部类
        • (三)匿名内部类
        • (四)静态内部类
      • 6. 组合、继承和代理的区别
        • 定义
        • 使用场合
      • 7. 什么是构造函数
      • 8. 向上造型和向下造型
    • 三、关键字
      • 1. final与static的区别
        • final
        • static
      • 2. break、continue、return
        • break
        • continue
        • return
      • 3. final、finally和finalize区别
        • final
        • finally
        • finalize
          • 判定死亡
          • 最后的救赎
          • finalize()的作用
      • 4. assert有什么作用
      • 5. volatile
      • 6. instanceof
      • 7. strictfp
      • 8. transient
      • 9. native
    • 四、基本数据类型与运算
      • 1. Java的基本数据类型和引用类型,自动装箱和拆箱
      • 2. ValueOf缓存池
      • 3. i++和++i有什么区别
        • i++
        • ++i
      • 4. 位运算符
      • 5. 原码、补码、反码是什么
        • 机器数
        • 真值
        • 原码
        • 反码
        • 补码
      • 6. 不用额外变量交换两个整数的值
      • 7. 不使用运算符进行a+b操作
      • 8. &和&& 、|和||的区别
    • 五、字符串与数组
      • 1. String,StringBuffer,StringBuilder,以及对String不变性的理解
      • 2. String有重写Object的hashcode和toString吗?如果重写equals不重写hashcode会出现什么问题?
      • 3. 如果你定义一个类,包括学号,姓名,分数,如何把这个对象作为key?要重写equals和hashcode吗
      • 4. 字面量
    • 六、异常处理
      • 1. 常见异常分为那两种(Exception,Error),常见异常的基类以及常见的异常
    • 七、Object 通用方法
      • equals()
      • hashCode()
      • toString()
      • clone()
    • 更新日志

    1. Java程序初始化的顺序是怎么样的

    ?在Java语言,当实例化对象时,对象所在类的所有成员变量首先要进行实例化,只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象。

    初始化一般遵循3个原则:

    • 静态对象(变量)优先于非静态对象(变量)初始化,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次;
    • 父类优先于子类进行初始化;
    • 按照成员变量的定义顺序进行初始化。 即使变量定义散布于方法定义之中,它们依然在任何方法(包括构造函数)被调用之前先初始化;

    加载顺序

    • 父类(静态变量、静态语句块)
    • 子类(静态变量、静态语句块)
    • 父类(实例变量、普通语句块)
    • 父类(构造函数)
    • 子类(实例变量、普通语句块)
    • 子类(构造函数)

    2. Java和C++的区别

    • Java 是纯粹的面向对象语言,所有的对象都继承自 java.lang.Object,C++ 为了兼容 C 即支持面向对象也支持面向过程。
    • Java 通过虚拟机从而实现跨平台特性,但是 C++ 依赖于特定的平台。
    • Java 没有指针,它的引用可以理解为安全指针,而 C++ 具有和 C 一样的指针。
    • Java 支持自动垃圾回收,而 C++ 需要手动回收。(C++11 中引入智能指针,使用引用计数法垃圾回收)
    • Java 不支持多重继承,只能通过实现多个接口来达到相同目的,而?C++ 支持多重继承。
    • Java 不支持操作符重载,虽然可以对两个 String 对象支持加法运算,但是这是语言内置支持的操作,不属于操作符重载,而 C++ 可以。
    • Java 内置了线程的支持,而 C++ 需要依靠第三方库。
    • Java 的?goto 是保留字,但是不可用,C++ 可以使用 goto。
    • Java?不支持条件编译,C++ 通过 #ifdef #ifndef 等预处理命令从而实现条件编译。

    参考资料:

    • C++ 工程实践(8):值语义 - 陈硕 - 博客园
    • c++11改进我们的程序之垃圾回收

    3. 反射

    ?首先看一个在知乎上的优秀回答吧:

    ?反射是什么呢?当我们的程序在运行时,需要动态的加载一些类,这些类可能之前用不到,所以不用加载到 JVM,而是在运行时根据需要才加载,这样的好处对于服务器来说不言而喻。

    举个例子我们的项目底层有时是用 mysql,有时用 oracle,需要动态地根据实际情况加载驱动类,这个时候反射就有用了,假设 com.java.dbtest.myqlConnection,com.java.dbtest.oracleConnection 这两个类我们要用,这时候我们的程序就写得比较动态化,通过 Class tc = Class.forName("com.java.dbtest.TestConnection"); 通过类的全类名让 JVM 在服务器中找到并加载这个类,而如果是 Oracle 则传入的参数就变成另一个了。这时候就可以看到反射的好处了,这个动态性就体现出 Java 的特性了!

      举多个例子,大家如果接触过 spring,会发现当你配置各种各样的 bean 时,是以配置文件的形式配置的,你需要用到哪些 bean 就配哪些,spring 容器就会根据你的需求去动态加载,你的程序就能健壮地运行。

    ?

    什么是反射

      反射 (Reflection) 是 Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。通过 Class 获取 class 信息称之为反射(Reflection)

    简而言之,通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。

    程序中一般的对象的类型都是在编译器确定下来的,而Java反射机制可以动态地创建对象并调用其属性,这样的对象地类型在编译器是未知的。所以我们可以通过反射机制直接创建对象,即使这个对象的类型在编译器是未知的。

    反射的核心是JVM在运行时才动态或调用方法/访问属性,它不需要事先(写代码的时候或编译器)知道运行对象是谁。

    Java反射框架主要提供以下功能:

    1.在运行时判断任意一个对象所属的类

    2.在运行时构造任意一个类的对象

    3.在运行时判断任意一个类所具有的成员变量和方法(通过反射甚至可以调用private方法)

    4.在运行时调用任意一个对象的方法

      重点:是运行时而不是编译时

    ?

    主要用途

      很多人都认为反射在实际的 Java 开发应用中并不广泛,其实不然。

    当我们在使用 IDE (如Eclipse,IDEA)时,当我们输入一个对象或类并想调用它的属性或方法时,一按点号,编译器就会自动列出它的属性或方法,这里就会用到反射。

    ?

    反射最重要的用途就是开发各种通用框架

      很多框架(比如 Spring )都是配置化的(比如通过 XML 文件配置 JavaBean,Action 之类的),为了保证框架的通用性,它们可能需要根据配置文件加载不同的对象或类,调用不同的方法,这个时候就必须用到反射——运行时动态加载需要加载的对象。

      对与框架开发人员来说,反射虽小但作用非常大,它是各种容器实现的核心。而对于一般的开发者来说,不深入框架开发则用反射用的就会少一点,不过了解一下框架的底层机制有助于丰富自己的编程思想,也是很有益的。

    ?获得class对象

    1.调用运行时类的本身的.class属性

    Class claszz1 = Person.class;
    sout(claszz1.getName());
    cs