Java基础-面向对象进阶-static,继承
static
静态变量
- 特点:
- 被该类所有对象共享
- 不属于对象, 属于类
- 随着类的加载而加载, 优先于对象存在
- 调用方式:
- 类名调用(推荐)
- 对象名调用
静态方法和工具类
- 特点:
- 多用在测试类和工具类中
- JavaBean类中很少会用
- 调用方式:
- 类名调用(推荐)
- 对象名调用
java
// 数组工具类
import java.util.StringJoiner;
public class ArrayUtil {
private ArrayUtil(){}
public static String printArr(int[] nums) {
StringJoiner sj = new StringJoiner(", ", "[", "]");
for (int i = 0; i < nums.length; i++) {
sj.add(nums[i]+"");
}
return sj.toString();
}
public static double getAerage(double[] nums){
double ret = 0;
for (int i = 0; i < nums.length; i++) {
ret += nums[i];
}
return ret/nums.length;
}
}
// 学生工具类
import java.util.ArrayList;
public class StudentUtil {
private StudentUtil(){}
public static int getMaxAge(ArrayList<Student> students){
int ret = 0;
for (int i = 0; i < students.size(); i++) {
ret = Math.max(ret, students.get(i).getAge());
}
return ret;
}
}
static的注意事项
- 静态方法中, 只能访问静态
- 非静态方法可以访问所有方法
- 静态方法中没有this关键字
重新认识main方法
- public: 被JVM调用, 访问权限要足够大
- static:
- 被JVM调用, 不用创建对象, 直接类名访问
- 因为main方法是静态的, 所有测试类中其他方法也需要是静态的
- void: 被JVM调用, 不需要给JVM返回值
- main: 一个通用的名称, 虽然不是关键字, 但是被JVM识别
- String[] args: 以前用于接收键盘录入数据, 现在没用
继承
继承的概述
-
什么是继承、继承的好处
继承是面向对象三大特征之一,可以让类跟类之间产生子父的关系。
可以把多个子类中重复的代码抽取到父类中,子类可以直接使用,减少代码冗余,提高代码的复用性 -
继承的格式
javapublic class 子类 extends 父类
-
继承后子类的特点
子类可以得到父类的属性和行为,子类可以使用子类可以在父类的基础上新增其他功能,子类更强大
继承的特点
- Java只能单继承: 一个类只能继承一个直接父类
- Java不支持多继承, 但是支持多层继承
- Java中所有的类都直接或者间接继承于Object类
- 子类只能访问父类中非私有的成员
子类继承的内容
- 父类的构造方法不能被子类继承
- 父类的成员变量都能被子类继承, 但是私有的成员变量不能被调用
- 父类的成员方法在虚方法表中的能继承, 不在的不能继承(虚方法指的是非private, 非static, 非final)
子类继承内容的访问特点
成员变量访问特点
- 就近原则: 先在局部位置找, 本来成员位置找, 父类成员位置找, 逐级往上
- 成员变量重名
name
: 从局部位置往上找this.name
: 从本类成员位置往上找super.name
: 从父类成员位置往上找
java
public class demo {
public static void main(String[] args) {
Zi zi = new Zi();
zi.show();
}
}
class Fu{
String name = "Fu";
String hobby = "喝茶";
}
class Zi extends Fu{
String name = "Zi";
String game = "吃鸡";
public void show(){
// 打印Zi
System.out.println(name);
System.out.println(this.name);
// 打印Fu
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);
}
}
成员方法访问特点
- 成员方法访问特点 同 成员变量访问特点
- 方法重写注意事项和要求
@Override
: 校验重写是否正确, 同时可读性好- 重写方法的名称、形参列表必须与父类中的一致。
- 子类重写父类方法时,访问权限子类必须大于等于父类 (暂时了解:空着不写< protected< public)
- 子类重写父类方法时,返回值类型子类必须小于等于父类
- 建议:重写的方法尽量和父类保持一致。
- 只有被添加到虚方法表中的方法才能被重写
构造方法访问特点
- 子类不能继承父类的构造方法, 但是可以通过super调用
- 子类构造方法的第一行, 有一个默认的super()
- 默认先访问父类中无参的构造方法, 再执行自己
- 如果想访问父类有参构造, 必须手动书写
来源
黑马程序员. 阿玮Java零基础