Java学习笔记(七)面向对象编程(中级部分)

Hi i,m JinXiang


⭐ 前言 ⭐

本篇文章主要介绍Java面向对象编程(中级部分)包、访问修饰符、封装、继承、super关键字、多态、向上(下)转型、equals、hashCode、断点调试等知识的详细使用以及部分理论知识


🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁

🍉博主收将持续更新学习记录获,友友们有任何问题可以在评论区留言


目录

1、包

包的三大作用

包的基本语法

包的本质

快速入门

包的命名

常用的包

如何引入包

注意事项和使用细节

2、访问修饰符

基本介绍

4种访问修饰符的访问范围

使用访问修饰符的注意事项

3、OOP三大特征(封装、继承、多态)

3.1、封装

封装介绍

封装的理解和好处

封装实现的步骤

快速入门

封装与构造器

3.2、继承

为什么学继承?

继承基本介绍和示意图

继承的基本语法

继承快速入门

继承给编程带来的遍历

继承的深入探讨/细节问题

继承的本质

3.3、多态

4、Super关键字

基本介绍

基本语法

super给编程带来的遍历/细节

super和this的比较

5、方法重写/覆盖(overwrite)

基本介绍

方法重写快速入门

方法重写/覆盖注意事项和使用细节

方法重写和方法重载的区别

6、Object类详解,垃圾回收机制

7、项目


1、包

包的三大作用

  • 1、区分相同名字的类
  • 2、当类很多时,可以很好的管理类
  • 3、控制访问范围

包的基本语法

package com.hspedu;

  • 说明:
  • 1、package 关键字,表示打包.
  • 2、com.hspedu 表示包名

包的本质

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

快速入门

在不同的目录/文件夹下创建相同名称的类

包的命名

常用的包

一个包下, 包含很多的类 ,java 中常用的包有 :

    1. java.lang.*
    • //lang 包是基本包,默认引入,不需要再引入.
    1. java.util.*
    • //util 包,系统提供的工具包, 工具类,使用 Scanner
    1. java.net.*
    • //网络包,网络开发
    1. java.awt.* //是做 java 的界面开发,GUI

如何引入包

用哪个就导入哪个

注意事项和使用细节

  • 1、package 的作用是声明当前类所在的包,需要放在类的最上面,一个类中最多只有一局package
  • 2、import指令 位置放在package的下面,在类定义前面,可以有多句且没有顺序要求。

2、访问修饰符

基本介绍

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

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

4种访问修饰符的访问范围

使用访问修饰符的注意事项

  • 1)修饰符可以用来修饰类中的属性,成员方法以及类
  • 2)只有默认的和public才能修饰类!,并且遵循上述访问权限的特点。
  • 3)因为没有学习继承,因此关于在子类中的访问权限,我们讲完子类后,在回头讲解4)成员方法的访问规则和属性完全一样.

//com.hspedu.modifier:需要很多文件来说明(A类,B类, Test类.....

3、OOP三大特征(封装、继承、多态)

3.1、封装

封装介绍

封装就是把抽象出来的数据【属性】和对数据的操作【方法】封装在一起,数据被保护在内部,程序的其他部分只有通过被授权的操作【方法】,才能对数据进行操作

封装的理解和好处

  • 1、隐藏实现细节:方法(连接数据库)<--调用(传入参数)
  • 2、可以对数据进行验证,保证安全合理

封装实现的步骤

  • 1、将属性进行私有化private【不能直接修改属性】
  • 2、提供一个公共的(public)set 方法,用于对属性判断并赋值
    • public void setXxx(类型参数名) {//Xxx表示某个属性
    • //加入数据验证的业务逻辑
    • 属性=参数名;
    • }
  • 3、提供一个公共的(public)get 方法,用于获取属性的值
    • public 数据类型getXxx() {//权限判断, Xxx某个属性
    • return xx;
    • }

快速入门

案例:请大家看一个小程序 不能随便查看人的年龄,工资等隐私,并对设置的年龄进行合理的验证。年龄合理就设置,否则给默认"年龄必须在1-120,年龄,工资不能直接查看,name的长度在2-6之间

代码:

java 复制代码
package 封装;
public class 快速入门案例 {
    // 不能随便查看人的年龄,工资等隐私,并对设置的年龄进行合理的验证。
    // 年龄合理就设置,否则给默认"年龄必须在1-120,年龄,工资不能直接查看,
    // name的长度在2-6之间。
    public static void main(String[] args) {
        Person person = new Person();
        person.setName("jack");
        person.setAge(30);
        person.setSalary(3030);
        person.info();
    }
}
class Person{
    public String name; //名字公开
    private int age; //年龄私有
    private double salary;//...

    public String getName() {
        return name;
    }

    public void setName(String name) {
        //加入读数据的校验,相当于增加业务逻辑
        if (name.length() >=2 && name.length()<=6){
            this.name = name;
        }else {
            System.out.println("名字的长度不对,需要大于2小于6,默认名字");
            this.name = "无名";
        }

    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        //添加判断
        if (age>=1 && age <=120){
            this.age = age;
        }else {
            System.out.println("设置的年龄不正确,需要在1到120之间,给年龄设置了默认值18");
            this.age = 18;//给一个默认年龄
        }
    }

    public double getSalary() {
        //可以增加一个对当前对象的权限判断
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
    public void info(){
        System.out.println("姓名:"+name+" 年龄:"+age+" 薪水:"+salary);
    }
}

封装与构造器

java 复制代码
//使用构造器指定属性
Person smith = new Person("smith", 120, 30000);
System.out.println("===smith的信息===");
System.out.println(smith.info());
java 复制代码
//无参构造器
    public Person() {
    }
    //有三个属性的构造器
    public Person(String name, int age, double salary) {
        /*this.name = name;
        this.age = age;
        this.salary = salary;*/

        //验证数据:把set写在构造器中
        setName(name);//这样写的话,下面set中的数据校验和判断在构造器中也能使用
        setAge(age);
        setSalary(salary);
    }

3.2、继承

为什么学继承?

一个小问题,还是看个程序,提出代码复用的问题。

我们编写了两个类,一个是Pupil类(小学生),一个是Graduate(大学毕业生).问题:两个类的属性和方法有很多是相同的,怎么办?
=>继承(代码复用性~)

继承基本介绍和示意图

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

继承的基本语法

class 子类 extends 父类{

}

  • 1、子类就会自动拥有父类定义的属性和方法
  • 2、父类又叫超类,基类
  • 3、子类又叫派生类

继承快速入门

目录

复制代码
Student父类
java 复制代码
//父类,是pupil和graduate的父类
public class Student {
    //共有属性
    public String name;
    public int age;
    public double score;

    //共有的方法

    public void setScore(double score) {
        this.score = score;
    }

    public void info(){
        System.out.println("学生名:"+name+" 年龄"+age+" 成绩:"+score);
    }
}
复制代码
小学生Pupil子类
java 复制代码
//让pupil继承student类
public class Pupil extends Student {
    //小学生
    public void testing(){
        System.out.println("小学生"+ name +" 正在考小学数学..");
    }
}
复制代码
大学生Graduate子类
java 复制代码
//让pupil继承student类
public class Graduate extends Student {
    //大学毕业生
    public void testing(){
        System.out.println("大学生"+ name +" 正在考小学数学..");
    }
}
复制代码
Test测试类
java 复制代码
public class Test {
    public static void main(String[] args) {
        Pupil pupil = new Pupil();
        pupil.name = "银角大王";
        pupil.age = 10;
        pupil.testing();
        pupil.setScore(60);
        pupil.info();

        System.out.println("=========");
        Graduate graduate = new Graduate();
        graduate.name = "金角大王";
        graduate.age = 22;
        graduate.testing();
        graduate.setScore(100);
        graduate.info();
    }
}

继承给编程带来的遍历

  • 1、代码的复用性提高了
  • 2、代码的扩展性和维护下提高了

继承的深入探讨/细节问题

    1. 子类继承了所有的属性和方法,非私有的属性和方法可以在子类直接访问**,** 但是私有属性和方法不能在子类直接访问,要通过父类提供公共的方法去访问
    1. 子类必须调用父类的构造器, 完成父类的初始化
    1. 当创建子类对象时,不管使用子类的哪个构造器,默认情况下总会去调用父类的无参构造器,如果父类没有提供无参构造器,则必须在子类的构造器中用 super 去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译不会通过
    1. 如果希望指定去调用父类的某个构造器,则显式的调用一下 : super( 参数列表 )
    1. super 在使用时,必须放在构造器第一行 (super 只能在构造器中使用 )
    1. super() 和 this() 都只能放在构造器第一行,因此这两个方法不能共存在一个构造器
    1. java 所有类都是 Object 类的子类 , Object 是所有类的基类 .
    1. 父类构造器的调用不限于直接父类!将一直往上追溯直到 Object 类 ( 顶级父类 )
    1. 子类最多只能继承一个父类 ( 指直接继承 ) ,即 java 中是单继承机制
    1. 不能滥用继承,子类和父类之间必须满足 is-a 的逻辑关系

继承的本质

本质详解0293_韩顺平Java_继承本质详解_哔哩哔哩_bilibili

3.3、多态

4、Super关键字

基本介绍

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

基本语法

  • 1、访问父类的属性,但不能访问父类的private属性 【super.属性名;
  • 2、访问父类的方法,不能访问父类的private方法 【super.方法名(参数列表)
  • 3、访问父类的构造器 【super(参数列表);】只能放在构造器的第一句,只能出现一句!

super给编程带来的遍历/细节

  • 1、调用父类的构造器的好处:分工明确,父类属性由父类初始化,子类的属性由子类初始化
  • 2、当子类中有和父类中的成员(属性和方法)重名时,为了访问父类的成员,必须通过super。如果没有重名,使用super、this、直接访问是一样的效果!
  • 3.、super的访问不限于直接父类,如果爷爷类和本类中有同名的成员,也可以使用
    super去访问爷爷类的成员;如果多个基类(上级类)中都有同名的成员,使用st访问遵循就近原则。A->B->C,当然也需要遵守访问权限的相关规则

super和this的比较

5、方法重写/覆盖(overwrite)

基本介绍

方法覆盖(重写)就是子类有一个方法,和父类的某个方法的名称、返回类型、参数一样,那么我们就说子类的这个方法覆盖了父类的方法

方法重写快速入门

方法重写/覆盖注意事项和使用细节

  • 1、子类的方法的形参列表,方法名称,要和父类方法的形参列表方法名称完全一样。【演示】
  • 2、子类方法的返回类型和父类方法返回类型一样,或者是父类返回类型的子类比如父类返回类型是 Object ,子类方法返回类型是String【演示】
  • 3、子类万法不能缩小父类方法的访问权限【演示】public >protected >默认>private

方法重写和方法重载的区别

6、Object类详解,垃圾回收机制

7、项目

总结不易,希望宝宝们不要吝啬亲爱的👍哟(^U^)ノ~YO!如有问题,欢迎评论区批评指正😁

相关推荐
武子康3 分钟前
大数据-258 离线数仓 - Griffin架构 配置安装 Livy 架构设计 解压配置 Hadoop Hive
java·大数据·数据仓库·hive·hadoop·架构
豪宇刘1 小时前
MyBatis的面试题以及详细解答二
java·servlet·tomcat
秋恬意1 小时前
Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别
java·数据库·mybatis
eybk2 小时前
Pytorch+Mumu模拟器+萤石摄像头实现对小孩学习的监控
学习
6.942 小时前
Scala学习记录 递归调用 练习
开发语言·学习·scala
Aileen_0v02 小时前
【AI驱动的数据结构:包装类的艺术与科学】
linux·数据结构·人工智能·笔记·网络协议·tcp/ip·whisper
FF在路上2 小时前
Knife4j调试实体类传参扁平化模式修改:default-flat-param-object: true
java·开发语言
真的很上进2 小时前
如何借助 Babel+TS+ESLint 构建现代 JS 工程环境?
java·前端·javascript·css·react.js·vue·html
众拾达人3 小时前
Android自动化测试实战 Java篇 主流工具 框架 脚本
android·java·开发语言
皓木.3 小时前
Mybatis-Plus
java·开发语言