类
- 类是一种抽象概念,类中包含了数据和对数据的操纵
- 数据通常使用名词表示,对数据的操纵通常使用动词表示
- 比如人是一个类,人的身高和体重就是数据,吃饭和跑步就是对数据的操纵
- 类中包含两部分内容:数据对应类中的属性或者成员变量,对数据的操纵对应类中的方法
类与类的关系
- 依赖,USES-A,汽车启动需要汽油
- 聚合,HAS-A,汽车拥有轮胎
- 继承,IS-A,公交车是汽车的一种
对象
- 是一种具体的概念,是类的一种具体表现方式
- 比如人是一个类,而张三和李四具体的人就是人的对象
- 对象只有实例化之后才可以被使用,实例化对象的关键字是new
- 对象又叫类的实例(Instance),生成对象的过程叫实例化
对象的三大特征
- 对象的标识符,对象的状态,对象的行为
方法
- main()是整个程序的入口点,如果程序没有main()程序是无法运行的
- 方法不能嵌套,可以调用方法
- 方法的调用通过对象来完成
- 方法中定义的参数叫形式参数,方法调用时赋予的具体值叫实际参数
- 如果方法不返回值,两种办法:
- 不使用return语句
- return后面只有一个分号,表示退出方法
- Java在进行方法的参数传递时,无论是传递是原生数据类还是引用数据,
- 参数传递方式统一是传值,Java没有传引用的概念
new关键作用
- 为对象开辟内存空间
- 调用了类的构造方法
- 将生成的对象的地址返回给引用
构造器
- 构造器的可预见性与类的可预见性息息相关
- 私有构造器需要提供静态工厂
- 构造器没有返回值,且名称必须与类名相同,主要是对新创建的对象进行初始化工作
- 构造器由new调用,构造器在创建对象时自动调用,并执行构造方法的内容
- 构造器调用是级联调用的,子类构造器会自动调用父类构造器,直至Object构造器
- 如果没有在构造器中调用特定父类构造器,
- 编译器会自动在构造器的第一行增加super()来调用父类无参构造器
- 构造器设计为级联调用是
- 根据替代性原则
- 子类对象必须能替代父类对象,因此在构造子类对象之前,先构造父类对象
- 然后在父类对象的基础上进一步构造对象
- 也就是说,子类对象隐含着一个父类对象
- 因为采用了级联调用机制,构造器不能继承的
- 使用this调用兄弟构造器,如果显式调用兄弟构造器将不再自动增加super()
Java程序加载过程
- 首先加载要创建对象的类和父类
- 类在加载的同时将静态成员加载
- 需要的类加载完成之后,开始创建对象,加载非静态成员
- 最后执行构造器,构造器执行完毕,对象生成
面向对象程序设计
- 面向对象 Object Oriented 简称OO
- 面向对象程序设计 Object Oriented Programming 简称OOP
- 面向过程和面向对象
- 面向过程:操纵数据的算法是第一位,数据结构是第二位
- 面向对象:数据结构是第一位,操纵数据的算法是第二位
- 面向过程:程序=算法+数据
- 面向对象:程序=对象+消息
- 面向过程:更接近计算机世界的物理实现
- 面向对象:更符合人们的认识习惯
- 面向对象程序设计有两个重要概念:类(class)和对象(object)
- 所有的面向对象编程语言都支持3个概念:封装,多态,继承
封装性
- 含义
- 类中包含了数据和方法,将数据和方法包装在一个类中,只提供有限的界面,
- 将细节隐藏起来就构成了封装,这就是信息隐藏性
- 使用
- 将成员变量修饰为private,提供public的访问器,通过访问器来读取和设置成员变量
- 优点
- 提高代码的灵活性和健壮性
- public class Person {
- private String name;
- private int age;
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- if(age>0){
- this.age = age;
- }else{
- System.out.println("年龄不合法");
- }
- }
- }
继承性
- 继承的优点
- 利用继承,开发人员可以基于已存在的类构造新类,重用代码
- 成员变量的隐藏
- 当子类和父类的成员变量相同时,子类便隐藏了父类的成员变量,构成了成员变量的隐藏
- 当生成子类对象时,Java默认先调用父类不带参数的构造方法
- 如果子类构造器需要调用父类特定的构造方法,子类构造器使用super()根据参数决定调用哪个构造方法
- 继承注意事项
- 构造方法不能被继承,方法和属性可以被继承
- 子类的构造方法隐式调用父类无参数的构造方法
- 如果父类没有带参数的构造方法,子类需要使用super()来显式调用父类的构造方法
- super()必须是构造方法的第一行
- 父类对象指向子类对象,父类对象调用方法是调用子类的方法
- 要注意,父类对象调用子类方法时,父类必须也有此方法
多态性
- 多态性在实际中的含义是
- 不同对象有相同的一般轮廓和形态,但具体执行过程不同
- 所谓多态
- 就是父类的引用可以根据不同需要指向子类的对象或者接口的引用可以指向实现该接口的类
- Java两种形式的多态
- 方法重载:一个类多态性的表现,在一个类中,允许相同方法名,参数类型和个数不同,
- 与返回类型无关,参数决定调用哪个版本
- 方法重写:父类和子类之间多态性的表现,定义了与父类相同的方法名称和参数
- 方法重载匹配
- 基本数据类型,如果系统没有直接匹配的方法,根据类型的提升进行调用
- 引用数据类型,如果系统没有直接匹配的方法,先找直接父类匹配
- 如果null为参数,因为null可以看成任何类型的引用,固编译错误,要想使用可以强制转换
- 方法重写规则
- 修饰符
- 子类方法访问权限不能小于父类方法的访问权限
- 参数列表
- 参数列表必须相同
- 返回类型
- 返回类型必须相同
- 父类方法返回基本数据类型时,则子类方法返回类型必须与之完全相同
- 父类方法返回引用数据类型时,则子类方法返回类型要么与之相同,
- 要么派生自父类方法的返回类型
- 异常
- 子类方法不能抛出新的异常或者比父类方法更广的异常
- 静态方法不能被重写,子类有和父类一样的静态方法,静态方法隐藏了
- 重写基于继承,没有继承就没有重写
- 方法隐藏 VS 方法重写
- 隐藏是根据引用的类型来进行调用的,
- 重写是根据对象的类型来进行调用的