基本概念

类,对象,类的定义和对象的使用

局部变量&成员变量

image.png
成员变量和局部变量的区别
成员变量:

  1. ①成员变量定义在类中,在整个类中都可以被访问。
  2. ②成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中。
  3. ③成员变量有默认初始化值。
  4. 局部变量:
  5. ①局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。
  6. ②局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。
  7. ③局部变量没有默认初始化值

在使用变量时需要遵循的原则为:就近原则

首先在局部范围找,有就使用;接着在成员位置找(本类—-》父类)。

封装

private

this

  • 指向本对象的引用

    构造方法(函数)

  • 无构造函数,系统提供默认构造(就是将成员变量初始化为“0“)

  • 有构造函数,系统不再提供默认构造
  • 构造函数可以重载

继承

super

  • 指向父类的引用

    构造方法(函数)

⚠️:子类一般有两个构造,一个是空参构造,一个是全参构造

访问修饰符

  • private:强调给自己(本类)使用
  • default:强调给同包下的类使用
  • protected:强调给子类使用
  • public:强调给大家使用

重写和重载

  • 重写从父类继承下来的方法
  • 重写的权限不能小于父类的方法

多态

同一事物在不同条件下的多种形态,如水在常温下是液体,高温下是气体,低温下是固体
父类指向不同子类对象后,父类调用方法时的多种形态(父类指向不同子类对象后,调用的就不是自己的方法类,而是子类的各种方法了)

实现多态的步骤

  • 要有继承关系
  • 要有方法重写
  • 父类引用指向子类对象,父类接口指向子类对象

多态的实例

  • 多态中的成员方法:编译看左,运行看右

    1. // 父类引用指向子类对象
    2. Animal animal = new Dog();
    3. // 编译看左(编译通不通过看的是 animal对应的类里有没有setName这个成员)
    4. animal.setName("哈士奇");
    5. // 运行看右(运行时使用的方法是 Dog类中的eat方法)
    6. animal.eat();
  • 多态中的成员变量:编译看左,运行也看左

  • 父类作为形参实现多态

    1. // 多态做法
    2. Dog dog = new Dog();
    3. dog.setName("哈士奇");
    4. showAnimal(dog);
    5. Mouse mouse = new Mouse();
    6. mouse.setName("Jerry");
    7. showAnimal(mouse);
    8. }
    9. // 父类作为形参 来接受任意的子类对象
    10. public static void showAnimal(Animal animal){
    11. animal.eat();
    12. }
  • upcasting downcasting

    • instance of

抽象类&子类

  • 成员特点
  • 类型转换
  • 引用传递

抽象类比普通类多一种抽象方法,其他和普通类一样
不能被实例化
抽象类的子类:子类是普通类,需要实现(重写)父类的所有抽象方法。子类是抽象类,则不同实现父类的抽象方法

接口&实现类(子类)

比抽象类更抽象
你写接口你写实现,就不用写接口了。我写接口你实现,接口就用上了。我不给你规定好了,你怎么知道该实现哪些内容呢。更进一步,我写接口你实现,你今天不在,我明天出差,程序后天交工,那我今天必须把调用这个接口的代码写好。所以就需要接口中有函数,有明确的函数签名。我写个接口,再把调用函数写好,明天你把接口实现了,传个实例进来,交工。

接口是对动作的抽象,而抽象类是对根源的抽象。对于抽象类,比如男人,女人这两个类,那我们可以为这两个类设计一个更高级别的抽象类—人。对于接口,我们可以坐着吃饭,可以站着吃饭,可以用筷子吃饭,可以用叉子吃饭,甚至可以学三哥一样用手抓着吃饭,那么可以把这些吃饭的动作抽象成一个接口—吃饭。所以在高级语言中(如Java,C#),一个类只能继承一个抽象类(因为你不可能同时是生物又是非生物)。但是一个类可以同时实现多个接口,比如开车接口,滑冰接口,啪啪啪接口,踢足球接口,游泳接口。
eg:猫狗—-》动物类(年龄,吃) is a
猫人—-》接口(吃) like a

  • 成员特点

    • 成员变量:public static final(一般情况下不在接口中定义变量)
    • 成员方法:public abstract
    • 构造函数:接口没有构造函数
  • final

    • 修饰类:不能被继承—-》与abstract冲突
    • 修饰方法:不能被重写—-》与abstract冲突
    • 修饰成员变量,局部变量:常量
    • 不建议修饰引用类型 final Person p = new Person(); //not reconmended
  • static

    • 修饰类:类变量
    • 修饰方法:类方法
    • 类.类变量 or 类.类方法
    • static内部???