面向对象进阶(上)(JAVA笔记第二十二期)

news2024/11/24 20:47:06

p.s.这是萌新自己自学总结的笔记,如果想学习得更透彻的话还是请去看大佬的讲解

目录

  • static修饰符
    • 静态变量
    • 静态方法
  • 工具类
    • 工具类的使用例子
      • 第一题
      • 第二题
  • static注意事项
  • 继承关系
    • 建立继承关系的格式
    • 继承的好处及使用场景
    • 继承的特点
    • 继承体系的设计
    • 继承中类的三大要素的访问特点
      • 继承中成员变量的访问特点
      • 继承中成员方法的访问特点
      • 方法的重写
      • 继承中成员方法的访问特点
      • this和super
    • 带有继承结构的标准Javabean类例题

static修饰符

static,翻译过来的意思为静态。static可以用来修饰成员变量,成员方法

被static修饰的成员变量叫做静态变量
被static修饰的成员方法叫做静态方法

静态变量

特点:被这个类所有的对象共享。其不属于某个对象,是属于类的
静态变量是随着类的加载而加载的,是优先于对象出现的

调用方式:

  • 类名调用(推荐)
  • 对象名调用

静态方法

特点:多用在测试类和工具类当中。javabean类中很少会使用

调用方式:

  • 类名调用(推荐)
  • 对象名调用

工具类

定义工具类的规则

  • 类名见名知意
  • 私有化构造方法,为了不让外界创建它的对象
  • 方法定义为静态,方便调用

工具类的使用例子

第一题

编写一个工具类ArrayUtil
提供一个工具类方法printArr,用于返回整数数组的内容,返回的字符串格式: [12,15,13,100] (只考虑一维整数数组)
提供这样一个工具方法getAverage,用于返回平均数(只考虑一维浮点型数组)
定义一个测试类Test,调用该工具类的工具方法,并返回结果

工具类

public class ArrayUtil {

    private ArrayUtil(){}


    public static String printArr(int[]arr){
        StringBuilder sb = new StringBuilder();
        sb.append("[");
        for (int i = 0; i < arr.length; i++) {
            if (i== arr.length-1) {
                sb.append(arr[i]);
            }
            else {
                sb.append(arr[i]).append(", ");
            }
        }
        sb.append("]");
        return sb.toString();
    }


    public static double getAverage(double[]arr){
        double sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum = sum + arr[i];
        }
        return  sum/arr.length;
    }
}

测试类

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

        int[]arr = new int[]{1,2,3,4,5};
        double[]arr2 = new double[]{1,2,3,4,5};


        String string = ArrayUtil.printArr(arr);
        System.out.println(string);

        double average = ArrayUtil.getAverage(arr2);
        System.out.println(average);
    }
}

第二题

需求:定义一个集合,用于存储3个学生对象
学生类的属性为:name、age、gender
定义一个工具类,用于获取集合中最大学生的年龄

javabean类

public class Student {
    private String name;
    private int age;
    private char gender;

    public Student() {}

    public Student(String name, int age, char gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }
}

工具类

import java.util.ArrayList;

public class StudentUtil {
    private StudentUtil() {}

    public static int getMaxAge(ArrayList<Student> list){

        int maxAge = list.get(0).getAge();
        for (int i = 1; i < list.size(); i++) {
            if (maxAge<=list.get(i).getAge()){
                maxAge = list.get(i).getAge();
            }
        }
        return maxAge;
    }


}

测试类

import java.util.ArrayList;

public class StudentTest {
    public static void main(String[] args) {
        ArrayList<Student> list = new ArrayList<>();

        Student student1 = new Student("张三",18,'男');
        Student student2 = new Student("李四",22,'女');
        Student student3 = new Student("王五",20,'男');

        list.add(student1);
        list.add(student2);
        list.add(student3);

        System.out.println(StudentUtil.getMaxAge(list));

    }
}

static注意事项

静态方法只能访问静态变量和静态方法
非静态的方法可以访问静态变量和静态方法,也可以访问非静态的成员变量和非静态的成员方法
静态方法中没有this关键字

简略来说:
静态方法中只能访问静态
非静态可以访问所有
静态方法中没有this关键字

详细解析看这里

继承关系

继承关系是类与类之间的关系。
比如学生老师会有的所有属性以及行为,也会有所不具有的、特有的属性(比如就读学校、就业学校)和行为(比如在学校学习、在学校教书)。
既然如此,当我们在写类(学生)类(老师) 的时候,可以将他们共有的属性(比如姓名)和行为(比如吃饭)提取出来写在一个新的类 类(人) 里面,而他们所特有的属性和行为就继续放在他们的类里面。这便是继承。
其中类(学生)类(老师) 称为子类类(人) 称为父类

继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
继承就是子类继承父类的特征和行为,使得子类对象具有父类的方法,或子类从父类继承方法,使得子类具有父类相同的行为。

子类可以得到父类的属性和行为,子类可以继续使用
子类可以在父类的基础上新增其他功能,使得子类更加强大

建立继承关系的格式

使用extends关键字,我们可以让一个类和另一个类建立起继承关系

格式

public class 子类 extends 父类{}

子类也叫派生类;父类也叫基类或超类

继承的好处及使用场景

继承可以把多个子类中的重复代码抽取到父类中,提高了代码的复用性
子类可以在父类的基础上再增加其他的功能,使子类更强大

当类与类之间,存在相同(共性)的内容,并满足子类是父类的一种时,就可以考虑使用继承来优化代码

继承的特点

JAVA只支持单继承、不支持多继承,但支持多层继承
单继承:一个子类只能继承一个直接父类
不支持多继承:子类不能同时继承多个父类
多层继承:子类A继承父类B,父类B可以继承父类C。父类B是子类A的直接父类,父类C是子类A的间接父类
每一个类都直接或间接的继承于Object
.
子类只能使用父类中非私有的成员,可以继承父类的成员变量(不论是否非私有)和非私有的成员方法,但是不能使用继承下来的父类中私有的成员变量。不能继承构造方法。如果父类的成员方法在虚方法表中就可以被继承,否则就不行

在这里插入图片描述
以内存图的形式解释原因

继承体系的设计

技巧:画图法
从下往上画,下面为子类,上面为父类
把子类的共性内容抽取到父类中
核心:共性内容抽取;子类是父类的一类

设计继承体系是要从父类开始写
下面为设计继承体系的例子

类(学生)

//设计继承体系
//给定4个学生:A、B、C、D
//暂时不考虑属性,只考虑行为
//按照继承的思想特点进行继承体系的设计


//A:学习、吃饭、玩游戏、emo
//B:学习、吃饭、玩游戏、emo
//C:学习、吃饭、追剧
//D:学习、吃饭、运动


public class Student {

    public  void eat(){
        System.out.println("吃饭!!");
    }
    public  void study(){
        System.out.println("学习");
    }
}

类(玩游戏和emo的学生)

public class PLAYandEMO__Students extends Student {
    private void play(){
        System.out.println("玩游戏!!");
    }
    private void emo(){
        System.out.println("emo");
    }
}

类(学生C)

public class StudentC {
    public void watchTY(){
        System.out.println("追剧中······");
    }
}

类(学生D)

public class StudentD {
    public void exercise(){
        System.out.println("运动中...");
    }
}

继承中类的三大要素的访问特点

继承中成员变量的访问特点

特点:就近原则:谁离我近,我就用谁
如果没有修饰符的话,先在局部位置找,再在本类成员位置找,再在父类成员位置找,逐级往上

举例

 class Fu{
    String name = "Fu";
}
 class Zi extends Fu{
    String name = "Zi";
    public void ziShow(){
        String name = "ziShow";
        System.out.println(name);
    }
}

输出

ziShow

当出现了重名的成员变量怎么办?
举例

class Fu {
    String name = "张三";
    String hobby = "内卷";
}

class Zi extends Fu{
    String name = "李四";
    String game = "卡拉彼丘";
    public void show(){

        //如何打印李四
        System.out.println(name);
        System.out.println(this.name);

        //如何打印张三
        System.out.println(super.name);

        //如何打印内卷
        System.out.println(hobby);//先在局部变量位置找,再在成员变量位置找,最后到父类成员变量位置中找
        System.out.println(this.hobby);//先在成员变量位置找,再到父类成员变量位置中找
        System.out.println(super.hobby);//到父类成员变量位置中找


        //如何打印卡拉彼丘
        System.out.println(game);
        System.out.println(this.game);

    }
}

继承中成员方法的访问特点

直接调用时满足就近原则:谁离我近,我就用谁
即先在本类中查找有无该方法,若有就调用本类的该方法,若没有就调用父类中继承下来的该方法
若用super调用就直接到父类中找

举例

public class Test {
    public static void main(String[] args) {
        Zi zi = new Zi();
        zi.eatLunch();
    }
}


class Fu {
   public void eat(){
       System.out.println("吃烧烤");
   }
   public void drink(){
       System.out.println("喝雪碧");
   }
}

class Zi extends Fu{

    public void eatLunch(){
        eat();//这里隐藏了一个this,所以其实这句话应该为 this.eat()
        drink();//同理

        super.eat();
        super.drink();

    }
    public void eat(){
        System.out.println("吃火锅");
    }
    public void drink(){
        System.out.println("喝加多宝");
    }
}

输出结果

吃火锅
喝加多宝
吃烧烤
喝雪碧

可以发现**类(zi)里面的eat()和drink()方法其实类(Fu)**里面的eat()和drink()方法重写了一遍得到的,而这我们便叫作方法的重写

方法的重写

当父类的方法不能满足子类现在的需求时,需要进行方法重写
.
书写格式:在继承体系中,子类出现了和父类一模一样的方法声明,我们就称子类这个方法是重写的方法
.
@override重写注解
@override是写在重写后的方法上面,校验子类重写时语法是否正确(虚拟机来校验)
若加上注解后出现红色波浪线,则表示语法错误
建议重写方法都加上@override重写注解,可以提高代码的安全性、可读性
.
方法重写的本质是将父类继承下来的虚方法表中的对应方法进行重写覆盖
虚方法表:类中没有被private、static、final修饰的方法的集合
.
注意事项:

  1. 重写方法的名称、形参列表必须与父类中的一致
  2. 子类重写父类方法时,访问权限子类必须大于父类(空着不写<protected<public)
  3. 子类重写父类时,返回值类型子类必须小于等于父类
  4. 重写方法时子类和父类尽量保持一致
  5. 只有被添加到虚方法表里的方法才能被重写

下面为方法重写在设计继承体系时的作用

 class TeacherTest {
     public static void main(String[] args) {
         TeacherA teacherA = new TeacherA();
         TeacherB teacherB = new TeacherB();
         TeacherC teacherC = new TeacherC();

         teacherA.eat();
         teacherA.teach();
         teacherA.game();


         teacherB.eat();
         teacherB.teach();


         teacherC.eat();
         teacherC.teach();


     }
}



//=========================================
class Teacher {
    //现在有三位老师,只考虑行为
    //设计一个继承体系
    //老师A:教书(语文) 、吃饭 、打游戏
    //老师B:教书(数学) 、吃饭
    //老师C:教书(英语) 、吃饭
    public void eat(){
        System.out.println("吃饭中");
    }
    public void teach(){
        System.out.println("老师在教书");
    }
}
//=========================================
class TeacherA extends Teacher{

    @Override
    public void teach(){
        System.out.println("老师在教语文");
    }
    public void game(){
        System.out.println("老师在打游戏");
    }

}
//=========================================
class TeacherB extends Teacher{

    @Override
    public void teach(){
        System.out.println("老师在教数学");
    }
}
//=========================================
class TeacherC extends Teacher{

    @Override
    public void teach(){
        System.out.println("老师在教英语");
    }
}

继承中成员方法的访问特点

父类中的构造方法不会被子类继承,但能通过super调用
.
子类中所有的构造方法默认先访问父类中的无参构造,再执行自己
原因:子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据
因此子类在初始化之前,一定要调用父类构造方法先完成父类数据空间的初始化
.
怎么调用的父类构造方法?
子类构造方法的第一行语句默认都是:super(),不写也存在,且必须在第一行
super() →调用父类的无参构造
如果想调用父类的有参构造,就必须手动写super进行调用

下面为调用父类的无参构造

public class Test1 {
    public static void main(String[] args) {
        Student1 student1 = new Student1();
         
    }
}
//======================================
class Person{
    String name;
    String id;

    public Person() {
        System.out.println("父类的无参构造被调用");
    }

    public Person(String name, String id) {
        this.name = name;
        this.id = id;
    }
}
//======================================
class Student1 extends Person{

    public Student1() {
        //子类构造方法中隐藏的super()方法是用来访问父类的无参构造的
        super();
        System.out.println("子类的无参构造被调用");
    }
}

输出

父类的无参构造被调用
子类的无参构造被调用

下面为调用父类的有参构造

public class Test1 {
    public static void main(String[] args) {
        Student1 student1 = new Student1("张三","001");
        System.out.println(student1.name+", "+student1.id);
    }
}
//======================================
class Person{
    String name;
    String id;

    public Person() {
        System.out.println("父类的无参构造被调用");
    }

    public Person(String name, String id) {
        this.name = name;
        this.id = id;
    }
}
//======================================
class Student1 extends Person{

    public Student1() {
        //子类构造方法中隐藏的super()方法是用来访问父类的无参构造的
        super();//这一步可以手动书写,程序会自动帮我们写
        System.out.println("子类的无参构造被调用");
    }

    public Student1(String name,String id) {
        super(name,id);//需要手动调用父类的有参构造
    }
}

输出

张三, 001

this和super

this可以理解为一个变量,表示当前方法调用者的地址值; super代表父类的存储空间
在这里插入图片描述
this访问本类构造方法举例

public class Students {
    String name;
    String id;
    String school;
    
    //要求:默认为为AA大学

    public Students() {
        this(null,null,"AA大学");
        //表示调用本类其他构造方法
        //这时虚拟机就不会再添加super()。因为其他构造方法开头有隐藏的super()
    }

    public Students(String name, String id, String school) {
        this.name = name;
        this.id = id;
        this.school = school;
    }
}

带有继承结构的标准Javabean类例题

需求:写出带有继承结构的标准Javabean类
1.经理
成员变量:工号、姓名、工资、成就
成员变量:工作(管理别人)、吃饭
2、厨师
成员变量:工号、姓名、工资
成员方法:工作(炒菜)、吃饭

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2220334.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaWeb 22.Node.js_简介和安装

有时候&#xff0c;后退原来是向前 —— 24.10.7 一、什么是Node.js Node.js 是一个于 Chrome V8 的 JavaScript 运行时环境&#xff0c;可以使 JavaScript 运行在服务器端。使用 Node.js&#xff0c;可以方便地开发服务器端应用程序&#xff0c;如 Web 应用、API、后端服务&a…

使用Three.js和Force-Directed Graph实现3D知识图谱可视化

先看样式&#xff1a; 在当今信息爆炸的时代&#xff0c;如何有效地组织和展示复杂的知识结构成为一个重要的挑战。3D知识图谱可视化是一种直观、交互性强的方式来呈现知识之间的关系。本文将详细介绍如何使用HTML、JavaScript、Three.js和Force-Directed Graph库来实现一个交互…

基于SpringBoot+Vue+uniapp微信小程序的社区门诊管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

解决:YOLOv8训练数据集时P、R、mAP等值均为0的问题

文章目录 问题解决1.匹配pytorch与cuda的版本2.使用 Adam 优化器3.加大训练轮数epoch4. 删除data/labels下的train.cache和val.cache 问题 使用YOLOv8训练自己的数据集时&#xff0c;出现P、R、mAP等值均为0的问题 Model summary (fused): 186 layers, 2,685,733 parameters, …

【 Git 】git push 出现报错 fatal: Could not read from remote repository.

git push 出现报错 fatal: Could not read from remote repository. 问题描述解决方案 问题描述 Connection closed by 198.18.0.xx port xx fatal: Could not read from remote repository.Please make sure you have the correct access rights and the repository exists.解…

【JavaScript】Javascript基础Day04:函数

Javascript——Day04 01. 函数的基本使用02. 函数的参数以及默认参数03. 匿名函数之函数表达式04. 逻辑中断05. 转换为布尔型 01. 函数的基本使用 02. 函数的参数以及默认参数 注意&#xff1a; 03. 匿名函数之函数表达式 函数&#xff1a;匿名函数/具名函数 为什么这个外部…

【wpf】07 后端验证及令牌码获取步骤

由于在用wpf开发应用程序时&#xff0c;从后端获取数据需要用到 Authorization 授权的Bearer令牌&#xff0c;而这个令牌的获取需要登录后台进行获取&#xff0c;这里登录时还涉及到的验证码的操作&#xff0c;所以在获取过程中&#xff0c;需要对后台系统进行登录并拿到这个Be…

【天池比赛】【零基础入门金融风控 Task2赛题理解】【2.3.6】

【天池比赛】【零基础入门金融风控 Task2赛题理解】【2.3.1-2.3.5】 2.3.6 变量分布可视化 2.3.6.1 单一变量分布可视化 对于 pandas.core.series.Series 类型的变量&#xff1a; index&#xff1a;含义&#xff1a;它表示 Series 对象的索引&#xff0c;也就是每个数据点对…

智能手表核心芯片~手表心率监测芯片AFE4900浅析(附一篇智能手表专利推荐)

智能手表核心芯片~手表心率监测芯片AFE4900浅析(附一篇智能手表专利推荐) 本期是平台君和您分享的第89期内容 2024年8月,安徽华米信息技术及美国的智能手表品牌ZEPP公司在美国对深圳思佰特公司提起诉讼,涉及专利、商标和不正当竞争。 起诉书(来源:RPX网站) 看到这则新闻…

面试官:并发时,故意不加锁会怎么样?

感谢Java面试教程关于并发锁的面试分享 在并发编程中&#xff0c;如果不加锁&#xff0c;可能会导致以下问题&#xff1a; 数据不一致&#xff1a;多个线程同时访问和修改共享资源时&#xff0c;如果没有加锁&#xff0c;可能会导致数据竞争&#xff0c;即一个线程在读取数据…

Maven入门到进阶:构建、依赖与插件管理详解

文章目录 一、Maven介绍1、什么是Maven2、Maven的核心功能 二、Maven核心概念1、坐标GAVP1.1、GroupId1.2、ArtifactId1.3、Version1.3.1、版本号的组成 1.4、Packaging 2、POM、父POM和超级POM2.1、POM (Project Object Model)2.1、父POM&#xff08;Parent POM&#xff09;2.…

算法的学习笔记—丑数(牛客JZ49)

&#x1f600;前言 在程序设计和算法竞赛中&#xff0c;丑数问题是一个经典的动态规划题目。丑数&#xff08;Ugly Number&#xff09;定义为只包含质因子 2、3 和 5 的数。举例来说&#xff0c;数字 6&#xff08;因子为 2 和 3&#xff09;、数字 8&#xff08;因子为 2&…

gewechat免费开源微信机器人开发

​聊天机器人&#xff0c;是一种通过自然语言模拟人类进行对话的程序。通常运行在特定的软件平台上&#xff0c;如PC平台或者移动终端设备平台。聊天机器人系统的主要功能是同用户进行基本沟通并自动回复用户有关产品或服务的问题&#xff0c;以实现降低企业客服运营成本、提升…

珊瑚岛风灵月影四十九项修改器:体力不减/生命不减/开启金钱修改

珊瑚岛是一款以模拟经营岛屿为特色的休闲养成游戏。在游戏中&#xff0c;玩家需设法吸引顾客消费。同时&#xff0c;还需投入时间和资源修复遗址&#xff0c;过程中或会遇到技术、资金及文化保护等挑战&#xff0c;增添游戏趣味与深度。 修改器地址&#xff1a; https://downf…

力扣——链表的中间结点(链表)C语言

题目&#xff1a; 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。如果有两个中间结点&#xff0c;则返回第二个中间结点。 返回中间3这个结点&#xff1b; 返回中4这个结点&#xff1b; 原理&#xff1a; 思路1&#xff1a;利用遍历链表&#xff0c;统…

图文深入理解java的内存分配

本篇图文深入讨论java的内存分配。当然&#xff0c;这里所说的深入&#xff0c;并不是指长篇大论&#xff0c;而是就事论事重点深入介绍java的内存分配原理机制。 在理解java如何为变量或者对象分配内存之前&#xff0c;我们先来了解一个问题&#xff1a;为什么需要分配内存&am…

新电脑Win11家庭中文版跳过联网激活方法(教程)

预装Win11家庭中文版的新电脑&#xff0c;如何跳过联网激活&#xff1b;由于微软限制必须要联网激活&#xff0c;需要使用已有的微软账户登入或者注册新的微软账户后才可以继续开机使用&#xff0c;Win11联网后系统会自动激活。下面介绍一下初次开机初始化电脑时如何跳过联网激…

今年双十一最值得入手的好物有哪些?双十一值得选购的好物盘点!

在这个全民狂欢的购物盛宴——双十一&#xff0c;每一个角落都弥漫着诱人的优惠与不可错过的精品。从科技潮品到生活必需品&#xff0c;从时尚尖货到家居好物&#xff0c;无数精选商品在这一季集中绽放&#xff0c;等待着慧眼识珠的你将它们带回家&#xff0c;今年的双十一&…

除GOF23种设计模式之简单工厂模式

文章目录 1. 简介2. 代码2.1 抽象类&#xff1a;Course.java2.2 产品A:JavaCourse.java2.3 产品B:PythonCourse.java2.4 工厂:CourseFactory.java2.5 测试&#xff1a;Test.java 3. 心得参考链接&#xff08;无&#xff09; 1. 简介 简单工厂模式(Simple Factory Patern):又称…

Java项目-基于springboot框架的网上书城系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…