当前位置: 首页 > news >正文

【Java语言】学习笔记-08面向对象【中级】包、访问修饰符、封装、继承、多态、Super、Override(重写)、Object、断点调试等细节详解(上)

在这里插入图片描述

跟着一位很厉害的老师学完了java基础,现开始进行javaSE复盘总结知识点,希望可以给java基础薄弱的友友提供一点参考,一起学习Java初级知识,共同进步,打好底层逻辑基础,爱上Java编程❤️❤️❤️
(本文章中知识点如有不同的见解,欢迎评论区留言)

tips: 本章在整个Java基础的知识点处于一个比较重要的地位,其中包括封装、继承、多态,属于我们java的一大特色,但同时这部分的内容比较多和琐碎,希望友友们反复观看笔记加深印象
本章内容较多分为上中下三篇,这里是上篇

让我们开始发车,加油
在这里插入图片描述

目录

  • 1、包(软件包)
    • 1.1、包 介绍
      • 1.1.1、包 的三大作用
    • 1.2、包 的本质快速入门
    • 1.3、包 的命名
    • 1.4、常用的 包
    • 1.5、如何使用包
      • 1.5.1、案例
      • 1.5.2、package使用事项
      • 1.5.3、类的完善
  • 2、访问修饰符
    • 2.1、验证四种访问修饰符
      • 2.1.1、同包下
      • 2.1.2、不同包下
      • 2.1.3、同一个包下
  • 3、封装
    • 3.1、封装的理解和好处
    • 3.2、封装实现步骤(三步)
    • 3.3、快速入门
    • 3.4、将构造器和setXxx结合
    • 3.5、小练习
  • 恭喜🎉你成功打败了30%的人
    • 继续努力

1、包(软件包)

  • 包的本质分析原理

包的本质实际上就是创建不同的文件夹/目录来保存类文件,示意图 :

在这里插入图片描述

1.1、包 介绍

1.1.1、包 的三大作用

在这里插入图片描述
JavaAPI文档连接: Java包使用方法API文档连接

包基本语法
package com.xiaohong;
package:关键字,表示打包.
com.xiaohong:表示包名

在这里插入图片描述

1.2、包 的本质快速入门

如果有两个包中两个同样的对象,那么引用时就会出现包名全名称
刚学java的同学很容易遇到这种问题💔,建了两个相同的类引入时出现了全路径变得不知所措,很可能是不小心创建了两次同一个类。
如果只想要一个类,解决方法就是把另一个包中的相同类删除。

在这里插入图片描述

(第一个不用报包名,第二个需要)

1.3、包 的命名

在这里插入图片描述

1.4、常用的 包

  • 常用的包

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

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

1.5、如何使用包

相信使用过软件的同学创建java文件时都见过这样的结构

在这里插入图片描述
在这里插入图片描述
代码演示

package com.fhsdu.pkg;

//建议:我们需要使用到哪个类,就导入哪个类即可,不建议使用 * 导入
import java.util.Scanner;//表示只会引入java.util 包下的Scanner
import java.util.*;//表示将java.util  包下的所有类都引入(导入)

public class Import01 {
    public static void main(String[] args) {

    }
}

1.5.1、案例

使用系统提供 Arrays 完成数组排序

使用Arrays,sort实现冒泡排序,自动引入java.util类

用哪个类就导入哪个,不要使用*

package com.fhsdu.pkg;
//注意:
//老韩建议:我们需要使用到哪个类,就导入哪个类即可,不建议使用 * 导入
import java.util.Arrays;
import java.util.Scanner;//表示只会引入java.util 包下的Scanner
//import java.util.*;//表示将java.util  包下的所有类都引入(导入)
public class Import01 {
    public static void main(String[] args) {
		//使用系统提供 Arrays  完成数组排序
        int[] arr = {-1 , 20, 2, 13, 3};
        //比如对其进行排序
        //传统方法是,自己编写排序(冒泡)
        //系统是提供了相关的类,可以方便完成 Arrays
        Arrays.sort(arr);
        for (int i = 0; i < arr.length ; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

在这里插入图片描述


1.5.2、package使用事项

//package的作用是声明当前类所在的包,需要放在类(或者文件)的最上面
//一个类中最多只有一句package

package com.fhsdu.pkg;

//import命令 位置放在package的下面, 在定义前面,可以有多句没有顺序要求

import java.util.Arrays;
import java.util.Scanner;

public class PkgDetail {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int[] arr = {0, -1, 1};
        Arrays.sort(arr);
    }
}

1.5.3、类的完善

在这里插入图片描述

2、访问修饰符

访问修饰符共有4个
public:全局可以使用,包括同类、同包、子类、不同包
protected:同类、同包、子类
默认:同类、同包
private:同类

  • 修饰符可以用来修饰类中的属性,成员方法以及类
  • 只有默认的public才能修饰类!并遵循上述访问权限的特点
  • 之后我们会学到继承,子类中的访问权限也遵循同样的规则
  • 成员方法的访问规则和属性完全一样
修饰符同类同包子类不同包
public
protected
默认void
private

2.1、验证四种访问修饰符

2.1.1、同包下

private不能访问

在这里插入图片描述

2.1.2、不同包下

只能访问public

在这里插入图片描述

2.1.3、同一个包下

3、封装

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

3.1、封装的理解和好处

3.2、封装实现步骤(三步)

3.3、快速入门

在这里插入图片描述

可以在setXxx中设置条件,来限制某些条件

代码实现

package com.fhsedu.encap;

public class Encapsulation01 {

    public static void main(String[] args) {
        Person person = new Person();
//        person.setName("jacktomcat 你好吗");长度错误
        person.setName("fhs");
        person.setAge(300);
        person.setSalary(6028.25);
        System.out.println(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 String info(){
        return "信息为: name=" + name +"  age=" + age + "  salary=" + salary;
    }
}

在这里插入图片描述

3.4、将构造器和setXxx结合

构造器中也可以设置条件

//main类
//如果我们自己使用构造器指定属性
        System.out.println("====smith的信息====");
        Person smith = new Person("smith", 200, 14250);
        System.out.println(smith.info());
//Person类
  //无参构造器
    public Person() {
    }
//  有三个属性的构造器
    public Person(String name, int age, double salary) {
        /*this.name = name;
        this.age = age;
        this.salary = salary;*/
        setName(name);
        setAge(age);
        setSalary(salary);
    }

3.5、小练习

创建两个类:Account和AccountTest

代码实现 :

package com.fhsdu.encap;

public class Account {
    //为了封装,将3个属性值设置为private
    private String name;
    private double balance;
    private String pwd;

    public Account() {
    }

    public Account(String name, double balance, String  pwd) {
        setName(name);
        setPwd(pwd);
        setBalance(balance);
    }
    public String getName() {
        return name;
    }

//名字(长度2位3位或4位)
    public void setName(String name) {
        if(name.length() >=2 &&name.length() <=4) {
            this.name = name;
        }else{
            System.out.println("名字长度有误(2~4位),默认为无名氏");
            this.name = "无名氏";
        }
    }

    public double getBalance() {
        return balance;
    }
//balance > 20
    public void setBalance(double balance) {
        if(balance > 20) {
            this.balance = balance;
        }else{
            System.out.println("余额必须大于二十,默认为0");
            this.balance = 0;
        }
    }

    public String getPwd() {
        return pwd;
    }
//pwd必须是6位
    public void setPwd(String  pwd) {
        if(pwd.length() == 6) {
            this.pwd = pwd;
        }else{
            System.out.println("你输入的密码长度有误,默认为:000000");
            this.pwd = "000000";
        }
    }
    //显示账号信息
    public void showInfo(){
        System.out.println("账号信息 name=" + name +
                " 余额" + balance + " 密码" + pwd);
    }
}

测试类

package com.fhsdu.encap;

public class TestAccount {
    public static void main(String[] args) {
        //创建Account
        Account account = new Account();
        account.setName("jack");
        account.setBalance(20);
        account.setPwd("123456");
        account.showInfo();
    }

}

恭喜🎉你成功打败了30%的人

在这里插入图片描述

继续努力

在这里插入图片描述

相关文章:

  • 6.1、认证技术基础与原理
  • [unity 点击事件] 区域响应点击事件,排除子节点区域,Raycast Target 应用
  • 埋点数据采集方案
  • 14、Python 枚举与类型注解进阶
  • 蓝桥云客 数字接龙
  • JAVA 单调栈习题解析
  • 入剖析 Android Compose 框架的关键帧动画(keyframes、Animatable)(二十三)
  • 蓝耘云平台免费 Token 获取攻略:让创作成本直线下降 - 极致优化版
  • Maven 构建配置文件
  • 工作效率upup
  • Ubuntu20.04.6系统根目录扩容
  • JWT 鉴权常见知识点及参考答案
  • nginx代理前端请求
  • 试试智能体工作流,自动化搞定运维故障排查
  • 地平线AlphaDrive:首个基于GRPO的自动驾驶大模型,仅用20%数据,性能超越SFT 35%!
  • Spring Boot整合Spring Data JPA
  • 报错 standard_init_linux.go:228: exec user process caused: exec format error
  • epoll:Linux 高性能 I/O 多路复用技术
  • 【零基础入门unity游戏开发——unity3D篇】3D模型 —— Animation动画页签
  • 备份比赛数据【算法赛】
  • 叙利亚多地遭以色列空袭
  • 全国铁路昨日发送2311.9万人次,同比增长11.7%创历史新高
  • 亚马逊一季度利润增超六成:云业务增速放缓,警告关税政策或影响业绩指引
  • 中央党校(国家行政学院)举行2025年春季学期第一批进修班毕业典礼
  • 工业富联一季度净利增长25%,云计算业务营收增长超50%
  • “75后”袁达已任国家发改委秘书长