Java 语言基础知识

1、java 发展历程

1998年,Sun 公司发布 jdk1.2 ,该版本将 java 分为 J2SE、J2EE、J2ME 三类。

2014年,Sun公司发布 jdk1.8

2、一次编译,各处运行

先编译成 .class文件,再解释执行。

3、基本数据类型与表达式

文字量:文字量直接出现在程序中并被编译器直接使用,如 30.

标识符:标识符是一个名称,以字母或下划线或美元符号开头。

变量:一个由标识符表示的项,变量的值可以被改变。

内置数据类型

  • byte

  • short

  • int

  • long

  • float

  • double

  • boolean : 表示一个逻辑量,仅有两个取值:true或false

字符型

字符串:java的基本数据类型没有字符串类型,在java 中使用 String 类来定义字符串。如 String s = "hello".

运算符:算术运算符、赋值运算符、关系运算符、逻辑运算符、条件运算符(三目运算符)。

类型转换

  • 扩展转换:从低位向高位转换

  • 窄化转换:从高位向低位转换

  • 隐含转换:有赋值转换、方法调用转换、字符串转换三种

  • 显式转换:强制类型转换

4、数组

数组的概念:由同一类型的对象或数据构成,并封装在同一标识符下。

在 Java 中数组是对象,需要动态初始化。,可以赋值给 Object 类型的变量,数组中的变量称为数组元素

数组的创建与使用

数组引用的声明:如int[] name 或 int name[] ,两者是等效的。

数组的创建:

用关键字 new 构成数组的创建方式。

创建实例:

int[] ai;
ai = new int[10];

数组初始化:

int[] a = {1,2,3,4,5};

使用数组:使用 arrayName[index],可以通过 arrayName.length() 获得数组长度。

数组名只是一个引用

复制数组元素使用 System.arrayCopy() 方法

多维数组

定义二维数组的方式如下:

1、int[][] myArray;

2、int[][] myArray = new int[3][5]

3、int[][] myArray = {(1,2,3),(2,3,1,)}

java 里面二维数组的长度指的是它的行数

java 里面的二维数组就是由一维数组构成的数组。

5、算法的流程控制

if 语句:1、只有 if 语句;2、单个 if-else 结构;3、多个 if-else 结构

简单的 if-else 语句可以使用条件语句来替换。

switch 语句

for 语句:是 Java 三个循环语句中功能最强大的一个,使用最广泛的一个。

增强 for 循环:用来针对数组或集合对象进行遍历。

语法格式:

for(Type name: 数组或集合类型对象){
      //循环体;
}

while: 先判断再循环

do-while:先循环再判断

break 语句:跳出循环,不再执行剩余部分。

continue 语句:停止本次循环,开始下一次循环。

6、类的声明与对象的创建

类是对一类对象的描述,对象是类的具体实例。

class:表示这是一个类

extends: 继承的关键字

implements: 实现接口的关键字

public:公有类

对象引用声明

7、在类里面声明数据成员

数据成员:表示对象的状态。

如:

public static int a; // 这是一个类变量
public String s;
  • static 指明这是一个类变量(静态成员变量),在类初始化时就被同时赋值。

  • final 指明这是一个不可被修改的量

实例变量:没有static修饰的变量,存储所有实例都需要的属性。

8、在类中定义方法成员

类中的方法分为:1、类方法;2、实例方法

返回类型

参数类型

方法体

实例方法:用来表示每个对象的功能或行为

实例方法的调用格式:

<对象名>.<方法名>(实参列表)

参数传递

  • 值传递: 参数类型为基本数据类型时

  • 引用传递:参数类型为对象或数组时

类方法(静态方法)

  • 声明时需要使用 static 关键字修饰

  • 不能被声明为抽象的

  • 可以类名直接调用,也可以使用实例调用

可变长参数

使用三个省略号表示,其实质就是数组

String... s,相当于 String[] s

9、包

包的作用

  • 将相关的源代码文件组织在一起

  • 类名的空间管理,用来避免命名冲突的问题。

  • java 中包名使用小写字母表示

  • 建议使用公司域名的反序作为包名,如com.google

包的声明: 如,package 包名

包的引入

使用 import 语句引入所需的包, java 编译器为所有程序自动引入包 java.lang

静态引入

  • 单一引入:引入某一个指定的静态成员。

  • 全体引入:引入所有的静态成员。

10、类的访问控制权限

private:只能被同一类中访问

public: 可以被不同包,不同父类的访问

get方法:获取属性变量的值

set方法:修改属性变量的值

this关键字

11、对象初始化

使用构造方法对对象进行初始化。

构造方法

  • 方法名与类名相同

  • 不定义返回类型

  • 通常被定义为 public (公有的)

  • 可以有任意多个参数

  • 主要作用是完成对象的初始化工作

  • 在生成一个对象时,自动调用构造方法来对新对象进行初始化

默认构造方法

  • 没有参数(内部类除外)

  • 对象的属性值默认为零或空

自定义构造方法与方法重载

  • 在生成一个对象时,给构造方法传送初始值,为对象进行初始化

  • 构造方法可以被重载:通过参数列表来比对,调用不同的构造方法

  • 只要显式的声明了一个构造方法,就不再使用默认的构造方法。

final变量的初始化

  • 实例变量和类变量都可以被声明为final

  • final实例变量可以在类中定义时给出初始值。

12、内存回收

对象的自动回收

  • 无用对象:离开了作用域的对象,无引用指向的对象

finalize()方法:

  • 在类java.lang.Object中声明,因此,java的每个类都有这个方法。

  • 用于释放资源

  • 类可以重写finalize()方法

  • finalize()方法可能以任何的次序执行

13、应用实例

一个银行账户的实例。

DecimalFormat类:该类位于 java.text 包下,作用是将输出数据进行格式化。

14、类的继承的概念和语法

类继承的概念

  • java 只支持单继承,每个子类只能有一个超类(父类)

  • 超类是所有子类的共有属性及方法的集合,子类则是超类的特殊化

  • 继承可以提高代码的可重用性

子类对象:包含着超类的所有属性和方法,以及子类特有的方法

继承的语法,如下:

pubilc class Son extends Father{
}

父类中的私有变量被继承到子类后,是不能被直接访问的,除非父类中有访问该私有变量的方法。

15、隐藏和覆盖

也就是重写 @override

属性的隐藏:子类中声明了与超类中相同的成员变量名

  • 从超类中继承的变量将被隐藏

  • 当子类执行继承自超类的操作时,处理的是继承自超类的变量,反之则是处理的是子类的变量。

访问被隐藏的超类属性

  • 调用从超类继承的方法,则操作的是从超类继承的属性

  • 使用关键字 super,来访问超类中的属性。

  • 静态成员不被继承,不属于任何一个对象,但可以被所有子类访问

必须被重写的方法:派生类必须重写基类中的抽象方法

****:被 final、static 修饰的方法不能被重写

16、Object 类

Object 类是其他所有类的直接或间接超类。

Object 类的主要方法

  • getclass() :获取当前对象所属的类信息

  • toString():

...

相等与同一

  • 两个对象具有相同的类型,及相同的属性值,则称两者相等。

  • 如果两个引用变量指向同一个对象,则两个引用同一。

hashCode() 方法: 返回对象的散列码

如果依据 equals()方法两个对象相等,则两个对象的散列码应该是相同的。

clone()方法:使用 clone 方法复制对象。

finalize() 方法: 在对象被垃圾回收器回收之前,系统自动调用对象的 finalize 方法。

getClass( 方法):返回一个 class 对象,用来代表对象所属的类。

notify、notifyAll:与线程有关的方法

17.接口

接口不规定方法的主体;接口中可以有数据成员,但默认是 static 或 final 类型。

接口的作用

  • 继承多个设计

  • 建立类与类之间的“协议”

  • 在不同类之间实现常量的共享

接口的语法

public interface 接口名 {
 // 方法的原型或静态变量
}

接口中的方法,默认是 abstract 或者 final 。

接口不能被实例化,只能被实现。且接口可以被多重继承。

实现接口

如:

public class 类名称 implements 接口名1,接口名2{
 // 重写接口中的方法。
}

接口的扩展:接口与接口之间,也可以继承,有超接口与子接口之分。

如:

interface 子接口 extends 父接口{
 // 
}

18、类型转换

类型转换规则

  • 基本类型转换: 将一个值转换成另一个值

  • 引用类型转转:引用之间的转换必须有继承关系或者接口的实现关系,将引用转换为另一个类型的引用,并不改变对象本身的类型

  • 当一个引用被转换为超类的引用后,通过它能够访问的服务接口只能是超类中有的方法。

隐式类型的转换

  • 基本类型转换:自动将低位转换为高位

  • 引用变量:被转换成更一般的类,如将子类的引用转换成超类的引用。或转换成更一般的接口。

显式类型的转换

  • 基本数据类型:高位转换为低位

  • 引用变量:将超类的引用转转为子类的引用。

类型转换的应用场合

  • 赋值转换:两个不同类型进行赋值需要进行转换

  • 方法调用转换:将实参的类型转换为形参的类型

  • 算术表达式转换:将不同类型转换成相同类型再计算

  • 字符串转换:将其他类型转换为字符串类型

19、多态的概念

不同类型的对象可以响应相同的消息,响应行为可以不同。

实现同一接口的不同类型的对象,可以被当做同一类型的对象来对待。

绑定

  • 早绑定:在程序运行之前就实现绑定

  • 晚绑定:也称为动态绑定。

20、输入/输出流的概念

预定义的 I/O 流类:

  • 面向字符的流:用于处理字符数据

  • 面向字节的流:用于一般的目的

面向字符的流: 源和目标是文本文件,Reader 和 Writer 类是所有字符流的超类。

面向字节的流: InputStream 和 OutputStream 类是所有字节流的超类

标准输入输出流

按类型输入输出数据

  • printf 方法 :System.out.printf()

  • Scanner 方法:

21、写文本文件

  • 使用 FileWriter 类写入数据到文本文件中。

  • 使用 BufferWriter 类写入数据到文本文件。

22、读文本文件

  • 使用 FileReader, 文件读取流

  • 使用 BufferReader, 缓冲读取流

23、主要接口与常用的实现类

Set 接口 : SortedSet 类 和 TreeSet 类

List 接口: Vector 类和 ArrayList 类

Queue 接口

Map 接口:HashMap 类和 TreeMap 类

24、常用算法

排序算法 sort: 使 List 元素按照某种次序排序。

洗牌算法 shuffle: 以随机方式重排 List 元素。

reverse: 反转算法

copy: 两个 List 之间的复制。

binarySearch: 二分法查找算法。

min、max:返回指定集合的最小值和最大值。

25、数组实用方法

Arrays 类:定义了一组有关数组的方法

  • fill : 给数组填充

  • equals: 判断数组相等

  • sort: 数组排序

  • binary:使用二分法查找数组元素

26、基于动态数组的集合类型

Voctor, ArrayList:

  • 实现了 Collection 接口

  • 能够存储相同类型的对象

  • 不能存储基本数据类型的数据

  • 其容量可自动扩充

  • 添加元素效率较高

  • Voctor : 是集合框架中的遗留类,线程安全

  • ArrayList :非同步的,效率较高。

鼓励使用ArryList

27、遍历 Collection

1、通过 Enumeration 及 Iterator 遍历: 优先选用 Iterator 遍历集合。

2、使用增强 for 循环遍历

3、通过聚集操作遍历

28、Map 接口及其实现

Map 接口意义: 用于存储键值对 (key-value)

主要有 HashMap 和 TreeMap 两个类。

**哈希表 HashMap **: 根据哈希函数计算出对象的位置。

哈希表的容量不是固定的,可以扩充。

每天学习一点点,每天进步一点点。

原文地址:https://www.cnblogs.com/youcoding/p/13405526.html