09 面向对象进阶

目录

1、static

1.1 static修饰成员变量

1.2 static修饰成员方法

1.3 static注意事项:

2、继承

2.1 继承简述

2.2 继承的特点

2.3 子类继承父类的哪些内容

2.4 继承中成员变量的访问特点

2.5 继承中成员方法的访问特点

2.6 继承中构造方法的访问特点

3、多态

3.1 多态简述

3.2 多态调用成员特点

3.3 多态的优势及弊端

4、包、final

4.1 包

4.2 final关键字

5、权限修饰符

6、代码块

6.1 局部代码块

6.2 构造代码块

6.3 静态代码块

7、 抽象类和抽象方法

7.1 定义

7.2 定义格式

7.3 注意事项

7.4 作用

8、 接口

8.1 什么是接口

8.2 接口的定义和使用

8.3 注意事项

8.4 接口中成员的特点

8.5 接口和类之间的关系

9、内部类

9.1 什么是内部类

9.2 什么时候用内部类

9.3 成员内部类

9.4 静态内部类

9.5 局部内部类

9.6 匿名内部类


1、static

1.1 static修饰成员变量

被static修饰的成员变量是 静态变量
特点:
  • 被该类所有对象共享
  • 不属于对象,属于类
  • 随着类的加载而加载,优于对象存在
调用方式:
  • 类名调用(推荐)
  • 对象名调用
static内存图:
注:静态区的数据是 共享

1.2 static修饰成员方法

被static修饰的成员方法,叫做静态方法
特点
  • 多用在测试类和工具类中
  • JavaBean类很少使用
调用方式:
  • 类名调用(推荐)
  • 对象名调用 
工具类:
要求:
  • 类名见名知意
  • 私有化构造方法
  • 方法定义为静态的

1.3 static注意事项:

  • 静态方法只能访问静态变量(类变量)和静态方法(类方法),不能调用非静态的成员变量(实例变量)和非静态的成员方法(实例方法)
  • 非静态方法可以访问静态变量或者静态方法,也可以访问非静态的成员变量和非静态方法


2、继承

2.1 继承简述

Java中提供了一个关键字 extends,用这个关键字,我们可以让一个类和另一个类建立起继承关系。
如:
public class Student extends Person{}
Student称为 子类(派生类),Person称为 父类(基类或超类)
使用继承的好处:
  • 可以把多个子类重复的代码提取到父类中,提高了代码的复用性
  • 子类可以在父类的基础上,增加其他的功能,使子类更强大
什么时候用继承:
当类与类之间,存在相同的内容,并且满足子类是父类中的一种,可以考虑使用继承优化代码
继承后子类的特点:
  • 子类可以得到父类的属性和行为,子类可以使用
  • 子类可以在父类的基础上新增其他的功能,子类更强大

2.2 继承的特点

  • java只支持单继承,不支持多继承(一个子类只能有一个父类),但支持多层继承(子类A可继承B,B可继承C)
  • 每一个类都直接或间接的继承 Object类

2.3 子类继承父类的哪些内容

虚方法表(提高调用成员方法的效率):

2.4 继承中成员变量的访问特点

就近原则:
  • 无this或super修饰,先找1位置,再找2位置,再找3位置
  • this修饰,找2位置
  • super修饰,找3位置

2.5 继承中成员方法的访问特点

同样为 就近原则: 如果本类中有就会调用子类的,如果没有就会调用从父类中继承下来的
方法的重写:当父类中的方法不能满足子类现在的需求时,需要进行方法重写
书写格式:在继承体系中,子类出现了和父类一模一样的方法声明,我们就称子类这个方法是重写的
@Override重写注释:
  • @Override是放在重写后的方法上,校验子类重写时语法是否正确
  • 加上注解后如果有红色波浪线,表示语法错误
  • 建议重写方法都加上@Override注解,代码安全优雅
方法重写本质:如果发生了重写,则会覆盖
方法重写注意事项:
  • 重写方法的名称,形参列表必须与父类中的一致
  • 子类重写父类方法时,访问权限子类必须大于等于父类(空着不写<protected<public)
  • 子类重写父类方法时,返回值类型必须小于等于父类
  • 建议:重写的方法尽量和父类保持一致
  • 只有被添加到虚方法表中的方法才能被重写

2.6 继承中构造方法的访问特点

  • 父类中的构造方法不会被子类继承
  • 子类中所有的构造方法默认先访问父类中的无参构造,再执行自己
怎么调用父类的构造方法?
  • 子类构造方法的第一行语句默认都是:super(),不写也存在,且必须在第一行
  • 如果想调用父类有参构造,必须手动写super调用


3、多态

3.1 多态简述

多态的应用场景:
为Teacher,Student,administrator三种对象设计注册方法
什么是多态:
同类型的对象,表现出的不同形态
多态的表现形式:
父类类型 对象名称 = 子类对象;
多态的前提:
  • 有继承关系
  • 有父类引用指向子类对象
  • 有方法重写

3.2 多态调用成员特点

  • 变量调用:编译看左边,运行也看左边(调父类的)
  • 方法调用:编译看左边,运行看右边 (调子类的)
多态内存图:

3.3 多态的优势及弊端

优势:
  • 在多态形式下,右边对象可以实现解耦合,便于扩展和维护
  • 定义方法的时候,使用父类型作为参数,可以接受所有子类对象,体现多态的扩展性与便利
弊端:不能调用子类特有的功能
原因:父类中没有子类的特有方法
解决方法:将对象强转为子类类型
//父类Animal , 子类 Dog Cat
Animal a = new Dog();
if(a instanceof Dog) { //instanceof:判断a是否是Dog类的对象
    Dog d = (Dog) a;
    d.lookHome(); //Dog类的特有方法
} else if(a instanceof Cat) {
    Cat c = (Cat) a;
    c.catchMosue(); //Cat类的特有方法
} else {
    System.out.println("无法转换");
}


4、包、final

4.1 包

包的作用:
包就是文件夹,用来管理各种不同的Java类,方便后期代码维护
包的命名规则:
公司域名反写+包的作用,需要全部英文小写,见名知意
什么是全类名:
包名+类名
使用其他类的规则:
  • 使用同一个包中的类时,不需要导包
  • 使用java.lang包中的类时,不需要导包
  • 其他情况都需要导包
  • 如果同时使用两个包中的同名类,需要使用全类名

4.2 final关键字

  • final修饰方法:表明该方法是 最终方法,不能被重写
  • final修饰类:表明该类是 最终类,不能被继承
  • final修饰变量:叫做 常量,只能被赋值一次
常量:
 实际开发中,常量一般作为系统的配置信息,方便维护,提高可读性
常量的命名规则:
  • 单个单词:全部大写
  • 多个单词:全部大写,中间用下划线隔开
细节:
  • final修饰基本数据类型,数据不可更改
  • final修饰引用数据类型,记录的地址值不可改变,但实际的数据可以更改


5、权限修饰符

使用规则:
  • 实际开发中,一般只用private和public
  • 成员变量私有
  • 方法公开


6、代码块

6.1 局部代码块

(有些过时)
特点:变量用完之后马上回收内存
作用:提前结束生命周期

6.2 构造代码块

(不够灵活,仅做了解)
构造代码块:
写在成员位置的代码块
作用:
可以把多个构造方法中重复的代码抽取出来
执行时机:
创建本类对象时,会先执行构造代码块,再执行构造方法
                         原先的代码重复 
     
                       用构造代码块改后的代码

6.3 静态代码块

(重点)
格式:
static{}
特点:
需要通过static关键字修饰,随着类的加载而加载,并且自动触发,执行一次
使用场景:
在类加载的时候,做一些 数据初始化时使用。


7、 抽象类和抽象方法

7.1 定义

抽象方法:共性的行为(方法)抽取到父类之后,由于每个子类执行的内容是不一样的,所以,在父类中不能确定 具体的方法体。该方法就可以定义为抽象方法。
 抽象类:如果一个类中存在抽象方法,那么该类就必须声明为抽象类。

7.2 定义格式

抽象方法的定义格式:
public abstract 返回值类型 方法名(参数列表);
抽象类定义格式:
public abstract class 类名{}

7.3 注意事项

  • 抽象类不能实例化
  • 抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
  • 可以有构造方法
  • 抽象类的子类:
    • 要么重写抽象类中的所有抽象方法
    • 要么是抽象类

7.4 作用

  • 抽取共性时,无法确定方法体,就把方法定义为抽象的。
  • 强制让子类按照某种格式重写。
  • 抽象方法所在的类,必须是抽象类


8、 接口

8.1 什么是接口

接口就是一种规则,是对 行为的抽象

8.2 接口的定义和使用

  • 接口关键字用interface来定义
public interface 接口名{}
  • 接口不能实例化
  • 接口和类之间是实现关系,通过implements关键字表示
public class 类名 implements 接口名{}
  • 接口的子类(实现类)
    • 要么重写接口中所有的抽象方法
    • 要么是抽象类

8.3 注意事项

  • 接口和类的事项关系,可以是单实现,也可以是多实现
  • 实现类还可以在继承一个类的同时实现多个接口

8.4 接口中成员的特点

  • 成员变量:
    • 只能是常量
    • 默认修饰符:public static final
  • 构造方法:
    • 没有
  • 成员方法:
    • 只能是抽象方法(JDK7以前)
    • 默认修饰符:public static abstract

8.5 接口和类之间的关系

  • 类和类的关系:继承关系,只能单继承,不能多继承,但是可以多层继承
  • 类和接口的关系:可以单实现,也可以多实现,还可以在继承一个类的同时实现多个接口
  • 接口和接口的关系:继承关系,可以是单继承,也可以是多继承


9、内部类

9.1 什么是内部类

内部类是类的五大成员之一。
类的五大成员:属性,方法,构造方法,代码块,内部类

9.2 什么时候用内部类

  • 内部类表示的事物是外部类的一部分
  • 内部类单独出现没有任何意义

9.3 成员内部类

(了解)
  • 写在成员位置的,属于外部类的成员
  • 成员内部类可以被一些修饰符所修饰
  • 在成员内部类里面,JDK16之前不能定义静态变量,JDK16开始才可以定义静态变量
获取成员内部类对象:
  • 在外部类中编写方法,对外面提供内部类的对象
  • 直接创建格式:
外部类名.内部类名 对象名 = 外部类对象.内部类对象;
内部类的内存图:

9.4 静态内部类

(了解)
静态内部类只能访问外部类中的静态变量和静态方法,如果想要访问非静态的需要创建对象。

9.5 局部内部类

(了解)
  • 将内部类定义在方法里面就叫做局部内部类,类似于方法里面的局部变量
  • 外界是无法直接使用,需要在方法内部创建对象并使用
  • 该类可以直接访问外部类的成员,也可以访问方法内部的局部变量

9.6 匿名内部类

匿名内部类本质上就是隐藏了名字的内部类
格式:
new 类名或者接口名() {
    重写方法;
};
格式的细节:
包含了继承或实现,方法重写,创建对象
整体就是一个属于类的子类对象或者接口的实现对象
使用场景:
当方法的参数是接口或者类时,一接口为例,可以传递这个接口的实现类对象
如果实现类只要使用一次,就可以用匿名内部类简化代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平凡的蒟蒻99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值