回顾
1.接口中可以写成员变量吗?
不能! 接口只能写常量,由三个修饰符public static final修饰的
2.接口中都可以写哪种方法?
抽象方法[最常见的]
默认方法
静态方法
3.我们学过的普通类,抽象类,接口中哪些有构造方法?哪些没有构造方法?
普通类有构造方法: a.new对象时使用 b.子类的构造方法第一行调用
抽象类有构造方法: b.子类的构造方法第一行调用
接口没有构造方法(因为接口中没有成员变量,也不需要对成员变量初始化)
4.描述一下Java中类和类的关系,类和接口的关系,接口和接口的关系
类和类:单继承
类和接口: 多实现(类实现接口)
接口和接口: 多继承[了解]
5.接口和抽象类的异同有哪些?[面试题]
a.概念:什么是接口,什么是抽象类
b.相同
都是java文件,编写以后都是.class文件
都是引用数据类型
都不能创建对象
都可以含有抽象方法
子类/实现类继承之后都必须重写所有抽象方法,之后才能创建对象
c.不同
关键字不同
接口中没有成员变量,抽象类中可以有成员变量
接口可以多实现,抽象类只能单继承
抽象类有构造,接口无构造
抽象类中有普通方法,接口中不能有普通方法
今日内容
- 多态(重点)
- 内部类
- 权限修饰符
- 代码块
多态
概述
面向对象三大特征
封装,继承,多态定义
多态:是指同一行为,具有多个不同表现形式。
(同一个对象具有不同的形态)
多态的前提[重要]
1.必须有继承关系或者实现关系
2.必须有方法的重写
- 父类变量引用子类对象
只有1,2同时满足才能有多态
多态的体现[重要]
父类类型的变量 指向了 子类类型的对象
父类类型 变量名 = new 子类对象;
如
Fu ff = new Zi();
多态调用方法的特点[重点]
1.多态调用方法时,编译阶段是看父类 . 如果父类没有该方法就会出错
2.多态调用方法时, 运行阶段看子类. 运行的是子类的方法
总结, 编译看父类, 运行看子类
多态的好处[重点]
多态提高了代码的扩展性,灵活性
多态的弊端
弊端: 使用多态时, 只能调用子父类都有的方法. 不能调用子类特有的方法
多态弊端解决方案
基本类型转换:1.自动类型转换,2.强制类型转换
引用类型转换:
1.向上转型(把子类类型转成父类类型)
Animal an = new Dog();//多态就是向上转型
2.向下转型 (把父类类型转成子类类型)
必须有向上转型,才能有向下转型
Dog d = (Dog)an;
向下转型最多只能转型到本身
转型可能出现的异常
ClassCastException 类型转换异常
向下转型 转到其他子类编译阶段同样通过, 但是运行会出错
instanceof关键字
- 作用:可以用来判断一个对象,是否是我们指定类的对象
- 格式
boolean b = 对象名 instanceof 类名
内部类
在类A里 定义一个 类B.
类B成为内部类, 类A称为外部类
内部类:(一个java文件里只能有一个public修饰的类)
1.成员内部类(类中方法外)
2.局部内部类(类中方法内)
在内部类方法中找外部类的成员变量 使用
外部类名.this.变量名
成员内部类
特点:
1.在成员内部类中,可以无条件访问外部类的任何成员
2.在测试类中创建内部类对象
,必须先创建外部类对象, 通过外部类对象再去创建内部类对象
格式:
外部类名.内部类名 对象名 = new 外部类型().new 内部类型();
如:
Person.Heart h = new Person().new Heart();
或者
Person p = new Person();
Person.Heart h = p.new Heart();
内部类文件编译的字节码文件
内部类仍然是一个独立的类,在编译之后会内部类会被编译成独立的.class文件
格式:
外部类的类名和$符号 。
比如:
Person$Heart.class
匿名内部类[重点]
定义
匿名内部类是内部类的简化形式.作用
匿名内部类可以帮助我们快速的创建一个父类的子类对象或者一个接口的实现类对象使用方法
匿名内部类, 大括号内部, 不要写子类特有方法, 因为匿名内部类, 没有类名, 无法向下转型
如图接口的匿名内部类使用:
匿名内部类格式总结:
父类名/接口名 对象名 = new 父类名/接口名 () {
//重写父类或者接口中所有抽象方法
}
权限修饰符
介绍
- public:公共的
- protected:受保护的
- (空的):默认的(default本身不是权限修饰符)
- private:私有的
成员变量使用 private ,隐藏细节。
构造方法使用 public ,方便创建对象。(单例设计模式构造方法用的private)
成员方法使用 public ,方便调用方法。
代码块
定义
由一对大括号括起来的一句或者多句代码, 称为代码块儿
构造代码块
- 执行:每次创建对象都会执行构造代码块,构造代码块儿要比构造方法先执行
- 格式:类中方法外
public class 类名{
{
//构造代码块
}
}
静态代码块
- 描述:就是给构造代码块 添加了 static 关键字
- 执行:(当类加载到内存时,静态代码块立即执行)随着类的加载而执行且执行一次,优先构造方法的执行。
- 格式:类中方法外
public class 类名{
static{
//静态代码块
}
}