前言
此篇文章主要总结一些 Java 面向对象程序设计的基本知识,是对 Java 学习中的一些基本的、较为简单的知识的一个全面总结与回顾。内容主要是一些各程序语言基本通用的基础知识,以及简单的面向对象编程的基本知识。会列出一些需要掌握的重点。
全篇以总结为主,主要对一些细节加以提醒,不会过于深入。
一、基本程序设计结构
1.数据类型
Java 共有 8 种基本类型,分别是 4 种整型(int、short、long、byte),2 种浮点型(float、double),1 种字符类型(char)和 1 种 boolean 类型。
Java 中的整型所占字节数与平台无关,是固定的。
类型 | 存储需求(字节) |
---|---|
int | 4 |
short | 2 |
long | 8 |
byte | 1 |
L 或 l 后缀表示 long 型,0X 或 0x 前缀表示十六进制,0 前缀为八进制。从 Java 7 开始,0b 或 0B 前缀表示二进制,支持数字加下划线以便于阅读(eg. 100_000_000 , 0B1111_1010)
Java没有无符号 (unsigned) 形式的类型。
浮点型大都采用 double 型 (8 字节),使用 float 型 (4 字节)的情况较少。float 型数有后缀 F 或 f 。
Java提供大数值类型用来处理 int 和 double 精度不够要求的情况。
char 型和 boolean 型不多赘述。
2.变量与常量
变量声明之后,必须进行显式初始化后才能使用。变量的声明尽量靠近其第一次使用的地方,但是要注意变量的作用域问题。
常量用 final 关键字来指示,常量一旦被赋值,就不能更改。常量名一般全为大写。常量加 static 修饰,则为类常量,需定义在 main 方法外部,可供同类的多个方法使用。再加 public 修饰,则其他类的方法也可以使用。
C语言用来定义常量的 const 在Java中没有使用,但是是保留的关键字。
3.运算符
算术运算符(包括自增、自减和赋值结合运算符)和逻辑运算符常规使用即可。/ 运算两边都为整数时,是整数除法。
位运算有 ^ ~ & | << >> >>> 。|和& 也可以用在布尔值上,>>> 会在高位补 0。
枚举类型实际上是一个类类型。比较时,不使用 equals 直接使用 ==。
4.字符串
字符串类型是引用类类型。
使用 substring 方法可获得子串,一个参数时截取索引之后(含)的字符串(索引从 0 开始),两参数则截取两参数之间(含第一个索引,不含第二个索引)的字符串 且长度为 end - begin;
String s1 = "hello!";
String s2 = s1.substring(2); //s2="llo!"
String s3 = s1.substring(1,3); //s3="el",长度为 (3-1=2)
使用 equals 方法检测字符串是否相等( s.equals(t) ),两边也可以是字符串字面量("hello"形式),比较时不区分大小写可使用 equalsIgnoreCase 方法,== 运算符只检测两字符串是否存储在同一位置,不进行检测是否相等。
StringBuilder 类用于缓存字符串,添加时调用 appends 方法,完成后使用 toString 方法即可得到一个 String 对象。
5.输入输出
标准输出流调用System.out.println 及相关方法即可(Java 5 之后提供了 C 语言的格式化输出 printf )。
输入需要先构造一个 Scanner 对象,并与“标准输出流” System.in 关联。
Scanner in = new Scanner (System.in);
然后调用相关方法即可进行输入。
String name = in.nextln
nextln 用于读取一行,next 读取下一单词(空格间隔),nextInt 读取下一整数等。
文件读取需要用 File 对象构造一个 Scanner 对象,如下:
Scanner in = new Scanner(Paths.get("myfile.txt"),"UTF-8");
文件名中包含反斜杠时,需要额外加一个反斜杠。
写入文件时,需要构造一个 PrintWriter 对象:
PrintWriter out = new PrintWriter("myfile.txt","UTF-8");
文件不存在时将创建一个文件。可以像 System.out 一样使用 print、println 和 printf 命令。
6.控制流程
Java 中,不能在嵌套的块(block)中声明同名的变量,但 C++ 中允许这么做。
条件语句(if else)和 while / do while 循环常规使用。for 循环注意语句内定义的变量不能在循环体之外使用。
switch 语句用于处理多重循环,但较易出错,不推荐使用。格式如下:
int i=3
switch (i)
{
case 1 : statement1 ; break ;
case 2 : statement2 ; break ;
default : statement3 ; break;
}
执行时依次将小括号的值(i)和case
的值匹配,成功则执行对应语句,若都不能匹配则执行默认语句(default),没有 default
则不执行。
case 后的匹配值可以有多种类型,但必须是常量表达式。
break 语句作用是跳出语块,匹配成功并执行语句后,如果没有 break,则会继续执行后续的语句(不管有没有和 case 匹配),直到遇到 break 语句终止。
break
语句和 continue
语句可以用来跳出循环,continue
跳出本次循环,break
终止循环。两者配合标签使用可以达成 goto 语句的效果。
7.数组
数组初始化有两种方法,可以显示赋值,也可以 new 运算符创建
int[] a = new int[100]; //要确定数组大小
for each循环可以方便地遍历数组。
int[] arr = {1,2,3,4,5};
for(int b : arr){
System.out.println(b);
}
数组可以直接赋值拷贝到另一个数组中,这时它们两个引用同一个数组,改变一个数组中的元素,另一个数组也随之改变。可以使用 Arrays.copyOf
方法将数组的值拷贝到另一数组,第二个参数来确定新数组大小,可以利用这个来增加(减小)数组大小。
int[] copyArr = Arrays.copyOf(arr,7);//增加了两个容量
main 方法中的 String[] args 数组是用来接收命令行参数的。比如,一般命令行运行程序命令为 java calssName
,可以将命令添加参数,如:java className hello world
此时 args 数组将有值,args[0]:hello ,args[1]:world。
二、面向对象程序设计概述
对象变量只是引用了一个对象,没有实际包含对象。
构造器与类同名,可以有多个(以参数的个数、类型来区分),没有返回值。
可以将实例域定义为 final ,构建对象时必须初始化这样的域,并且不能再被更改。
静态域和静态方法
static
修饰符将确定静态域和静态方法。
静态域属于类,所有对象都有相应的拷贝。静态常量使得常量可以直接通过类访问,而不需要构造对象。比如说 Math
类中的 PI
,可以直接通过 Math.PI
获得而不用构造 Math 的实例。
静态方法是一种不能向对象实施操作的方法,一般有两种情况使用静态方法:一种是方法不需要访问对象状态,其参数直接通过显式参数提供(如 Math.pow
);另一种是方法只需要访问类的静态域。
main 方法也是静态方法,利用其不对对象操作的特性,可以将每个类添加一个 main 方法以方便进行单元测试,当类作为其他类的一部分时,该 main 方法永远不会执行。
方法参数
Java 程序采用按值调用
对象构造
重载
多个相同名称的方法,有不同的参数,便产生了重载。构造器也是一种方法,所以也能重载。方法名以及参数类型构成方法的签名,返回类型不是方法签名的一部分。
如果构造器没有显式地给域赋初值,则会赋为默认值。无参数构造器如果没有编写,系统会默认提供。但有一个及以上的有参数构造器,系统就不会提供无参数的构造器。
构造器的参数名有两种命名方式推荐,一种是在参数前加 a 如 name 对应 aName,另一种是直接用参数名,在构造器种使用 this 关键字来访问实例域,如下:
public Employee(String name,int age){
this.name = name;
this.age = age;
}
可以使用 this 在构造器种调用同一类的另一构造器。
包
import
导入包,还可以导入特定的域与方法。
package
将类放入包中,必须放在开头。
文档注释
使用 /** */ 进行文档注释
这一块较为复杂,暂不详细记录
继承
使用 extends 表示继承,继承的子类只需实现跟父类的不同之处。将通用功能放超类,特殊用途放子类是常用做法。
覆盖方法(override)重写父类的方法,当需要使用父类的方法时,用super 关键字。super 关键字还可以用来调用父类构造器。
使用 final 可以阻止继承
Object :所有类的超类
equals
方法检测对象是否和另一个对象相同
hashCode
方法默认返回对象存储地址,要和 equals 同时重新定义。
toString
方法F返回类名,加上方括号括起来的域值。
参数数量可变的方法
printf
方法就是一个经典的可变参数方法。
定义可变参数方法时,在参数类型后加 ...
即可实现可变参数,但参数具体怎么处理需要自己实现