JavaSE(09) - 面向对象进阶
p121 static关键字
static表示静态, 是java中的一个修饰符, 可以修饰成员方法,成员变量.
一, 被static修饰的成员变量, 叫做静态变量.
特点:
- 被改类所有对象共享
- 不属于对象属于类
- 随着类的加载而加载, 优先于对象存在
调用方式:
- 类名调用(推荐)
- 对象名调用
p122 静态方法和工具类
二, 被static修饰的成员方法, 叫做静态方法.
特点:
- 多用在测试类和工具类中
- Javabean类中很少会用
调用方式:
- 类名调用(推荐)
- 对象名调用
工具类: 帮助我们做一些事情的, 但是不描述任何事物的类
javabean类: 用来描述一类事物的类. 比如: Student, Teacher, Dog,Cat...
测试类: 用来检查其它类是否书写正确, 带有main方法的类,是程序的入口.
定义工具类的规则:
- 见名知意
- 私有化构造方法
- 方法定义为静态
练习(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 继承的概述
- 什么时候用继承?
当类与类之间, 存在相同(共性)的内容, 并满足子类是父类中的一种, 就可以考虑使用继承, 来优化代码.
- 继承的格式?
public class 子类 extends 父类 {}
- 继承后子类的特点?
子类可以得到父类的属性和方法, 子类可以使用.
子类可以在父类的基础上新增其它功能, 使子类更强大.
p125 继承的特点和体系的设计
Java只支持单继承, 不支持多继承, 但支持多层继承.
Java中所有的类都直接或者间接继承于Object类.
在设计继承体系时候, 要先画继承图再写代码, 画图时要从下往上画(先子类后父类,抽取共性), 写代码时要从上往下写(先父类后子类,梳理继承关系).
注意事项: 子类只能访问父类中非私有的成员.
p126 子类到底能继承父类中的哪些内容
在继承体系中:
构造方法 不能被继承
成员变量 不管是不是私有的, 都能被继承.(私有的不能直接使用)
成员方法 只有父类的虚方法才能被子类继承.
虚方法表 父类中的非private, 非static, 非final方法称为虚方法.
p127 继承中成员变量和成员方法的访问特点
继承中成员变量的访问特点: *** 就近原则: 谁离我近,我就用谁.***
先在局部位置找,如果没有就在本类里面找,最后再去父类里找,如果再找不到就会报错.
如果出现了重名的成员变量怎么办?
System.out.println(name); //从局部位置往上找
System.out.println(this.name); //从本类成员位置开始往上找
System.out.println(super.name); //从父类成员位置开始往上找
继承中成员方法的访问特点: *** 就近原则: 谁离我近,我就用谁.***
和上面成员变量的继承特点一样.
方法的重写
当父类的方法不能满足子类现在的需求时, 就需要进行方法重写.
@Override重写注解
- @Override是放在重写后的方法上, 校验子类重写时语法是否正确.
- 加上注解后如果有红色波浪线, 表示语法错误.
- 建议重写方法都加上@Override注解, 代码安全, 优雅.
方法重写的注意事项和要求
- 方法重写的名称, 形参列表必须与父类一致.
- 子类重写父类方法时,访问权限子类必须大于等于父类.
- 子类重写父类方法时,返回值类型子类必须小于等于父类.
- 建议: 重写的方法尽量和父类保持一致.
- 只有被添加到虚方法表中的方法才能被重写.(非private, 非static, 非final方法)
方法重写的本质: 覆盖虚方法表中的方法.
练习: 利用方法重写设计继承结构
有三种动物 : 哈士奇, 沙皮狗, 中华田园犬. 暂时不考虑属性, 只考虑行为.设计继承结构
- 哈士奇: 吃饭(吃狗粮), 喝水, 看家, 拆家
- 沙皮狗: 吃饭(吃狗粮,吃骨头), 喝水, 看家,
- 中华田园犬: 吃饭(吃剩饭), 喝水, 看家,
128 继承中的构造方法和this,super关键字
-
子类不能继承父类的构造方法, 但是可以通过super调用
-
子类构造方法的第一行语句默认都是: super(), 不写也存在, 且必须在第一行.
-
默认先访问父类中的无参构造方法, 再执行自己的.
-
如果想调用父类有参构造给成员变量赋值, 必须手动写super进行调用.
this, super使用总结
-
this : 理解为一个变量, 表示当前方法调用者的地址.
-
super : 代表父类存储空间.
-
this(); 可以访问本类的其它构造方法(给一些数据给默认值时)
练习: 带有继承结构的标准Javabean类
1.经理
成员变量 : 工号, 姓名, 工资, 管理奖金
成员方法 : 工作(管理其他人) , 吃饭(吃米饭)
2.厨师
成员变量 : 工号, 姓名, 工资,
成员方法 : 工作(炒菜) , 吃饭(吃米饭)
员工employee , 经理manager, 厨师cook