目录
一、面向对象
一、面向对象
- 艾伦·凯最早提出了“面向对象编程”的概念,也是“Dynabook”(笔记本电脑的雏形)的最早阐述者。
- 众所周知,面向对象的三大特征是:封装性、继承性、多态性,这些特性都是从面向对象中抽取中的三大特点,原味的面向对象基于一个一个的信息节点,它们之间相互进行通信。封装性表示它们各自之间有些信息因为没有权限无法访问,有些信息对外暴露;继承性表示有的信息节点基于某个信息节点又新增加和改变了一些信息元素;多态性表示同一类信息具有不同的表现形式。
面向对象不同于面向过程
- 面向过程:强调的是功能行为,以函数为最小单位,考虑怎么做。
- 面向对象:强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。
面向对象中两个重要的概念
- 类: 对一类事物的抽象,概念性的定义(人这种生物)
- 对象: 是实实在在存在的事务,每一个对象都是一个个体,也成为实例。(自己就是一个个体)
万事万物皆对象
面向对象三大特征
1. 封装性
- 隐藏对象内部的复杂性,只对外公开简单的接口。便于外界调用,提高系统的可扩展性、可维护性。
- Java规定的四种权限修饰符
- private < 缺省 < protected < public
- 四种都可以用来修饰类的内部结构:属性、方法、构造器、内部类
- 类只能被缺省、和public修饰
2. 继承性
- 减少了代码的冗余,提高了代码的复用性,便于功能的扩展,为之后多态性的使用,提供了前提
- 一旦子类A继承父类B以后,子类A中就获取了父类B中声明的所有的属性和方法。
- 一个类可以被多个子类继承,一个类只能有一个父类(单继承性)
- 如果我们没显式的声明一个类的父类的话,则此类继承于java.lang.Object类
3. 多态性
- 一个事物的多种形态。
- 父类的引用指向子类的对象(或子类的对象赋给父类的引用)
- 在编译期,只能调用父类中声明的方法,在运行期,实际执行的是子类重写父类的方法。
- 对象的多态性,只适用于方法,不适用于属性
- 向下转型:a instanceof A:判断对象a是否是类A的实例。如果是,返回true;如果不是,返回false。
java中类的设计有五种结构
1. 属性
- 一个类特征的量化描述
- 非静态属性会加载到堆空间中
- 定义在类的一对{ }中
- 在声明属性时可以设置权限修饰符(四种)
- 属性赋值先后顺序:①默认初始化②显式初始化 | 代码块初始化③构造器初始化④通过对象调用赋值
2. 方法
- 描述类中具有的功能
- 方法重载:在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
- 方法重写:子类对父类同名同参数的方法进行再次编写,子类使用自己重写后的方法。
3. 构造器
- 用来创建对象,初始化对象属性
- 与类同名的方法,无返回值
- 一个类中,至少会有一个构造器,如果没有显式声明,默认会有一个空参构造器。
4. 代码块
- 用来初始化类、对象的信息
- 代码块要是使用修饰符,只能使用static
5. 内部类
- Java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类.
- 一方面,作为外部类的成员
- 另一方面,作为一个类
关键字
①this
- 理解为:当前对象、当前正在创建的对象
- 当方法的形参与类的属性相同时,我们必须显示的使用“this.变量名”来声明这个变量是属性
- 一般用在构造器中
②super
- 理解为:父类的
- 当子类和父类中定义了同名的属性或方法时,我们想调用父类同名属性或方法时使用“super.变量名”“super.方法名”来指明
- this和super都可省略
③package
- 目的:有效的管理项目中的类,提供包的概念
- 声明在源文件的首行
- “.”,就代表一层文件目录
④import
- 用import结构对指定包下的类和接口进行显示导入
- 声明在package和类中间
- 可以使用"xxx.*"的方式,表示可以导入xxx包下的所结构
- 使用的类或接口是java.lang包下定义的,则可以省略import结构
- import static:导入指定类或接口中的静态结构:属性或方法
⑤static
- 静态的,主要用来修饰类的内部结构:属性、方法、代码块、内部类
- static修饰属性:静态变量(或类变量),内存加载时只会有一个实体,所有的对象共用一个静态变量,在方法去静态域中,随类的加载而加载
- static修饰方法:静态方法、类方法,静态方法中只能调用静态的方法或属性,在静态的方法内,不能使用this关键字、super关键字
- 大部分工具类都是static的,我们可以直接通过类名.方法进行调用
⑥final
- 最终的,可以来修饰:类,方法,变量
- final 用来修饰一个类:此类不能被其他类所继承
- final 用来修饰方法:表明此方法不可以被重写
- final 用来修饰变量:此时的"变量"就称为是一个常量
- static final 用来修饰属性:全局常量
⑦abstract
- 抽象的,可以来修饰类、方法
- abstract修饰类:抽象类。此类不能实例化,抽象类中一定有构造器,便于子类实例化时调用,开发中,都会提供抽象类的子类,让子类对象实例化,完成相关的操作
- abstract修饰方法:抽象方法。抽象方法只方法的声明,没方法体。包含抽象方法的类,一定是一个抽象类。若子类重写了父类中的所的抽象方法后,此子类方可实例化
- abstract不能用来修饰属性、构造器等,也不能来修饰私方法、静态方法、final的方法、final的类
⑧interface
- 接口,与类的作用并列,JDK1.7之前可定义全局常量和抽象方法,JDK1.8以后还可以定义静态方法、默认方法
- 接口中不能定义构造器的,也就是说接口不可以实例化
- Java开发中,接口通过让类去实现(implements)的方式来使用
- Java类可以实现多个接口
- 接口与接口之间可以继承,而且可以多继承,体现多态性
//抽象类
abstract class XxxObject{
//抽象方法
public abstract double Xxx();
}
java值传递
规则:
- 如果变量是基本数据类型,此时赋值的是变量所保存的数据值。
- 如果变量是引用数据类型,此时赋值的是变量所保存的数据的地址值。
System.out.println("基本数据类型:");
int m = 10;
int n = m;
System.out.println("m = " + m + ", n = " + n);
n = 20;
System.out.println("m = " + m + ", n = " + n);//值不同
System.out.println("引用数据类型:");
Order o1 = new Order();
o1.orderId = 1001;
Order o2 = o1;//赋值以后,o1和o2的地址值相同,都指向了堆空间中同一个对象实体。
o2.orderId = 1002;
System.out.println("o1 = " + o1 + ", o2 = " + o2);//值相同
java.lang.Object类
- Object类是所Java类的根父类
- 如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类
- Object类中的功能(属性、方法)就具通用性。
- Object类只声明了一个空参的构造器
// Object类中equals()的定义:
* public boolean equals(Object obj) {
return (this == obj);
}
//Object类中toString()的定义:
* public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
//我们可以对Object中equals、toString方法进行重写
java中JUnit测试类
- 使用方法
- 导入包并import org.junit.Test
- 建类和方法
- 在方法上用@Test注解,就可以在这个方法中运行。
包装类
- 为了使基本数据类型具有类的特征,引入包装类
- 基本数据类型<—>包装类:JDK 5.0 新特性:自动装箱 与自动拆箱
- 基本数据类型、包装类—>String:调用String重载的valueOf(Xxx xxx)
- String—>基本数据类型、包装类:调用包装类的parseXxx(String s)