程序员

3. Java 基础:面向对象的三大特征

2020-12-06  本文已影响0人  架构小白菜

目录:

一、 封装
二、 继承
三、 多态
四、 抽象类


一、封装

1. 概述

2. 封装的特点

3. 封装的实现

封装的实现
public class Cat {
    //成员属性:
    //修改属性可见性---private 限定只能在当前类内访问,只能修饰成员变量
    private String name;
    public Cat() {
    }
    //创建get/set方法
    //在get/set方法当中添加属性的限定
    public void setName(String name) {  //set方法一般没有返回值
        this.name = name;
    }
    public String getName() { 
        return "我是一只名叫"+this.name+"的猫咪";
    }
    public int getMonth() {
        return month;
    }
    public void setMonth(int month) {   //对年龄进行限定
        if(month<=0)
            System.out.println("输入信息错误,宠物猫的年龄必须大于0");
        else
            this.month = month;
    }
}

二、 继承

1. 概述

2. 继承的逻辑关系

3. 继承的特点:

4. 继承的注意事项:

class B extends A{}
class C extends A{}   // 类B和类C都可以继承类A
class A{}
class B extends A{}   // 类B继承类A,类B是类A的子类
class C extends B{}   // 类C继承类B,类C是类B的子类,同时也是类A的子类

5. 继承后子类父类成员变量的特点

6. 继承后子类父类成员方法的特性

7. 继承的初始化顺序

父类中有:静态代码块,构造代码块,无参构造方法,静态属性。
子类中有:静态属性,静态代码块,构造代码块,无参构造方法
执行顺序
1. 父类的静态代码块
2. 子类的静态代码块
3. 父类的构造代码块
4. 父类的无参构造方法
5. 子类的构造代码块
6. 子类的无参构造方法

8. 方法重载和方法覆盖

1. 同一个类中
2. 方法名:重载的两个方法的方法名必须相同
3. 参数列表不同,三者至少满足一个(参数顺序、个数、类型),三者至少满足一个
4. 重载与返回值类型、权限修饰符 无关
5. 与方法的参数名 无关

1. 有继承关系的 子类 中, 子类覆盖父类的方法

  1. 方法名:子类方法和父类方法 必须相同
    3. 参数列表:子类方法和父类方法的形参列表 必须相同
  2. 访问修饰符子类方法的权限 >= 父类的方法的权限
  3. 返回值类型
    - 基本数据类型: 必须相同
    - 引用数据类型相同 或者 子类方法的返回值类型是父类方法的返回值类型的 子类

三、 多态

1. 概述

如 Student 类可以为 Person 类的子类。那么一个S tudent 对象既可以赋值给一个 Student 类型的引用,也可以赋值给一个 Person 类型的引用。

如何解决?
法1:创建子类对象调用子类方法
法2:把父类的引用强转为子类引用

2. 多态调用的三种格式

普通类多态定义的格式:父类 变量名 = new 子类();
抽象类多态定义格式:抽象类 变量名 = new 抽象类子类();
接口多态定义的格式:接口 变量名 = new 接口实现类();

3. 注意事项:

Person p1 = new Student();
Person p2 = new Teacher();
p1.work(); //p1会调用Student类中重写的work方法
p2.work(); //p2会调用Teacher类中重写的work方法

4. 多态中成员访问的特点

5. 编译时多态(方法重载 overload)

注:方法签名: 方法名+方法参数列表**

6. 运行时多态

7. 多态的转型

当不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作,这时就可以使用向上转型。

当要使用子类特有功能时,就需要使用向下转型。
向下转型的好处:可以使用子类特有功能。
但是弊端是需要面对具体的子类对象;在向下转型时容易发生 ClassCastException 类型转换异常。在转换之前必须做 类型判断
如: if( !a instanceof Dog){…}

8. instanceof 关键字

注意null instanceof <类名> 结果永远是 false

Person p1 = new Student(); // 前提条件,学生类已经继承了人类
boolean flag = p1 instanceof Student; //flag结果为true
boolean flag2 = p2 instanceof Teacher; //flag结果为false

四、 抽象类

1. 概述

2. 抽象类的定义格式

3. 抽象类特点

4. 抽象类成员特点

子类继承抽象类时,构造方法不会被覆盖。 而且,在实例化子类对象时首先调用的是抽象类中的构造方法再调用子类中的。
因此,在抽象类中可以使用构造方法封装,所继承子类公共的东西。

5.抽象类的子类(二选一)

6. 抽象类的细节

严格来说是的,不是父类的话就没有意义了,抽象类的抽象方法必须由子类来实现 本身只起到定义的作用

可以没有抽象方法,有意义,是为了不让该类创建对象,方法可以直接让子类去使用
在实际开发中,有的时候,不希望使用者,直接实例化出一个类的对象,可以将这个类定义为 abstract

上一篇 下一篇

猜你喜欢

热点阅读