目录
- 计算机、程序和Java概述
- 计算机组成
- 基本程序设计
- 标识符
- 数值数据类型
- 格式化控制台输出
- 输入输出重定向
- 输入重定向
- 输出重定向
- 输入输出重定向
- 方法重载
- 变量的范围
- 数组
- 声明数组变量
- 创建数组
- 初始化数组
- 可边长参数
- 二维数组
- 静态变量、常量和方法
- 静态变量
- 限定字符串
- StringBuilder和StringBuffer
- 继承
- 方法重载和重写
- 多态
- 动态绑定
- 访问修饰符
- 异常处理和文本I/O
- File类
- 使用Try-with-resource自动关闭资源
- 抽象类和接口
- 抽象类
- 接口
- 接口与抽象类的比较
- 类的设计原则
- 小结
- 内部类
- 内部类特征
- 匿名内部类
- 匿名内部类的特征
- 二进制I/O
- 二进制I/O类(字节流)
- FileInputStream & FileOutputStream
- DataInputStream & DataOutputStream
- BufferedInputStream & BufferedOutputStream
- ObjectInputStream & ObjectOutputStream
- 随机访问文件
- 递归
计算机、程序和Java概述
计算机组成
- 中央处理器(cpu)
- 内存(主存)
- 存储设备
- 输入设备
- 输出设备
- 通信设备
基本程序设计
标识符
标识符必须遵循一下规则:
- 标识符是由字母,数字,下划线(_)和美元符号($)构成的字符序列
- 标识符必须以字母,下划线和美元符号开头,不能以数字作为开头
- 标识符不能是保留字
- 表示符不能是 true,false 和 null
- 标识符的长度可以为任意
数值数据类型
类型名名称 | 范围 | 存储大小 |
---|---|---|
byte | -27(-128) ~ 27-1(127) | 8位带符号数 |
short | -215(-32 768) ~ 215-1(32 767) | 16位带符号数 |
int | -231(-2 147 483 648) ~ 231-1(2 147 483 647) | 32位带符号数 |
long | -263(-9 223 372 036 854 775 808) ~ 263-1(9 223 372 036 854 775 807) | 64位带符号数 |
float | 负数范围:-3.4028235E+38 ~ -1.4E-45 正数范围: 1.4E-45 ~ 3.4028235E+38 | 32位,标准IEEE745 |
double | 负数范围:-1.7976931348623157E+308 ~ -4.9E-324 正数范围: 4.9E-324 ~ 1.7976931348623157E+308 | 64位,标准IEEE745 |
格式化控制台输出
输出宽度最少为10,如果不够10位则在前面加对应的空格,如:
126.041631654
%.2f 取小数点后两位,126.04
目前长度为6,则在输出的126.04前添加4个空格
double number = 126.041631654
System.out.printf("This is number: %10.2f",number);// 输出
This is number: 126.04
// 正数表示右对齐
System.out.printf("%10s%10s%10s%10s\n","name","sex","age","id_num");
// 负数表示左对齐
System.out.printf("%-10s%-10s%-10s%-10s","name","sex","age","id_num");// 输出name sex age id_num
name sex age id_num
输入输出重定向
- Redirection .java
import java.util.Scanner;
public class Redirection {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int data = scanner.nextInt();int sum = 0;while (data != 0){sum += data;data = scanner.nextInt();}System.out.println("The sum is: " + sum);}
}
- input.txt
1 2 3 4 5 6
7 8 9 10 0
输入重定向
javac Redirection.java
java Redirection < input.txt# 输出
The sum is: 55
输出重定向
java Redirection > output.txt# 将结果写入到output.txt中
The sum is: 55
输入输出重定向
java Redirection < input.txt > output.txt# 读取input.txt中的内容,然后将结果写入到output.txt中
The sum is: 55
方法重载
- 在同一个类中
- 具有相同的方法名
- 参数列表不同(类型,个数,顺序不同),与返回值无关
变量的范围
- 局部变量
数组
声明数组变量
elementType[] arrayRefVar;
创建数组
arrayRefVar = new elementType[arraySize];
初始化数组
elementType[] arrayRefVar = {value0,value1,value2,.......,valueN};
可边长参数
typeName... parameterName
二维数组
int[][] matrix;
matrix = new int[5][5];
静态变量、常量和方法
静态变量被类中的所有对象共享,静态方法不能访问类中的实例成员
静态变量
静态变量将变量存储在一个公共的内存地址
限定字符串
String类型的对象是不可变得,如果两个直接字符量相同的话,他们都会指向同一个String类型的对象中,这个独特的对象称之为限定字符串对象
StringBuilder和StringBuffer
-
String与StringBuilder和StringBuffer的区别
String是不可变的字符串,而StringBuilder和StringBuffer都是可边的字符串,相比String它们二者更加灵活 -
StringBuilder和StringBuffer的区别
两者基本是一样的,除了StringBuffer中修改缓冲区的方法是同步的,这就意味着如果是并发访问的话,StirngBuffer可以同步防止程序崩溃
继承
super关键字
- 调用父类的构造方法(调用构造方法的时候,必须放在子类构造方法的第一行)
- 调用父类的方法
方法重写:需要在子类中使用和父类一样的签名,以及相同的返回值类型进行定义
静态方法:静态方法可以被继承,但是不能够被重写,如果子类中定义了相同的方法,那么父类的静态方法将会隐藏起来,可以使用superClassName.staticMethonName调用隐藏的静态方法
方法重载和重写
重载意味着使用同样的名字但是不同的签名来定义多个方法。
重写意味者在子类中提供一个对方法的新的实现。
多态
多态意味着父类的变量可以指向子类对象
动态绑定
访问修饰符
异常处理和文本I/O
File类
使用Try-with-resource自动关闭资源
try(需要打开的资源;) {操作}
// try-with-resourcetry(PrintWriter printWriter = new PrintWriter(file);) {printWriter.print("John T Smith ");printWriter.println(90);printWriter.print("Eric K Jones ");printWriter.println(85);}// 上下等价PrintWriter printWriter = new PrintWriter(file);printWriter.print("John T Smith ");printWriter.println(90);printWriter.print("Eric K Jones ");printWriter.println(85);printWriter.close();
抽象类和接口
抽象类
抽象类不可用于创建对象。抽象类可以包含抽象方法,这些方法将在具体的子类中实现
- 抽象方法不能包含在非抽象类中。如果抽象父类的子类不能实现所有的抽象方法,那么子类也必须定义为抽象的。换句话说,在抽象类扩展的非抽象子类中,必须实现所有的抽象方法。还要注意到,抽象方法是非静态的
- 抽象类是不能使用 new 操作符来初始化的。但是,仍然可以定义它的构造方法,这个构造方法在它的子类的构造方法中调用
- 包含抽象方法的类必须是抽象的。但是,可以定义一个不包含抽象方法的抽象类。在这种情况下,不能使用 new 操作符创建该类的实例。这种类是用来定义新子类的基类的
- 子类可以覆盖父类的方法并将它定义为 abstract。这是很少见的,但是它在当父类的方法实现在子类中变得无效时是很有用的。在这种情况下,子类必须定义为abstract
- 即使子类的父类是具体的,这个子类也可以是抽象的。例如,Object 类是具体的,但是它的子类如 CeometricObject 可以是抽象的
- 不能使用 new 操作符从一个抽象类创建一个实例,但是抽象类可以用作一种数据类型
接口
接口是一种与类相似的结构,只包含常量和抽象方法
- 接口定义
修饰符 interface 接口名{/** 常量声明 *//** 方法签名 */
}
- 接口的继承
利用关键字 extends, 接口可以继承其他接口。这样的接口称为子接口(subinterface)。
public interface NewInterface extends Interface1,Interface2,...InterfaceN{}
接口与抽象类的比较
类的设计原则
-
内聚性
类应该描述一个单一的实体,而所有的类操作应该在逻辑上相互配合,支持一个一致的目的。例如:可以设计一个类用于学生,但不应该将学生与教职工组合在同一个类中,因为学生和教职工是不同的实体 -
一致性
遵循标准 Java 程序设计风格和命名习惯。为类、数据域和方法选取具有信息的名字。通常的风格是将数据声明置于构造方法之前,并且将构造方法置于方法之前 -
封装性
一个类应该使用 private 修饰符隐藏其数据,以免用户直接访问它。这使得类更易于维护 -
清晰性
为使设计清晰,内聚性、一致性和封装性都是很好的设计原则。除此之外,类应该有一个很清晰的合约,从而易于解释和理解 -
完整性
类是为许多不同用户的使用而设计的。为了能在一个广泛的应用中使用,一个类应该通过属性和方法提供多种方案以适应用户的不同需求 -
实例和静态
依赖于类的具体实例的变量或方法必须是一个实例变量或方法。如果一个变量被类的所有实例所共享,那就应该将它声明为静态的 -
继承与聚合
继承和聚合之间的差异,就是 is-a (是一种)和 has-a (具有)之间的关系 -
接口和抽象类
接口比抽象类更加灵活,因为一个子类只能继承一个父类,但是却可以实现任意个数的
接口
小结
- 抽象类和常规类一样,都有数据和方法,但是不能用 new 操作符创建抽象类的实例
- 非 抽 象 类 中 不 能 包 含 抽 象 方 法。如果抽象类的子类没有实现所有被继承的父类抽象方法,就必须将该子类也定义为抽象类
- 包含抽象方法的类必须是抽象类。但是,抽象类可以不包含抽象的方法
- 即使父类是具体的,子类也可以是抽象的
- 接口是一种与类相似的结构,只包含常量和抽象方法。接口在许多方面与抽象类很相近,但抽象类除了包含常量和抽象方法外,还可以包含变量和具体方法
- 在 Java中,接口被认为是一种特殊的类。就像常规类一样,每个接口都被编译为独立的字节码文件
- 接口 java.lang.Comparable 定义了 compareTo 方法。Java 类库中的许多类都实现了 Comparable
- 接口 java.lang.Cloneable 是一个标记接口。实现 Cloneable 接口的类的对象是可克隆的
- 个类仅能继承一个父类,但一个类却可以实现一个或多个接口
- — 个接口可以继承一个或多个接口
内部类
内部类,或者称为嵌套类,是一个定义在另外一个类范围中的类。内部类对于定义处理器类非常有用
内部类特征
- — 个内部类被编译成一个名为 OuterClassName$InnerClassName 的类
- 一个内部类可以引用定义在它所在的外部类中的数据和方法。所以,你没有必要将外部类对象的引用传递给内部类的构造方法。基于这个原因,内部类可以使得程序更加精简
- 一个内部类可以使用可见性修饰符所定义,和应用于一个类中成员的可见性规则一样
- 一个内部类可以被定义为 static。一个 static 的内部类可以使用外部类的名字所访问。一个 static 的内部类不能访问外部类中非静态的成员
- 内部类对象通常在外部类中所创建。但是你也可以从另外一个类中来创建一个内部类的对象。如果内部类是非静态的,你必须先创建一个外部类的实例,然后使用以下语法来创建一个内部类的对象:
OuterClass.InnerClass innerObject = outerObject.new InnerClass();ControlCircle controlCircle = new ControlCircle();
ControlCircle.CirclePane circlePane = controlCircle.new CirclePane();
- 如果内部类是静态的,使用以下语法来创建一个内部类对象:
OuterClass.InnerClass innerObject = new OuterClass.InnerClass();
匿名内部类
一个匿名内部类是一个没有名字的内部类。他将一步实现定义一个内部类以及创建一个内部类的实例
new SuperClassName/InterfaceNameO {
// Implement or override methods in superclass or interface// Other methods if necessary
}
匿名内部类的特征
- — 个匿名内部类必须总是从一个父类继承或者实现一个接口,但是它不能有显式的extends 或者 implements 子句
- 一个匿名内部类必须实现父类或者接口中的所有抽象方法
- — 个匿名内部类总是使用它父类的无参构造方法来创建一个实例。如果一个匿名内
部类实现一个接口,构造方法是 Object() - 一个匿名内部类被编译成一个名为 OuterClassNameSn.class 的类。例如,如果外部类 Test 有两个匿名的内部类,它们将被编译成 Test$1.class 和 Test$2.class
二进制I/O
二进制I/O类(字节流)
FileInputStream & FileOutputStream
FilelnputStream 类和 Fi1eOutputStream 类用于从/向文件读取/写人字节。它们的所有方法都是从I叩utStream 类和 OutputStream 类继承的
- FileInputStream构造方法
- FileOutputStream构造方法
DataInputStream & DataOutputStream
DatalnputStream 从数据流读取字节,并且将它们转换为合适的基本类型值或字符串。DataOutputStream 将基本类型的值或字符串转换为字节,并且将字节输出到数据流。
- DataInputStream
- DataOutputStream
BufferedInputStream & BufferedOutputStream
BufferedlnputStream 类和 BufferedOutputStream 类可以通过减少磁盘读写次数来提髙输人和输出的速度。使用 Bufferdl叩utStream 时,磁盘上的整块数据一次性地读入到内存中的缓冲区中。然后从缓冲区中将个别的数据传递到程序中
- BufferedInputStream构造方法
- BufferedOutputStream构造方法
ObjectInputStream & ObjectOutputStream
ObjectlnputStream 类和 ObjectOutputStream 类除了可以实现基本数据类型与字符串的输人和输出之外,还可以实现对象的输人和输出
-
ObjectInputStream
-
ObjectOutputStream
随机访问文件
Java 提供了 RandomAccessFile 类,允许在文件的任意位置上进行读写。使用 RandomAccessFile 类打开的文件称为随机访问文件
注:
当创建一个 RandomAccessFile 时,可以指定两种模式( “r”或"rw") 之一。模式"r"表
明这个数据流是只读的,模式"rw"表明这个数据流既允许读也允许写
RandomAccessFile raf = new RandomAccessFi1e("test.dat", "rw"):
递归
递归方法就是直接或间接调用自身的方法