Java基础_相关知识点总结

本文详细介绍了Java的基础知识,包括面向对象的三大特性(封装、继承、多态),JDK、JRE和JVM的区别,Java与C++的对比,以及线程、进程的概念。此外,还深入探讨了字符串处理(String、StringBuilder、StringBuffer)、异常处理、序列化、键盘输入方法、IO流和BIO、NIO、AIO的区别。内容涵盖Java编程的核心概念,适合初学者和进阶开发者参考。
摘要由CSDN通过智能技术生成

Java 基础 相关知识点总结

1 Java 基础

1.1 面向对象和面向过程的区别

  • 面向过程:性能比面向对象高。
  • 面向对象:类调用需要实例化,开销较大,比较消耗资源;封装、继承和多态的特性,可以设计出低耦合的系统,易维护、易复用、易扩展。

1.2 Java 的特点

  • 面向对象(封装、继承、多态)

  • 平台无关性( JVM 一次编译,随处运行)

  • 编译与解释并存

  • 动态性(自己编写的类、库中引入的类,运行时动态装载类)

  • 安全性和可靠性

1.3 JDK 、 JRE 和 JVM

  • JVM :运行 Java 字节码的虚拟机;在不同操作系统上的虚拟机,运行相同的字节码,会得到相同的结果。(一次编译,随处运行)
    • 字节码: .class 文件,只面向虚拟机使用。解决了传统解释型语言执行效率低的问题,同时保留了可移植的特点。
  • JRE :Java 运行时环境。 能够运行已经编译好的 Java 程序。包括有: JVM ,Java 类库,Java命令 和一些基础构件。不能创新程序
  • JDK : 是 Java 的 SDK(软件开发工具包)。包括有 JRE 、编译器 (javac) 和其他开发工具(javadoc 、 jdb ) 。能创建、编译程序

1.4 Java 和 C++ 的区别?

  • 都 面向对象 , 支持 封装、继承 和 多态;
  • Java 不提供 指针直接访问内存,内存更安全;
  • Java 类只能单继承,C++ 可多继承。 但是 Java 接口可以多继承;
  • Java 有 自动内存管理机制,不需要手动释放内存;
  • C语言,字符串或字符数组 有结束符 ’\0‘ ,Java 没有。(因为 Java 一切皆对象,有 length 属性)

1.5 Java 程序的主类? 应用程序和小程序的主类的不同?

  • 程序可以有多个类,但主类只有一个,是程序执行的入口。
  • Java应用程序中, 主类 指包含 main() 方法的类,不一定是 public ;
  • Java 小程序中,主类 是继承自系统类 JApplet 或 Applet 的子类,必须 public

1.6 Java 应用程序 和 小程序 的差别?

  • 应用程序: 从主线程启动(即 main()方法)
  • applet :在浏览器页面上运行(调用 init() 或 run() 启动)

1.7 Java 的数据类型

java 编程思想第四版: 2.2.2 节
java 的数据类型

1.8 重载 和 重写

  • 重载 :发生在 编译期。同一个类中,方法名相同;参数类型、个数和顺序不同;方法返回值和访问修饰符可以不同。(可以重载任何方法)总结:在同一个类中,使用同一个方法名,传入不同的参数类型,实现不同的逻辑处理。
  • 重写:发生在 运行期 。子类 对 父类的允许访问的方法的 实现过程 的重新处理。
    • 返回值类型、方法名、参数列表必须相同;
    • 抛出异常范围 不大于 父类,访问权限 不小于 父类;
    • 父类修饰符为 private、final、static 时,不能重写;
    • 构造方法不能重写

1.9 Java 面向对象编程三大特性 : 封装、继承、多态

  • 封装
    • 把一个对象属性私有化,对外提供访问的方法。(getter()| setter())
  • 继承
    • 使用已有的类为基础,建立新的类。(子类可以增加新属性或新方法;可以重写父类的方法,改变实现逻辑)
    • 子类 拥有 父类的所有属性和方法,私有属性和方法 拥有,不能访问;
  • 多态
    • 程序中定义的 引用变量 指向的具体类型,和 通过该引用变量发出的方法调用在编程时并不确定,在程序运行期间才确定。
    • 实现形式:继承(多个子类对父类方法的重写) 接口(多个类 实现接口,并覆盖接口中声明的方法)
    • 使用时:定义父类或接口的 引用 ,指向子类的对象。(Animal a = new Cat()😉
    • 多态成员访问特点:
      • 成员变量: 编译看 父类,运行看 父类;
      • 成员方法: 编译看 父类,运行看 子类;(实现 动态绑定
      • 静态方法: 编译看 父类,运行看 父类。

1.10 String\StringBuilder\StringBuffer 的区别? String 为什么不可变?

  • 可变性

    • String 类 有 final 修饰:
      • jdk 1.8 :private final char value[]
      • jdk 9 : private final byte[] value;
  • StringBuilder 和 StringBuffer 都继承自 AbstractStringBuilder 类,使用没有 final 修饰的 char value[],是可变的;

  • 线程安全性

    • String 对象不可变,可以视作常量,线程安全;
    • AbstractStringBuilder 类中定义了对字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法,其中:
      • StringBuilder 没有对方法进行 同步锁 ,非线程安全;
      • StringBuffer 对方法加了同步锁,线程安全;
  • 性能

    • String 对象的改变要生成新的对象;
    • StringBuffer 对对象本身进行操作;
    • StringBuilder 比StringBuffer 性能较好,但冒线程不安全的风险。
  • 总结:

    • 操作少量的数据: 适⽤ String
    • 单线程操作字符串缓冲区下操作⼤量数据: 适⽤ StringBuilder
    • 多线程操作字符串缓冲区下操作⼤量数据: 适⽤ StringBuffer

1.11 接口和抽象类的区别?

  • 接口方法默认 public ,方法只有声明,不实现;(Java 8 开始有默认实现)抽象类可以有非抽象方法(修饰:public、protected、default);
  • 接口只有 static 和 final 变量;抽象类不一定;
  • 一个类可以 实现多个 接口,但只能 继承一个 抽象类;
  • 从设计层面看:
    • 抽象 是对类的抽象,是 模板设计;
    • 接口 是对行为的抽象,是 行为规范;

总结⼀下 jdk7~jdk9 Java 中接⼝概念的变化(相关阅读):

  • 1.在 jdk 7 或更早版本中,接⼝⾥⾯只能有常量变量和抽象⽅法。这些接⼝⽅法必须由实现接⼝的类实现。
  • 2.jdk 8 的时候接⼝可以有 默认⽅法和静态⽅法 功能。
  • 3.Jdk 9 在接⼝中引⼊了 私有⽅法和私有静态⽅法。

1.12 成员变量和局部变量的区别?

  • 从语法形式看:
    • 成员变量属于类,可以被 public、private、static、final 等修饰;
    • 局部变量属于方法,只能被 final 修饰;
  • 从变量所在内存看:
    • static 的成员变量属于 类;其他成员变量属于 实例
    • 对象存于 堆内存; 局部变量是基本数据类型时,存于 栈内存;
  • 从变量生存时间看:
    • 成员变量 随对象的创建而存在;没有赋初值时会赋默认值;
    • 局部变量随方法的 调用 而自动消失;不会自动赋值。

1.13 静态方法 和 实例方法 的不同?

  • 调用静态方法时,可以使用 “ 类名.方法名” 和 “对象名.方法名”;
    • 可以无需创建对象;只能访问本类的 static 成员
  • 调用实例方法时,只能采用 “对象名.方法名”。

1.14 == 和 equals() 的区别?

  • == :判断两个 对象的地址 是否相等。
    • 对于 基本数据类型,判断的是值;
    • 对于 引用数据类型 ,比较的是内存地址;
  • equals() :判断两个 对象 是否相等;
    • 类没有重写 equals() 方法时:比较两个对象,等同于使用 == 在比较;
    • 重写 equals() 方法时:一般使其 比较两个 对象的内容 是否相等。

1.15 hashCode() 和 equals()

  • hashCode() : 获取 哈希码,也叫 散列码,是一个 int 数。它表示对象在 哈希表 中的索引位置。
    • 定义在 Object 类中,所以 Java 中的所有类都含有 hashCode() 函数。
  • hashCode()与 equals()的相关规定:
    • 1 两个对象使用 equals 相等,则 hashCode () 产生的值一定相同;
    • 2 两个对象相等,互相调用 equals() 都返回 true;
    • 3 两个对象使用 equals 不相等,不要求 hashCode 产生的值 不同;
    • 重写了 equals() 方法,就必须覆盖 hashCode() 方法。(否则不能满足规定1)

1.16 线程、进程的关系

**程序 **是含有指令和数据的文件,是静态的代码。

  • 进程 :是程序的一次执行过程,是系统分配资源的最小单位,拥有独立的内存单元;

  • 线程:是进程的一个实体,是CPU调度的基本单位;多个线程共享 它们所属于的进程的全部资源。

总结: 进程和线程是 操作系统不同的资源管理方式。 进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其他进程产生影响。线程知识进程中的一条执行路径,不同的线程有自己的栈和局部变量,但没有单独的地址空间。进程的切换耗费资源较大,效率较差。

1.17 线程的基本状态

  • 6 种不同的状态

线程的状态

  • 状态之间的转换

线程状态的转换

  • 线程创建之后它将处于 NEW(新建) 状态,调⽤ start() ⽅法后开始运⾏,线程这时候处于READY(可运⾏) 状态。

  • 可运⾏状态的线程获得了 cpu 时间⽚(timeslice)后就处于 RUNNING(运⾏) 状态。

  • 当线程执⾏ wait() ⽅法之后,线程进⼊ WAITING(等待) 状态。

  • 进⼊等待状态的线程需要依靠其他线程的通知才能够返回到运⾏状态,⽽ TIME_WAITING(超时等待) 状态相当于在等待状态的基础上增加了超时限制,⽐如通过 sleep(long millis) ⽅法或 wait(long millis) ⽅法可以将 Java 线程置于TIMED WAITING 状态。当超时时间到达后 Java 线程将会返回到 RUNNABLE 状态。

  • 当线程调⽤同步⽅法时,在没有获取到锁的情况下,线程将会进⼊到 BLOCKED(阻塞) 状态。

  • 线程在执⾏ Runnable 的run() ⽅法之后将会进⼊到 TERMINATED(终⽌) 状态。

1.18 Java 中的异常处理

  • Java 异常类 层次结构图
    异常类

  • 异常处理

    • try : 捕获异常,后面可以接零或多个 catch 块,没有catch 就必须接 finally
    • catch : 处理 try 捕获到的 异常
    • finally : 无论是否捕获到异常,都会执行 finally 块,并且会在 try 或catch块中的 return 语句之前执行。(因此可能会覆盖掉前面的 return 值)

1.19 Java 序列化中有些字段不想进行序列化,使用 transient 修饰。

  • 只能修饰变量,不能修饰类和方法。

1.20 键盘输入的两种方法

  • Scanner sc = new Scanner(System.in);

    String s = sc.nextLine();

  • BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    String s =br.readLine();

1.21 Java IO 流

io 流

io 流

1.23 BIO \ NIO \ AIO 区别

  • BIO: 同步阻塞 I/O ,数据的读写操作必须阻塞在一个线程内等待当前的操作完成。适用于 低负载、低并发的程序。
  • NIO: 同步非阻塞 I/O, java.nio 包中提供了 Channel 、Selector、Buffer 。适用于 高负载、高并发的(网络)应用。
  • AIO:异步非阻塞 I/O,是 NIO 的改进版。基于事件和回调机制实现。
    • 应用操作后会直接返回,不会阻塞等结果,而是后台处理完成后,操作系统会通知相应的线程进行后续的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值