文章目录
提示:以下是本篇文章正文内容,可供参考
static关键字
static表示静态,是Java中的一个修饰符,可以修饰成员方法,成员变量
- 特点:
被该类所有对象共享 - 调用方式:
类名调用(推荐)
对象名调用
静态变量是随着类的加载而加载的,优先于对象出现的
工具类
作用:帮助我们做一些事情的,但是不描述任何事物的类
注意事项:
1.类名见名知意
2.私有化构造方法
3.方法定义为静态
代码演示:
工具类:
// 计算数组平均数的一个工具类
public class ArrayUtil {
// 1.私有化构造方法
// 目的:为了不让外界创建他的对象
private ArrayUtil(){
}
// 方法定义为静态
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) {
// 测试工具类
double[] arr = {1,2,3,4,5};
double average = ArrayUtil.getAverage(arr);
System.out.println(average);
}
}
运行结果:
static的注意事项
-
静态方法只能访问静态变量和静态方法
-
非静态方法可以访问静态变量或者静态方法,也可以访问非静态的成员变量和非静态的成员方法
-
静态方法中是没有this关键字
总结:静态方法中,只能访问静态。
非静态方法可以访问所有。静态方法中没有this关键字
继承
概念
Java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类建立起继承关系。
继承的格式:
public class Student extends Person { }
Student称为子类(派生类),Person称为父类(基类或超类)。
使用继承的好处
可以把多个子类中重复的代码抽取到父类中了,提高代码的复用性。
子类可以在父类的基础上,增加其他的功能,使子类更强大。
什么时候用继承?
当类与类之间,存在相同(共性)的内容,并满足子类是父类中的一种,就可以考虑使用继承,来优化代码
继承后子类的特点?
子类可以得到父类的属性和行为,子类可以使用。子类可以在父类的基础上新增其他功能,子类更强大。
继承的特点
-
Java只支持单继承,不支持多继承,但支持多层继承。
-
单继承:一个子类只能继承一个父类
-
不支持多继承:子类不能同时继承多个父类
-
子类只能访问父类中非私有的成员
多层继承:子类A继承父类B,父类B可以继承父类C
每一个类都直接或者间接的继承于Object
子类到底能继承父类中的哪些内容?
继承中:成员变量的访问特点
就近原则:谁离我近,我就用谁
先在局部位置找,本类成员位置找,父类成员位置找,逐级往上。
如果出现了重名的成员变量怎么办?
System.out.println(name); 从局部位置开始往上找
System.out.println(this.name ) ;从本类成员位置开始往上找
System.out.println(super.name);从父类成员位置开始往上找
继承中:成员方法的访问特点
- 直接调用满足就近原则:谁离我近,我就用谁
- super调用,直接访问父类
代码演示:
public class test {
public static void main(String[] args) {
Teacher s = new Teacher();
s.lunch();
}
}
class Person{
public void eat(){
System.out.println("我爱吃米饭");
}
public void drink(){
System.out.println("喝水");
}
}
class Student extends Person{
public void lunch(){
//先在本类中查看eat和drink方法,就会调用子类的,如果没有,就会调用从父类中继承下来的eat和drink方法
this.eat();
this.drink();
}
}
class Teacher extends Person{
public void lunch(){
this.eat();
this.drink();
super.drink();
super.eat();
}
public void eat(){
System.out.println("我爱吃汉堡包");
}
public void drink(){
System.out.println("喝茶");
}
}
运行结果:
方法的重写
当父类的方法不能满足子类现在的需求时,需要进行方法重写
书写格式
在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法。
@Override:重写注解
1.@Override是放在重写后的方法上,校验子类重写时语法是否正确。
2.加上注解后如果有红色波浪线,表示语法错误。
3.建议重写方法都加@Override注解,代码安全,优雅!
应用场景:
当父类中方法,不能满足子类现在的需求时,我们就需要把这个方法进行重写。
注意:子类中重写的方法上面需要加上@Override注解
正如上面的Teacher类当中的eat和drink方法就是重写了父类Person当中的方法
方法重写注意事项和要求
1.重写方法的名称、形参列表必须与父类中的一致。
2.子类重写父类方法时,访问权限子类必须大于等于父类(暂时了解︰空着不写< protected < public)
3.子类重写父类方法时,返回值类型子类必须小于等于父类
4。建议:重写的方法尽量和父类保持一致。
5.私有方法不能被重写。
6.子类不能重写父类的静态方法,如果重写会报错的。
本质:只有被添加到虚方法表中的方法才能被重写
继承中:构造方法的访问特点
-
父类中的构造方法不会被子类继承。
-
子类中所有的构造方法默认先访问父类中的无参构造,再执行自己。
为什么?
答:子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。
- 子类初始化之前,一定要调用父类构造方法先完成父类数据空间的初始化。
怎么调用父类构造方法的?
子类构造方法的第一行语句默认都是: super(),不写也存在,且必须在第一行。
如果想调用父类有参构造,必须手动写super进行调用。
this、super使用总结
this:理解为一个变量,表示当前方法调用者的地址值;
super:代表父类存储空间。