Java SE: 面向对象编程(中级部分)

食用前说明:

本文章内容来自B站韩顺平老师的课堂笔记,本人只是将其进行自我整理,内容有所删减,韩顺平老师的B站课程AV号:BV1fh411y7R8

本文章内容来自韩顺平老师的课堂笔记的第7章面向对象编程(中级部分),本章内容重点掌握:封装、继承和多态,层层递进关系,着重了解Java的动态绑定机制。

附上本章开始的链接:

从封装开始,到继承,再到多态

8.1 访问修饰符

8.1.1 基本介绍

java 提供四种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限(范围):

  1. 公开级别: 用 public 修饰,对外公开

  2. 受保护级别: 用 protected 修饰,对子类和同一个包中的类公开

  3. 默认级别: 没有修饰符号,向同一个包的类公开

  4. 私有级别: 用 private 修饰,只有类本身可以访问,不对外公开

8.1.2 种访问修饰符的访问范围(重要

访问级别访问控制修饰符当前类同一包内子孙类(同一包)子孙类(不同包))其他包
公开public
受保护protected×
默认没有修饰符××
私有private××××

①:子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法。

8.1.3 使用的注意事项

  1. 修饰符可以用来修饰类中的属性,成员方法 和 类

  2. 只有 默认的 和 public 才能修饰 类

8.2 面向对象编程三大特征

8.2.1 基本介绍

  • 面向对象编程的三大特征:封装继承多态

8.2.2 封装的实现步骤 (三步)

  1. 将属性 进行私有化private(使其保持独立,不能直接修改属性)

  2. 提供一个公共的 (public) set方法,用于对属性判断并赋值

    public void setXxx(类型 参数名){//Xxx 表示某个属性
        //加入数据验证的业务逻辑
        属性 = 参数名;
    }
  3. 提供一个公共的 (public) get方法,用于获取属性的值

    public 数据类型 getXxx(){ //权限判断,Xxx某个属性
    	return xx;
    }
  • 案例演示

     private String name;
     private String idNum;
     private int age;
     ​
     public int getAge(){
         return age;
     }
     ​
     public String getName(){
         return name;
     }
     ​
     public String getIdNum(){
         return idNum;
     }
     ​
     public void setAge( int newAge){
         age = newAge;
     }
     ​
     public void setName(String newName){
         name = newName;
     }
     ​
     public void setIdNum( String newId){
         idNum = newId;
     }

8.3 面向对象编程-继承

8.3.1 为什么需要继承

  • 通过对重复出现的属性,进行单独抽象出来,形成父类(基类),然后子类继承父类实现,增加代码的复用

  • 也使代码的扩展性 和 可维护性提高了

     

语法:

class 子类 extends 父类 {}

8.3.2 继承的深入讨论/细节问题

  1. 子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问, 但是私有属性和方法不能在子类直接访 问,要通过父类提供公共的方法去访问

            用封装提供的 set 和 get 方法 【8.2.2封装的实现步骤】
  2. 子类必须调用父类的构造器, 完成父类的初始化

  3. 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无 参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过(怎么理解。) [举例说明]

  4. 如果希望指定去调用父类的某个构造器,则显式的调用一下 : super(参数列表)

  5. super 在使用时,必须放在构造器第一行(super 只能在构造器中使用)

  6. super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器

  7. java 所有类都是 Object 类的子类, Object 是所有类的基类.

  8. 父类构造器的调用不限于直接父类!将一直往上追溯直到 Object 类(顶级父类)

  9. 子类最多只能继承一个父类(指直接继承),即 java 中是单继承机制。 思考:如何让 A 类继承 B 类和 C 类? 【A 继承 B, B 继承 C】

  10. 不能滥用继承,子类和父类之间必须满足 is-a 的逻辑关系

8.3.3 继承的本质分析(重要)

  • 汇总(以案例演示的解读)

    先加载类,再加载数据 

public static void main(String[] args) {
    Son son = new Son();//内存的布局
    //?-> 这时请大家注意,要按照查找关系来返回信息
    //(1) 首先看子类是否有该属性
    //(2) 如果子类有这个属性,并且可以访问,则返回信息
    //(3) 如果子类没有这个属性,就看父类有没有这个属性(如果父类有该属性,并且可以访问,就返回信息..)
    //(4) 如果父类没有就按照(3)的规则,继续找上级父类,直到 Object... System.out.println(son.name);//返回就是大头儿子
    //System.out.println(son.age);//返回的就是 39
    //System.out.println(son.getAge());//返回的就是 39
    System.out.println(son.hobby);//返回的就是旅游
}
class GrandPa { //爷类
    String name = "大头爷爷";
    String hobby = "旅游";
}
class Father extends GrandPa {//父类
    String name = "大头爸爸";
    private int age = 39;
    public int getAge() {
    	return age;
    }
}
class Son extends Father { //子类
	String name = "大头儿子";
}

8.4 super 关键字

8.4.1 基本介绍

  • super 代表父类的引用,用于访问父类属性方法构造器

8.4.2 super 和 this 的比较

区别点thissuper
访问属性先访问本类中的属性,如果本类没有此属性,则从父类中查找从父类开始查找属性
调用方法先访问本类中的方法,如果本类没有此方法,则从父类中查找从父类开始查找方法
调用构造器调用本类构造器,必须放在构造器的首行调用父类构造器,必须放在子类构造器首行
特殊表示当前对象子类中访问父类对象

8.5 方法重写/覆盖(override)

  • 理解:子类重写抽象的父类

  1. 子类的方法的形参列表,方法名称,要和父类方法的形参列表,方法名称完全一样。

  2. 子法方法的返回类型和父类方法返回类型.一样,或者是父类返回类型的子类

  3. 子类方法不能缩小父类方法的访问权限

8.5.1 重载(overload) 和 重写(override) 比较

名称发生范围方法名形参列表返回类型修饰符
重载(overload)本类必须一样类型,个数或者顺序至少有一个不同无要求无要求
重写(override)父子类必须一样相同子类重写方法,返回的数值类型和父类返回的数值类型一致,或者是子类返回的值类型是父类返回类型的子类子类方法不能缩小父类方法的访问范围

8.6 面向对象编程-多态

8.6.1 多态基本介绍

  • 方法或对象具有多种形态。是面向对象的第三大特征,多态是建立在封装和继承基础之上的。

  • 案例演示

 public static void main(String[] args) {
     //方法重载体现多态
     A a = new A();
     //这里我们传入不同的参数,就会调用不同 sum 方法,就体现多态
     System.out.println(a.sum(10, 20));
     System.out.println(a.sum(10, 20, 30));
     //方法重写体现多态
     B b = new B();
     a.say();
     b.say();
 }
 class B { //父类
     public void say() {
         System.out.println("B say() 方法被调用...");
     }
 }
 class A extends B {//子类
     public int sum(int n1, int n2){//和下面 sum 构成重载
         return n1 + n2;
     }
     public int sum(int n1, int n2, int n3){
         return n1 + n2 + n3;
     }
     public void say() {
         System.out.println("A say() 方法被调用...");
     }
 }

8.6.2 对象的多态

  1. 一个对象的 编译类型 和 运行类型 可以不一致

  2. 编译类型在定义对象时,就确定了,不能改变

  3. 运行类型是可以变化的

  4. 编译类型看定义时 = 号 的左边,,运行类型看 = 号 的右边

    编译看左边,运行看右边

8.6.3 java 的动态绑定机制 (非常非常重要.)

java的动态绑定机制

  1. 当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定

  2. 当调用对象属性时,没有动态绑定机制,按照作用域:哪里声明,那里使用

8.7 Object 类详解

8.7.1 equals方法 与 == 异同

名称区别
==

可以判断基本类型引用类型

基本类型:判断值是否相等

引用类型:判断地址是否相等(判定是否为同一个对象)

equals

Object类中的方法,只能判断引用类型

默认:判断地址是否相等

子类中重写方法后,用于判断内容是否相等

8.7.2 hashCode 方法

  • 在集合中的Set中HashSet、Map中HashMap 和 Hashtable,会用到hashCode解决冲突问题和提高性

小结:

  1. 提高具有哈希结构的容器的效率!(如上提到的集合中的三个)

  2. 两个引用,如果指向的是同一个对象,则哈希值肯定是一样的!

  3. 两个引用,如果指向的是不同对象,则哈希值是不一样的

  4. 哈希值主要根据地址号来的!, 不能完全将哈希值等价于地址。

8.7.3 toString 方法

  1. 基本介绍

    默认返回格式 (了解就行) :全类名+@+哈希值的十六进制

    子类往往重写 toString 方法,用于返回对象的属性信息

  2. 重写 toString 方法,打印对象或拼接对象时,都会自动调用该对象的 toString 形式

8.7.4 finalize 方法 (了解)

Object finalize() 方法用于实例被垃圾回收器回收的时触发的操作。

当 GC (垃圾回收器) 确定不存在对该对象的有更多引用时,对象的垃圾回收器就会调用这个方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值