Java
java基本概念
- 对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
- 类:类是一个模板,它描述一类对象的行为和状态。
- 方法:方法就是行为,一个类可以有很多方法。逻辑运算、数据修改以及所有动作都是在方法中完成的。
- 实例变量:每个对象都有独特的实例变量,对象的状态由这些实例变量的值决定。
java 变量
Java 中主要有如下几种类型的变量
- 局部变量
- 类变量(静态变量)
- 成员变量(非静态变量)
java源文件
- 一个源文件中只能有一个 public 类
- 一个源文件可以有多个非 public 类
- 源文件的名称应该和 public 类的类名保持一致。例如:源文件中 public 类的类名是 Employee,那么源文件应该命名为Employee.java。
java数据类型
java基本数据类型
| type | a |
| ------ | ---------------------------------------- |
| byte | 8位有符号、以二进制补码表示的整数 |
| short | 16位有符号、以二进制补码表示的整数 |
| int | 32位有符号、以二进制补码表示的整数 |
| long | 64位有符号、以二进制补码表示的整数 |
| float | 32位单精度、符合IEEE 754标准的浮点数 |
| double | 64 位 双精度、符合 IEEE 754 标准的浮点数 |
| char | 16 位 Unicode 字符 |
| true | 1位、true or false |
java引用数据类型
- 在Java中,引用类型的变量非常类似于C/C++的指针。引用类型指向一个对象,指向对象的变量是引用变量。这些变量在声明时被指定为一个特定的类型,比如List 等。变量一旦声明后,类型就不能被改变了。
java常量
常量在程序运行时是不能被修改的。
在 Java 中使用 final 关键字来修饰常量,声明方式和变量类似
java异常处理
捕获异常
使用 try 和 catch 关键字可以捕获异常。try/catch 代码块放在异常可能发生的地方。
try/catch代码块中的代码称为保护代码,使用 try/catch 的语法如下:
try
{
// 程序代码
}catch(ExceptionName e1){
//Catch 块
}
Catch 语句包含要捕获异常类型的声明。当保护代码块中发生一个异常时,try 后面的 catch 块就会被检查。
如果发生的异常包含在 catch 块中,异常会被传递到该 catch 块,这和传递一个参数到方法是一样。
多重捕获块
一个 try 代码块后面跟随多个 catch 代码块的情况就叫多重捕获。
try{
// 程序代码
}catch(异常类型1 异常的变量名1){
// 程序代码
}catch(异常类型2 异常的变量名2){
// 程序代码
}catch(异常类型3 异常的变量名3){
// 程序代码
}
可以在 try 语句后面添加任意数量的 catch 块。
如果保护代码中发生异常,异常被抛给第一个 catch 块。
如果抛出异常的数据类型与 ExceptionType1 匹配,它在这里就会被捕获。
如果不匹配,它会被传递给第二个 catch 块。
如此,直到异常被捕获或者通过所有的 catch 块。
软件构造中java类与接口
class,attribute and method
-
java类定义为 variables + methods
-
实际上就是数据加行为
-
java进行信息隐藏
-
每个member都用一个访问权限来界定
-
pubic – 外部类可以直接访问
-
protected – 只可以从子类或者声明类的包内访问
-
private – 外部类不能直接访问
- 用在variables上,不允许外部直接访问数据,防止信息泄露
- 此时访问或者修改private数据需要借助类提供的public方法间接访问
- 用在method上,一些不需要暴露在外部的方法
- 用在variables上,不允许外部直接访问数据,防止信息泄露
作用域 当前类 同一包类 子孙类(不同包) 其他包 public 👍 👍 👍 👍 protected 👍 👍 👍 💔 default 👍 👍 💔 💔 private 👍 💔 💔 💔 -
-
-
final 变量则不允许修改其值
-
static 变量是属于类的变量,而不是某个实例的专属变量,所有的实例的静态变量都相同
-
static 方法是属于类的方法,可以直接使用类名.静态方法名直接调用而不需要实例化,不过静态方法只能访问静态变量
Interface and Enumerations
Interface
-
接口:确定ADT规约 类:实现ADT
-
接口只为使用者提供“契约”(contract),而使用者只需要读懂这个接口即可使用该ADT,他也不需要依赖ADT特定的实现/表示,因为实例化的变量不能放在接口中(具体实现被分离在另外的类中)
它允许了一种抽象类型能够有多种实现/表示,即一个接口可以有多个实现类。而当一个类型只用一个类来实现时,我们很难改变它的内部表示。
-
实际中倾向于用接口来定义变量
-
Set set = new HashSet<>();
-
接口中没有构造器
-
相反,它使用静态工厂方法返回一个实现类的实例
-
接口就是一系列方法的定义的集合(方法默认都是public的)
- 静态方法,这个是接口本身的方法,这样可以实现静态工厂方法(直接创建一个实现类的实例)
- 默认方法(default),在实现类中不需要再重写的方法(@override),可以直接调用
- 普通方法,没有具体实现,需要在实现类中重写
- 静态方法,这个是接口本身的方法,这样可以实现静态工厂方法(直接创建一个实现类的实例)
-
接口之间可以继承和拓展
-
一个类可以实现一个接口如果接口中所有的方法签名在类中都有具体的实现
-
一个类可以实现多个接口,从而具备多个接口的方法
-
一个接口可以有多个实现类(List -> ArrayList and LinkedList)
-
好的模块设计其隐藏内部信息和实现细节,模块调用仅仅通过APIS
1. 使用接口类型声明变量 2. 客户端仅使用接口定义的方法 3. 客户端代码无法直接访问属性 4. 客户端任然可以访问其他非接口成员 - 仅仅public客服端需要的方法,其他所有的 成员应该是private
enum
- 当值域很小且有限时,将所有的值定义为被命名的常量是有意义的,这被称为枚举(enumeration)。JAVA用
enum
使得枚举变得方便:
public enum Month { JANUARY, FEBRUARY, MARCH, ..., DECEMBER };
Month thisMonth = MARCH;
Inheritance and Overriding
`Class A extends B`
- 子类只能使用超类public 和proteted功能
- 父类的不空函数体一般可以直接被子类型复用,对于有特殊性的函数需要重写,实现自己的特殊要求
- 如果父类型的某个函数实现体为空,意味着所有子类型都需要这个功能,每个子类均需要重写
Overriding
-
重写方法和严格继承
1. 重写方法(默认),允许子类重写方法(使用@Override) - 相同的方法签名不同的实现 - 重写某个方法,可以使用super.method_name()复用父类该函数的功能,对其进行拓展 2. 严格继承,子类只能添加新方法,无法重写超类中的方法 - 如果一个方法不希望被重写,则添加关键词`final` `public final void drive(){...}`
final
field :防止在初始化后重新分配该字段
final
method : 防止重写该方法
final
class : 防止继承该类
Abstract Class
abstract method
- 只有定义没有实现
- 使用关键字
abstract
abstract class
- 抽象类中可以有具体实现的方法
- 抽象类不能实例化(不能用new生成对象)
- 继承某个抽象类的子类在实例化时,父类中的所有抽象方法必须已经实现
- 如果某些操作在所有的子类型中都共有,但彼此之间有差距,可以在父类中设计抽象方法,在各个子类中重写
- 所有子类型完全相同的操作,放在父类中实现,子类型中无需重写;有些子类型有而其他子类型无的操作,不要在父类中定义和实现,而应该在特定子类型中实现
- 接口就是只有抽象方法的抽象类
多态
三种类型的多态
-
特殊多态: java中使用重载(overload)的方式实现。简单的说就是通过在不改变函数名的前提下,改变函数的参数,改变函数的返回值,以使同名函数能执行多种功能。
同名但参数类型不一样或者数量不相同,也就是签名不同
-
参数多态:java中使用泛型(generics)的方式实现。泛型包括类型变量、泛型类、泛型接口、泛型方法。
-
子类型多态:java中使用子类继承和接口实现的技术实现。在子类型多态中,只要调用接口的方法就可以直接识别出接口的具体实现。例如
List<Integer> list = new ArrayList<Integer>().