面向对象编程(二)

本文详细介绍了Java的面向对象编程特性,包括访问修饰符、封装、继承、多态等核心概念。讲解了继承的细节,如子类能继承父类的哪些内容,以及成员变量和方法的访问特点。此外,还探讨了super关键字、方法重写、多态的向上和向下转型,以及final关键字的应用。最后,概述了Object类的重要方法,如equals、hashCode和toString,以及类变量、类方法、代码块、抽象类和接口的相关知识。
摘要由CSDN通过智能技术生成

目录

一、访问修饰符

1.1 包

1.2 访问修饰符

二、面向对象三大特征

2.1 封装

2.2 继承

2.2.1 继承细节:

2.2.2 继承的本质分析:

 2.3 super关键字(待学习)

 2.4 方法重写/覆盖(override)

 2.5 多态

2.5.1 多态的向上转型

2.5.2 多态向下转型

2.6 java 的动态绑定机制

三、Object类

3.1 equals方法

3.2 hashCode

 3.3 toString方法

3.4 finalize 方法

4.1 类变量与类方法

4.1.1类变量

4.1.2 类方法

4.2 代码块

4.2.1 小结:

 4.2.2 创建子类对象时调用顺序​编辑

4.3 抽象类

4.4 接口



一、访问修饰符

1.1 包

作用:

  1. 区分相同名字的类
  2. 当类较多时,可以很好的管理类
  3. 控制访问范围
package org.example

package关键字,表示打包;org.example表示包名

实质就是创建不同文件夹/目录来保存类文件

  1. 使用同一个包中的类时,不需要导包
  2. 使用Java.lang包中的类时,不需要导包
  3. 其余情况都需要导包
  4. 如果同时使用两个包中的同名类,需要用全类名

1.2 访问修饰符

  1.  公开级别:public 修饰,对外公开
  2.  受保护级别:protected 修饰,对子类和同一个包中的类公开
  3. 默认级别:没有修饰符号,向同一个包的类公开.
  4.  私有级别:private 修饰,只有类本身可以访问,不对外公开

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

二、面向对象三大特征

2.1 封装

实现步骤:

  1. 将属性进行私有化private
  2. 提供一个公共的set方法,用于对属性判断并赋值
  3. 提供一个公共的get方法,用于获取属性的值
public class Test {
    public static void main(String[] args) {
        Person person = new Person();
        person.setAge(14);
        System.out.println(person.getAge());
    }
}

class Person {

    private String name;
    private Integer age;
    

    public void setAge(Integer age){
        if(age<0){
            System.out.println("年龄不能小于0");
        } else if (age>150) {
            System.out.println("您可以飞升了");
        }else{
            this.age=age;
        }
    }
    public Integer getAge(){
        return age;
    }
}

14

 set/get方法可以写在构造器内

2.2 继承

继承可以解决代码复用 , 让我们的编程更加靠近人类思维 . 当多个类存在相同的属性 ( 变量 ) 和方法时 , 可以从这些类中抽象出父类, 在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过 extends 来声明继承父类即可

 基本语法:

class 子类 extends 父类{

}

  1. 子类就会拥有父类定义的属性和方法
  2. 父类又叫超类,基类
  3. 子类又叫派生类
public class Person {
    private String name;
    private Integer age;
    public void info(){
        System.out.println(name+age);
    }
    public String getName(){
        return name;
    }
}
public class Student extends Person{
    public  void testing(){
        System.out.println(getName()+"正在考试");
    }
}

2.2.1 子类到底能继承父类中的哪些内容

非私有 private
构造方法 不能 不能
成员变量 能(不能直接用)
成员方法 不能

成员变量的继承的内存图(P126) 

1.加载字节码文件时也会把父类的字节码文件加载到方法区

2.创建对象时,会有一部分空间存储从父类继承过来的成员变量。

成员方法的继承的内存图(P126)

虚方法:不被private,static及final修饰的方法

 因为private无法加载到虚方法表,因此无法被子类继承

2.2.2 继承中成员变量及成员方法的访问特点

2.2.2.1 成员变量的访问特点:

就近原则,谁离我近,我就用谁。

先从局部变量找,本类成员位置找,父类成员变量找,逐级往上

2.2.2.2 成员方法的访问特点:

就近原则,谁离我近,我就用谁。

2.2.2.3 构造方法的访问特点:

  1. 父类中的构造方法不会被子类继承
  2. 子类中所有的构造方法默认先访问父类的无参构造(给父类中的属性默认初始化),再执行自己。因为子类在初始化的时候,有可能需要用到父类中的数据,如果父类没有初始化,子类则无法使用父类的数据。子类初始化之前,一定要调用父类构造方法来完成父类数据空间的初始化。
  3. 子类构造方法的第一行默认为super(),不写也存在,且必须在第一行。
  4. 如果想调用父类的有参构造,必须手动写super进行调用

2.2.1 继承细节。

  1. 子类继承了所有的属性及方法,非私有的可以在子类直接访问,私有的需要通过父类的公共方法来访问
  2. 子类必须调用父类的构造器,完成父类的初始化
  3. 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过
  4.  如果希望指定去调用父类的某个构造器,则显式的调用一下 : super(参数列表)
  5.  super 在使用时,必须放在构造器第一行(super 只能在构造器中使用)
  6.  super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
  7. java 所有类都是 Object 类的子类, Object 是所有类的基类.
  8.  父类构造器的调用不限于直接父类!将一直往上追溯直到 Object 类(顶级父类)
  9. 子类最多只能继承一个父类(指直接继承),即 java
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值