1.抽象类入门
抽象类概述
抽象方法: 将共性的行为(方法)抽取到父类之后,发现该方法的实现逻辑无法在父类中给出具体明确,该方法就可以定义为抽象方法。
抽象类: 如果一个类中存在抽象方法,那么该类就必须声明为抽象类。
要点:
抽象方法意义,格式
父类有些方法,知道有这个功能,但是,方法体不明确,可以声明为 abstract 方法,去掉方法体{}
//抽象类
public abstract class Animal {
//抽象方法
public abstract void eat();
//具体方法
public void drink() {
}
}
抽象类的意义,格式
抽象方法必须存活在抽象类中, 抽象类为抽象方法提供了存活的环境.
例如: Animal类(动物类)有吃的方法,但是动物吃什么,是不明确的
一个方法,只有方法声明,没有方法体{},就是抽象方法,使用 abstract 修饰 //public abstract void eat();
抽象方法必须定义在抽象类中!! //public abstract class Animal {}
2.抽象类的注意事项
3.模板设计模式
小结:
模板设计模式的优势 模板已经定义了通用结构,使用者只需要关注自己需要实现的功能即可
自己理解: 设计模式就是一套反复使用的,经过分类编目的,前人代码设计经验的总结。
好处: 模板类定义了通用的结构,方便重用,子类可以对细节进行扩展(方法重写)!
简单说,1.重用通用的结构 2.可以扩展
4.final关键字
要点:
final: 关键字的意思?
最终的;决定性的;不可更改的
可以修饰哪些?什么效果?
final是一个关键字,可以修饰类,方法,变量.
修饰类: 该类不能被继承(太监类)
修饰方法:该方法不能被子类重写(子类可以直接继承使用)
修饰变量: 修饰基本类型,是常量,值只能赋值一次
修饰引用类型,地址值不能改
final修饰成员变量,要么声明时赋值,要么在构造方法结束前赋值.
应用场景:
1.一个类的所有方法都不希望被重写,类使用 final 修饰 例如:String类
public final class String {....}
2. 一个类的某些方法不想被重写,方法使用 final 修饰
public final void work() {
System.out.println("work hard....");
}
3. 一个变量赋值一次后,不希望被修改,使用 final 修饰
final int NUM = 10;
abstract final 对比
final abstract
//修饰类 不能继承 希望被子类继承
//修饰方法 不能重写 希望子类重写
//修饰变量 常量 abstract 不能修饰变量
static
含义: 静态
可以修饰哪些东西?
成员方法,成员变量
有什么作用?
声明为静态方法,进行程序的初始化操作
5.代码块
局部代码块:
构造代码块:
位置: 类中方法外定义
特点: 每次构造方法执行的时候,都会执行该代码块中的代码,并且在构造方法执行前执行
作用: 将多个构造方法中相同的代码,抽取到构造代码块中,提高代码的复用性
静态代码块的应用场景: 系统的初始化代码,最先执行,且仅执行一次。
6.接口的介绍
要点:
日常生活中,两个实体之间进行连接的部分称为接口。
接口就是规范,规范一旦确定,不能随意修改!!!
例如:
电脑和U盘连接的标准USB接口。
接口可以确保不同实体之间的顺利连接。如不同的电脑厂家和U盘厂家只要按照相同的USB接口进行生产,那么所有的电脑和U盘就可以顺利的连接起来。
- 接口就是规范,只要符合相同的规范,不同的实体就可以连到一起使用。
- Java中接口存在的两个意义
1. 定义规范(有了规范,可以让不同的实体连接到一起使用,只要规范不变,换了实体也可以连接使用)
好处:降低实体之间的耦合性,提高扩展性和灵活性
2. 功能的扩展(符合一个规范,就相当于拥有一种能力,实体可以符合多个规范,就拥有多种能力)
7.接口的定义和特点
- 接口使用关键字interface来定义
public interface 接口名 {} - 接口不能实例化
- 接口和类之间是实现关系,通过implements关键字表示
public class 类名 implements 接口名 {} - 接口的子类(实现类)
要么重写接口中的所有抽象方法
要么是抽象类
8.接口的成员特点
要点:
接口成员,有默认修饰符
成员变量、成员方法、构造方法默认修饰符?
成员变量:默认 public static final (静态常量)
[public static final] int NUM = 10;
成员方法:默认 public abstract
[public abstract] void coding(); //写代码的方法
构造方法: 接口没有构造方法!!!
interface Coding {
//写代码
public abstract void coding();
//void coding();
//int NUM = 10;
public static final int NUM = 10;
//public Coding() {} //接口没有构造方法
}
9.jdk8版本中的默认方法
举例:
interface InterA {
abstract void show();
//void defaultMethod();
public default void defaultMethod()
{
System.out.println("我是接口的默认方法,解决接口升级问题,让原来已经存在的实现类不报错");
}
}
class InterAImpl implements InterA {
@Override
public void show() {
}
}
扩展:
子类中可以通过 super.父类方法()调用父类方法
接口实现类中如何访问接口的 default 方法?
接口名.super.默认方法名();
10.jdk8版本中的静态方法
接口的静态方法的意义:
和实现类无关,直接使用接口现成的功能, 调用格式:接口名.静态方法()
扩展
default方法的区别:
接口升级,需要添加新的抽象方法时,为了使已存在的实现类不报错,能继续使用, 新创建的实现类可以不重写,
也可以重写!
11.接口成员小结
12.类和接口的关系
实现类如何访问接口中的默认方法?
接口名.super.默认方法();
13.多态的前提条件
- 有继承/实现关系
- 方法重写
- 父类引用指向子类对象
14.多态的成员访问特点
总结:
成员变量: 编译看左边,运行看左边 (成员变量,实际开发中,不关注!!)
成员方法(重点掌握): 编译看左边,运行看右边
一句话:编译全部看左边,只有成员方法运行看右边!
理解: 成员变量没有覆盖重写这一说,当父类看,就用父类的成员变量,成员方法有覆盖重写
15.多态的好处和弊端
16.写一个多态程序的步骤
抽象类多态
1.写一个抽象类(父类)
2.写多个子类继承抽象类,重写方法
3.在测试类中,创建一个方法(useAnimal),方法的参数类型是抽象类类型
4.在测试类的main方法中,调用刚创建的方法,传入子类对象
17.多态中的转型
要点:
什么是向上转型?
父类引用指向子类对象
把猫当动物看
多态的格式
向下转型? (强制类型转换)
恢复猫的本来面目
18.向下转型的隐患和解决
instanceof 运算符
public static void useFlyable(Flyable flyable) {//需要传入实现类对象,扩展性强
flyable.fly();
//多态不能访问子类特有功能
//flyable.suckBlood();
//向下转型
判断这个对象是否是蝙蝠的类型
if (flyable instanceof Bat) { //了解下 instanceof 判断对象是否属于某种类型 返回布尔值
//向下转型(强转格式)
Bat bat = (Bat)flyable;
//吸血
bat.suckBlood();
}
//蜻蜓不能强转成蝙蝠
//ClassCastException: class com.bibabo.demo6.Dragonfly cannot be cast to class com.bibabo.demo6.Bat
}