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!如有问题,欢迎评论区批评指正😁

相关推荐
weixin_472339462 分钟前
高效处理大体积Excel文件的Java技术方案解析
java·开发语言·excel
小毛驴85029 分钟前
Linux 后台启动java jar 程序 nohup java -jar
java·linux·jar
DKPT1 小时前
Java桥接模式实现方式与测试方法
java·笔记·学习·设计模式·桥接模式
好奇的菜鸟2 小时前
如何在IntelliJ IDEA中设置数据库连接全局共享
java·数据库·intellij-idea
巴伦是只猫3 小时前
【机器学习笔记Ⅰ】13 正则化代价函数
人工智能·笔记·机器学习
DuelCode3 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
优创学社24 小时前
基于springboot的社区生鲜团购系统
java·spring boot·后端
好好研究4 小时前
学习栈和队列的插入和删除操作
数据结构·学习
幽络源小助理4 小时前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring
猴哥源码4 小时前
基于Java+springboot 的车险理赔信息管理系统
java·spring boot