面向对象进阶——static、继承

一、static

1、静态变量

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

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

特点:

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

调用方式:

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

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

特点:

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

调用方法:

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

 ⭐静态变量是随着类的加载而加载的,优先于对象出现的

2、工具类

帮助我们做一些事情的,但是不描述任何事物的类
Javabean类     用来描述一类事物的类。比如,Student,Teacher,Dog,Cat等
测试类             用来检查其他类是否书写正确,带有main方法的类,是程序的入口
工具类             不是用来描述一类事物的,而是帮我们做一些事情的类。

练习——定义数组工具类

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

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

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

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

  • 提供这样一个工具方法getAverage,用于返回平均分。(只考虑浮点型数组,且只考虑一维数组)
  • 定义一个测试类TestDemo,调用该工具类的工具方法,并返回结果。

工具类: 

 

测试类:

练习——定义学生工具类

需求:定义一个集合,用于存储3个学生对象

学生类的属性为:name、age、gender

定义一个工具类,用于获取集合中最大学生的年龄。

创建JavaBean类

创建工具类

测试类:

3、static的注意事项 

总结:   静态方法中,只能访问静态。

              非静态方法可以访问所有。

              静态方法中没有this关键字

 二、继承

一、继承的概述

1、继承的概念及格式

继承是面向对象三大特征之一,可以让类跟类之间产生子父的关系。

Java中提供一个关键字extends,用这个关键字,我们可以让一个类和另一个类简历继承关系。

public class Student extends Person { }

 Student称为子类(派生类),Person称为父类(基类或超类)

2、使用继承的好处

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

3、什么时候用继承?

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

 4、继承后子类的特点

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

二、继承的特点和继承体系的设计 

1、继承的特点

  • Java只支持单继承:一个类只能继承一个直接父类。
  • Java不支持多继承,但支持多层继承。 
  • Java中所有的类都直接或者间接继承于Object类⭐⭐⭐
多层继承:子类 A 继承父类B,父类B 可以 继承父类C

2、继承体系的设计

1.Java只能单继承,不能多继承、但是可以多层继承

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

3.子类只能访问父类中非私有的成员

4.独立完成继承体系的案例

二、子类到底能继承父类中的哪些内容?

构造方法非私有   不能private 不能
成员变量非私有      能private   能,但不能直接调用,用get,set方法
成员方法非私有      能private 不能

A类                  继承        B类              继承               C类

方法A                            方法B                                  方法C

                               

虚方法表                       虚方法表                              虚方法表

在B的基础上                 在C的基础上                         非private

再添加自己类中            再添加自己类中                     非static

的虚方法                       的虚方法                                非final

                           

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

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

总结:

1、继承中成员变量访问特点:就近原则

先在局部位置找,本类成员位置找,父类成员位置找,逐级往上。

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

就近原则:谁离我近,我就用谁

public Class Fu{

              String name ="Fu";

}

public class Zi extends Fu{

         String name = "Zi";

         public void ziShow( ){

             String name = "ziShow";

              System.out.printIn(name); //ziShow   从局部位置往上找

              System.out.printIn(this.name); //Zi      从本类成员位置开始往上找

              System.out.printIn(super.name);//Fu   从父类成员位置开始往上找

         }

}             ⭐this 先找本类,若没有就从父类找

                ⭐super调用父类中的行为

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

①  方法的重写

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

②   书写格式

在继承体系中,子类出现了和父类中一模一样的方法声明,我们就称子类这个方法是重写的方法。

③   @Override重写注解

1、@Override是放在重写的方法上面,校验子类重写时语法是否正确。

2、加上注解后如果有红色波浪线,表示语法错误。

3、建议重写方法都加@Override注解,代码安全,优雅!

class Person{

        public  void eat( ){

              System.out.printIn("吃米饭,吃菜");

        }

        public void drink( ){

              System.out.printIn("喝开水");

        }

}

public OverseasStudent extends Person{        

            public  void lunch( ){

                this.eat( );

                 super.drink( );

            }     

            @Override   

            public  void eat( ){

                System.out.printIn("吃方便面");

             } 

           @Override       

            public void drink( ){

                 System.out.printIn("喝开水");

             }

}

3、方法重写注意事项和要求

1、重写方法的名称、形参列表必须与父类中的一致。

2、子类重写父类方法时,访问权限子类必须大于等于父类

(暂时了解:空着不写<protected<public)

3、子类重写父类方法时,返回值类型必须小于等于父类

⭐4、建议:重写的方法尽量和父类保持一致。

⭐5、只有被添加到虚方法表中的方法才能被重写

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

现在有三种动物:哈士奇、沙皮狗、中华田园犬
暂时不考虑属性,只要考虑行为。
请按照继承的思想特点进行继承体系的设计。
三种动物分别有以下的行为:

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

父类Dog 

哈士奇

沙皮狗

中华田园犬

测试类: 

结果 

 四、继承中的构造方法和thissuper关键字

1、继承中:构造方法的访问特色

  • 父类中的构造方法不会被子类继承。
  • 子类中所有的构造方法默认先访问父类中的无参构造,再执行自己。 

为什么?

  • 子类在初始化的时候,有可能会使用到父类中的数据,如果父类没有完成初始化,子类将无法使用父类的数据。
  • 子类初始化之前,一定要调用父类构造方法先完成父类数据空间的初始化。

怎么调用父类构造方法的?

  • 子类构造方法的第一行语句默认都是:super( ), 不写也存在, 且必须在第一行。 
  • 如果想调用父类有参构造,必须手动写super进行调用。

 总结:1、继承中构造方法访问特点是什么?

  • 子类不能继承父类的构造方法,但是可以通过super调用
  • 子类构造方法的第一行,有一个默认的super( );
  • 默认先访问父类中无参的构造方法,再执行自己。
  • 如果想要访问父亲的有参构造,必须手动书写。

2、this、super使用总结

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

super:代表父类存储空间。 

关键字访问成员变量访问成员方法访问构造方法
this

this.成员变量

访问本类成员变量
 

this.成员方法(...)

访问本类成员方法

this(...)

访问本类构造方法

super super.成员变量

访问父类成员变量

super.成员方法(...)

访问父类成员方法

super(...)

访问父类构造方法

3、练习——带有继承结构的标准Javabean类

1、经理

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

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

2、厨师

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

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

父类、 Javabean类

管理员 

厨师

 

测试类 

结果:

  • 16
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值