美文网首页
Java基础

Java基础

作者: 小张同学_loveZY | 来源:发表于2018-08-19 21:51 被阅读0次

Java基础概述

名次释义:

  1. Java虚拟机(Java Virtual Machine)java运行的环境。
  2. 垃圾收集机制(Garbage Collection):由系统控制。
  3. JDK(Java Development Kit) Java开发工具包
  4. JRE(Java Runtime Environment) Java运行环境

Java 代码规则:

  1. 唯一入口 main的方法:固定格式:
    public static void main(String[] args){...}
  2. 一个 Java 源文件中最多只能有一个public类,且它必须是该类名命名
  3. Java中的名称命名规范:
    • 包名:xxxyyyzzz
    • 类名接口名:XxxYyyZzz
    • 变量名和函数名:xxxYyyZzz
    • 常量名:XXX_YYY_ZZZ

建议写代码的时候:先将自己的思想通过注释先整理出来,再用代码去体现

一些细节问题:

  • “+”可把非字符转换为字符串例如:
    System.out.println("5+5="+5+5); //打印结果是55
  • 如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。 但被模数是负数就另当别论。
  • Java语言中声明数组时不能指定其长度(数组中元素的数), 例如: int a[5]; //非法
  • java中的数组也是new出来的。 每个数组都有一个属性 length 指明它的长度,默认初始化为全0。
  • Java中多维数组不必须是规则矩阵形式:这里可以从其保存引用,而非预分配内存的角度思考。

面向对象

三大特征

  • 封装 (Encapsulation)
  • 继承 (Inheritance)
  • 多态 (Polymorphism)

封装:将函数(接口)和变量(属性)封装成class,对外开放接口、隐藏属性。

继承:实现了后扩展,精简了代码,使得后人在前人的基础上开发,并且已经搭设好的软件平台的业务逻辑不需要改动。

多态:父类引用指向子类对象,子类可能重写父类的方法,父类对象调用子类方法,从而扩展功能。并且不改动软件架构。

动态绑定:直到运行时确定绑定指定的类。现在具体类找,如果没有则在父类总找。
- 每次调用方法都要进行搜索,时间开销太大。
- 所以虚拟机预先为每个类创建一个方法表,在调用方法的时候,只需要查找这个表即可。

静态绑定:程序执行前已经被绑定。
- private: 所属的类绑定
- final: 定义final的父类绑定
- static:类绑定

构造方法: 这里一定注意,和C家族不一样,java没有析构方法。(但我记得有一个finally方法)。可以重载,且有复制构造方法、空参数构造方法。不能继承

this指针:对自身对象的引用。
super指针:指向父类。

访问控制
  • 覆盖方法不能使用比被覆盖方法更严格的访问权限
  • 覆盖方法必须和被覆盖方法具有相同的方法名称、参数列表和返回值类型
    子类对象实例化过程:


结论:

  1. super(…)和this(…)调用语句不能同时在一个构造函数中出现
  2. super(…)或this(…)调用语句只能作为构造函数中的第一句出现

x instanceof A:判断x是否为A类对象或者其子类对象。

高级类特性:

static 关键字
  • 类属性:先于main存在。可以用类名加方法名访问不存在this和super。
  • 类方法:只能访问静态变量。

静态代码块:静态初始化,在main开始之前,且只执行一次。

static {
    total = 100;//为total赋初值
}
final 关键字
  • final标记的变量(成员变量或局部变量)即成为常量,只能赋值一次。
  • final标记的类不能被继承。提高安全性,提高程序的可读性。
  • final标记的方法不能被子类重写。增加安全性。
  • final标记的成员变量必须在声明的同时或在每个构造方法中显式赋值,然后才能使用。
抽象类(abstract 关键字)
  1. 抽象方法:只有方法的声明,没有方法的实现。以分号结束
  2. 含有抽象方法的类必须被声明为抽象类。
  3. 不能用abstract修饰私有方法,构造方法,静态方法。不能被重写继承的方法。
接口(interface 关键字)
  • 接口(interface)是抽象方法和常量值的定义的集合。
  • 从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
  • 接口中的所有成员变量都默认是由public static final修饰的。
  • 接口中的所有方法都默认是由public abstract修饰的。接口没有构造方法。
  • 接口也可以继承另一个接口,使用extends关键字。

异常处理与集合:

异常类层次:

try-catch-finally语句:
try
{
    ......  //可能产生异常的代码
}
catch( ExceptionName1 e )
{
    ......  //当产生ExceptionName1型异常时的处置措施
}
catch( ExceptionName2 e )
{
    ......   //当产生ExceptionName2型异常时的处置措施
} 
finally{
    ......  //无条件执行的语句
} 
  • throws修饰方法:该方法可能抛出的异常。
  • throw在方法体中使用,抛出异常(抛出的类需继承自异常体系,可以自定义)。
  • 重写方法不能抛出比被重写方法范围更大的异常类型

Java 集合

Java 集合可分为 Set、List 和 Map 三种

  • Set:无序、不可重复的集合
  • List:有序,可重复的集合
  • Map:具有映射关系的键值对集合


  • Set 使用equals判断两个对象是否相同,而非 == 运算符
  • HashSet 按 Hash 算法来存储集合中的元素,因此具有很好的存取和查找性能
  • HashSet 具有以下特点:
    1. 不能保证元素的排列顺序
    2. HashSet不是线程安全的
    3. 集合元素可以使 null

hash:当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值,然后根据 hashCode 值决定该对象在 HashSet 中的存储位置。如果两个元素的 equals() 方法返回 true,但它们的 hashCode() 返回值不相等,hashSet 将会把它们存储在不同的位置,但依然可以添加成功。

因此重写 hashCode() 方法的应遵循以下基本原则:
  1. 在程序运行时,同一个对象多次调用 hashCode() 方法应该返回相同的值
  2. 当两个对象的 equals() 方法比较返回 true 时,这两个对象的 hashCode() 方法的返回值也应相等
  3. 对象中用作 equals() 方法比较的 Field,都应该用来计算 hashCode 值
ArrayList 和 Vector 是 List 接口的两个典型实现(细化下)
  • 区别:
    1. Vector是查询效率较低,通常建议使用 ArrayList
    2. ArrayList 是线程不安全的,而 Vector 是线程安全的。
    3. 即使为保证 List 集合线程安全,也不推荐使用 Vector
HashMap 和 Hashtable 是 Map 接口的两个典型实现类(细化)
  • 区别:
    • Hashtable 是一个古老的 Map 实现类,不建议使用
    • Hashtable 是一个线程安全的 Map 实现,HashMap 是线程不安全的。
    • Hashtable 不允许使用 null 作为 key 和 value,而 HashMap 可以

Collections 是一个操作 Set、List 和 Map 等集合的工具类

泛型枚举与注解:

泛型:(待补充)

分为泛型类和泛型方法,仅仅是数据类型不同,而业务逻辑相同。

优点:降低代码量,实现迟绑定。

枚举:

JDK 1.5 新增的 enum 关键字用于定义枚举类,枚举类和普通类的区别:

  • 使用 enum 定义的枚举类默认继承了 java.lang.Enum 类
  • 枚举类的构造器只能使用 private 访问控制符
  • 枚举类的所有实例必须在枚举类中显式列出( ,分隔 ;结尾). 列出的实例系统会自动添加 public static final 修饰
  • 所有的枚举类都提供了一个 values 方法, 该方法可以很方便地遍历所有的枚举值

Annotation(注解):

元数据:描述数据的数据。
三个基本的 Annotation:
  • @Override: 限定重写父类方法, 该注释只能用于方法
  • @Deprecated: 用于表示某个程序元素(类, 方法等)已过时
  • @SuppressWarnings: 抑制编译器警告.
    JDK 的元 Annotation 用于修饰其他 Annotation 定义

spring 与 spring boot中大量的使用了Annotation,因此关于本节内容,后面在框架中在详细总结。

IO与反射

File 类

File 能新建、删除、重命名文件和目录,但 File 不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。

IO 流体系
对象的序列化:

如果需要让某个对象支持序列化机制,则必须让的类是可序列化的,为了让某个类是可序列化的,该类必须实现如下两个接口之一:

  • Serializable
  • Externalizable
Class类
  • Class 对象只能由系统建立对象
  • 一个类在 JVM 中只会有一个Class实例
  • 每个类的实例都会记得自己是由哪个 Class 实例所生成
    常用方法:

    类加载:

    java的加载采用双亲依赖模式,使得虚拟机的java类一致。
Java反射机制主要提供了以下功能:
  • 在运行时构造任意一个类的对象
  • 在运行时获取任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的方法(属性)
  • 生成动态代理
  • 反射是动态代理的基础,动态代理可以实习AOP,从而增加代理工作


多线程与网络编程:

术语: 程序、进程、线程

创建多线程的方法:
  1. 继承 java.lang.Thread 类,重写 run方 法
  2. 实现java.lang.Runnable接 口,实现接口中的 run 方法
常用方法:
  • run方法:包括线程运行时执行的代码,通常在子类中重写它。
  • start方法:启动一个新的线程,然后虚拟机调用新线程的run方法
  • join 方法:指定的线程加入到当前线程,等其他线程结束后,继续该线程。不释放锁。
  • isAlive 方法:判断线程是否活着
  • wait()方法:中断方法的执行,使本线程等待,暂时让出 cpu 的使用权,释放锁
  • notify()方法:唤醒由于使用wait()方法而处于等待线程。
  • notifyall()方法:唤醒所有由于使用这个同步方法而处于等待的线程结束等待。
  • getPriority:获取当前线程的优先级
  • setPriority:设置当前线程的优先级

Java语言为线程类设置了10个优先级,分别使用1~10内的整数表示 ,整数值越大代表优先级越高。每个线程都有一个默认的优先级,主线程的默认优先级是5。

线程的运行状态
  • 新建态(New)
  • 就绪态(Runnable)
  • 运行态(Running)
  • 阻塞态/睡眠态(Blocking)
  • 死亡态(Dead)


synchronized关键字
  • 确保共享对象在同一时刻只能被一个线程访问,这种处理机制称为“线程同步”或“线程互斥”。Java中的“线程同步”基于“对象锁”的概念
  • 分为:同步方法、同步代码块。

网络编程:

客户端Socket的工作过程包含以下四个基本的步骤:
  1. 创建 Socket。根据指定的 IP 地址或端口号构造 Socket 类对象。
  2. 打开连接到 Socket 的输入/出流。 使用 getInputStream()方法获得输入流,使用 getOutputStream()方法获得输出流。
  3. 按照一定的协议对 Socket 进行读/写操作。通过输入流读取服务器放入线路的信息(但不能读取自己放入线路的信息),通过输出流将信息写入线程。
  4. 关闭 Socket。断开客户端到服务器的连接,释放线路


服务器程序的工作过程包含以下四个基本的步骤:
  1. 对于服务器和客户机而言,将上述第一步改为构造 ServerSocket 类对象,监听客户端的请求并进行响应。
  2. 调用 ServerSocket(int port) 创建一个服务器端套接字,并绑定到指定端口上。
  3. 调用 accept(),监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字。
  4. 调用 Socket类的 getOutputStream 和 getInputStream 获取输出流和输入流,开始网络数据的发送和接收。
  5. 最后关闭通信套接字。


JDBC

概念:java连接访问数据库的技术。hibernate、mybatis的基础。

JDBC为访问不同的数据库提供了一种统一的途径,为开发者屏蔽了一些细节问题

JDBC URL的标准由三部分组成,各部分间用冒号分隔。
  • jdbc:<子协议>:<子名称>
  • 协议:JDBC URL中的协议总是jdbc
  • 子协议:子协议用于标识一个数据库驱动程序
  • 子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化.
防范 SQL 注入

防范SQL注入需要对SQL语句预编译,因此JDBC使用PreparedStatement 取代 Statement,PreparedStatement 接口是 Statement 的子接口,它表示一条预编译过的 SQL 语句


DatabaseMetaData:包含数据源的各种信息。

ResultSetMetaData:包含结果集的各种信息。

事务的ACID(acid)属性:
  • 原子性:操作不可分割
  • 一致性:转态间跳转
  • 隔离性:事务间隔离
  • 持久性:提交即永久
数据库事务的隔离级别:
  • 脏读: 对于两个事物 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.
  • 不可重复读: 对于两个事物 T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了.
  • 幻读: 对于两个事物 T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行.

默认为:REPEATABLE READ
JDBC的批量处理语句包括下面两个方法:
  • addBatch(String):添加需要批量处理的SQL语句或是参数;
  • executeBatch();执行批量处理语句;
通常我们会遇到两种批量执行SQL语句的情况:
  • 多条SQL语句的批量处理;
  • 一个SQL语句的批量传参;
数据库连接池:避免大量的建立连接、关闭连接的消耗。
DataSource 通常被称为数据源,它包含连接池和连接池管理两个部分:
  • DBCP 数据库连接池
  • C3P0 数据库连接池

相关文章

  • Java 基础

    Java 基础01Java开发入门 Java 基础02Java编程基础 Java 基础03面向对象 Java 基础...

  • 技术体系

    一,java核心 java基础,jvm,算法,多线程,设计模式 Java基础:java基础相关,全栈java基础 ...

  • 面试题汇总

    1.Java基础面试问题 Java基础之基础问题 Java基础之面向对象 Java基础之数据结构 Java基础之I...

  • 【Android】知识点汇总,坚持原创ing

    Android基础 Java基础 Java基础——Java内存模型和垃圾回收机制 语法基础 语法基础——C语法基础...

  • Java基础:反射

    反射注解动态代理相关阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 ...

  • Java基础:注解

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 1. 概述 注解...

  • Java基础:动态代理

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 概述 在运行时,...

  • Java 集合类原理

    Java基础——HashMap源码分析 Java基础——HashSet源码分析 Java基础——HashTable...

  • Java基础:类加载器

    系列阅读 Java基础:类加载器 Java基础:反射 Java基础:注解 Java基础:动态代理 1. 什么是类加...

  • java基础(一)-String、StringBuffer、St

    java基础-String、StringBuffer、StringBuilder java基础小白,初学java,...

网友评论

      本文标题:Java基础

      本文链接:https://www.haomeiwen.com/subject/cqlqiftx.html