JavaSE(09) - 面向对象进阶

发布时间 2023-11-04 18:24:38作者: 大宝贝94106

JavaSE(09) - 面向对象进阶

p121 static关键字

static表示静态, 是java中的一个修饰符, 可以修饰成员方法,成员变量.

一, 被static修饰的成员变量, 叫做静态变量.

特点:

  • 被改类所有对象共享
  • 不属于对象属于类
  • 随着类的加载而加载, 优先于对象存在

调用方式:

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

p122 静态方法和工具类

二, 被static修饰的成员方法, 叫做静态方法.

特点:

  • 多用在测试类和工具类中
  • Javabean类中很少会用

调用方式:

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

工具类: 帮助我们做一些事情的, 但是不描述任何事物的类

javabean类: 用来描述一类事物的类. 比如: Student, Teacher, Dog,Cat...

测试类: 用来检查其它类是否书写正确, 带有main方法的类,是程序的入口.

定义工具类的规则:

  1. 见名知意
  2. 私有化构造方法
  3. 方法定义为静态

练习(61题) 定义数组工具类

需求:在实际开发中,经常会遇到一些数组使用的工具类。

请按照如下要求编写一个数组的工具类:ArrayUtil

  • 提供一个工具类方法printArr,用于返回整数数组的内容。

返回的字符串格式如:[10,20, 50,34, 100](只考虑整数数组,且只考虑一维数组)

  • 提供这样一个工具方法getAerage,用于返回平均分。(只考虑浮点型数组,且只考虑一维数组)
  • 定义一个测试类TestDemo,调用该工具类的工具方法,并返回结果。
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 += arr[i];
        }
        return sum/arr.length;
    }
}

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

package UtilClass;
//Javabean类
public class Student {
    private String name;
    private int age;
    private String gender;
//////////////////////////////...  ...
package UtilClass;
//Util 工具类
import java.util.ArrayList;
/*练习(62题)  定义学生工具类
需求: 定义一个集合, 存储3个学生对象.
属性为: name,age,gender.  定义一个工具类, 用于获取集合中最大学生的年龄.*/
public class StudentUtil {
    private StudentUtil() {
    }
    //获取集合中最大学生的年龄的方法
    public static int getMaxAge(ArrayList<Student> list){
        //定义一个参照物,集合0索引的age
        int MaxAge = list.get(0).getAge();
        //再从第二个1索引开始比较,以提高代码效率
        for (int i = 1; i < list.size(); i++) {
            int tempAge = list.get(i).getAge();
           if (tempAge > MaxAge){
               MaxAge = tempAge;
           }
        }
        return MaxAge;
    }
}
////////////////////////////
    package UtilClass;
//测试类
import java.util.ArrayList;
public class test {
    public static void main(String[] args) {
        ArrayList<Student> list = new ArrayList<>();
        Student s1 = new Student("a",10,"girl");
        Student s2 = new Student("b",15,"girl");
        Student s3 = new Student("c",12,"boy");
        list.add(s1);
        list.add(s2);
        list.add(s3);
        //调用方法获取集合中最大学生的年龄
        int maxAge = StudentUtil.getMaxAge(list);
        System.out.println(maxAge);
    }
}

p123 static关键字的注意事项

静态方法中没有this关键字.

静态方法中,只能访问静态

非静态方法可以访问所有 , 非静态变量又叫"实例变量"(和对象有关)

简单理解就是静态变量和方法和类一起加载, 在实体变量加载之前.有静态时没有实体.所有实体可以调用静态, 静态不能调用实体.

p124 继承的概述

  1. 什么时候用继承?

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

  1. 继承的格式?
public class 子类 extends 父类 {}
  1. 继承后子类的特点?

子类可以得到父类的属性和方法, 子类可以使用.

子类可以在父类的基础上新增其它功能, 使子类更强大.

p125 继承的特点和体系的设计

Java只支持单继承, 不支持多继承, 但支持多层继承.

Java中所有的类都直接或者间接继承于Object类.

在设计继承体系时候, 要先画继承图再写代码, 画图时要从下往上画(先子类后父类,抽取共性), 写代码时要从上往下写(先父类后子类,梳理继承关系).

注意事项: 子类只能访问父类中非私有的成员.

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

在继承体系中:

构造方法 不能被继承

成员变量 不管是不是私有的, 都能被继承.(私有的不能直接使用)

成员方法 只有父类的虚方法才能被子类继承.

虚方法表 父类中的非private, 非static, 非final方法称为虚方法.

p127 继承中成员变量和成员方法的访问特点

继承中成员变量的访问特点: *** 就近原则: 谁离我近,我就用谁.***

先在局部位置找,如果没有就在本类里面找,最后再去父类里找,如果再找不到就会报错.

如果出现了重名的成员变量怎么办?

System.out.println(name);		//从局部位置往上找
System.out.println(this.name);	//从本类成员位置开始往上找
System.out.println(super.name);	//从父类成员位置开始往上找

继承中成员方法的访问特点: *** 就近原则: 谁离我近,我就用谁.***

和上面成员变量的继承特点一样.

方法的重写

当父类的方法不能满足子类现在的需求时, 就需要进行方法重写.

@Override重写注解

  1. @Override是放在重写后的方法上, 校验子类重写时语法是否正确.
  2. 加上注解后如果有红色波浪线, 表示语法错误.
  3. 建议重写方法都加上@Override注解, 代码安全, 优雅.

方法重写的注意事项和要求

  1. 方法重写的名称, 形参列表必须与父类一致.
  2. 子类重写父类方法时,访问权限子类必须大于等于父类.
  3. 子类重写父类方法时,返回值类型子类必须小于等于父类.
  4. 建议: 重写的方法尽量和父类保持一致.
  5. 只有被添加到虚方法表中的方法才能被重写.(非private, 非static, 非final方法)

方法重写的本质: 覆盖虚方法表中的方法.

练习: 利用方法重写设计继承结构

​ 有三种动物 : 哈士奇, 沙皮狗, 中华田园犬. 暂时不考虑属性, 只考虑行为.设计继承结构

  • 哈士奇: 吃饭(吃狗粮), 喝水, 看家, 拆家
  • 沙皮狗: 吃饭(吃狗粮,吃骨头), 喝水, 看家,
  • 中华田园犬: 吃饭(吃剩饭), 喝水, 看家,

128 继承中的构造方法和this,super关键字

  • 子类不能继承父类的构造方法, 但是可以通过super调用

  • 子类构造方法的第一行语句默认都是: super(), 不写也存在, 且必须在第一行.

  • 默认先访问父类中的无参构造方法, 再执行自己的.

  • 如果想调用父类有参构造给成员变量赋值, 必须手动写super进行调用.

this, super使用总结

  • this : 理解为一个变量, 表示当前方法调用者的地址.

  • super : 代表父类存储空间.

  • this(); 可以访问本类的其它构造方法(给一些数据给默认值时)

练习: 带有继承结构的标准Javabean类

1.经理

成员变量 : 工号, 姓名, 工资, 管理奖金

成员方法 : 工作(管理其他人) , 吃饭(吃米饭)

2.厨师

成员变量 : 工号, 姓名, 工资,

成员方法 : 工作(炒菜) , 吃饭(吃米饭)

员工employee , 经理manager, 厨师cook