1. 类的概念:
一堆 具有共同的成员变量/属性和成员方法/功能对象集合
2.接口
1,接口的概念:
接口是功能的集合,就是方法的集合
也就是说 接口中只能定义方法,不能定义普通的成员变量
而且接口中的成员方法,必须都是抽象的
我们一般这么理解,接口是比抽象类 还有抽象一种类型
2,接口的定义
定义类用关键字:class
定义抽象类用关键字:abstract class定义接口用关键字:interface
定义枚举用关键字:enum
public interface 接口名字{
//成员变量,不能定义普通的成员变量
//成员方法:必须都是抽象
public abstract 返回值类型 方法名();
}
类和接口的本质区别并不大,他们的源码都是.java文件
编译后都是.class文件
3.各种类型之间的关系
a.类和类之间:继承,而且是单继承,一个子类 只能有一个直接父类
b.接口和接口之间:继承,但是可以多继承,一个子接口 可以有多个直接父接口
c.类和接口之间: 不叫继承(extends),叫实现(implements),可以多实现
------(实现:implements 和 继承 差不多, 实现是把接口中的抽象方法都拿过来)
d.只有 类 实现 接口
面试题:java到底支不支持多继承?
如果是类与类 不支持多继承,只支持多层继承 如果是接口和接口 支持多继承,也支持多层继承
4.接口中成员的特点
成员变量,但是必须有固定修饰符 public static final 数据类型 变量= 值
成员方法,必须是是固定修饰符 public
abstract 即 抽象方法 接口不可以创建对象(抽象类也是)
实现类 实现接口 ,那么必须重写接口中所有的抽象方法,然后才能创建对象 , 否则 这个实现类 还是一个抽象类,是不能创建对象的
5.接口和抽象类的异同
相同点:
a.都不能创建对象
b.都是作为父类/父接口
c.子类/实现类 都必须重写抽象方法,然后才能创建对象
2.不同点:
a.抽象类用关键字 abstract 接口用关键字interface
b.抽象类中可以有抽象方法,可以没有抽象方法,也可以有部分是抽象方法,部分不是抽象方法 接口中只有有方法,必须都是抽象的
c.抽象类可以定义任意成员变量 接口的成员变量必须public static final修饰
d.类和抽象类之间关系是单继承,
类和接口之间关系是多实现
思想上的区别
1.抽象类中 必须定义 整个继承体系的共性内容
2.接口中定义 整个继承体系之外的 额外的 扩展的功能
6.多态
面向对象有三大特点:封装(安全性),继承(扩展性),多态(灵活性)
多态: 是指对象的多态,一个对象 的多种状态
在java中的多态前提:
1.必须有子父类关系 (必须有继承)
2.必须有方法的重写
3.代码体现为: 父类类型 变量名 = new 子类类型();
多态在java中表现形式:
父类类型 变量名 = new 子类类型();
父类类型的变量 指向了 子类的对象
注意事项:
使用多态调用成员变量
编译时 看父类 看左边 运行时 看父类 看左边
使用多态调用成员方法
编译时 看父类 看左边 运行时 看子类 看右边
总结:
多态使用变量 编译运行都看父类
多态调用方法 编译看父类 运行看子类
多态的弊端: 多态只能调用子父类共有的方法,不能调用子类特有的方法
弊端的解决方案:
向下转型: 强制类型转换 《《 子类类型 变量名 =(子类类型)父类类型的变量;
向上转型(就是多态): 自动类型转换
子类类型 变量名 =(子类类型)父类类型的变量;
变量名.子类特有方法();
向下转型过程中 很容易出现 类型转换的异常
向下转型也有弊端: 把父类的变量 转成子类类型的时候 编译器直接编译通过
java中解决向下转型弊端的方法: 一个关键字 instanceof 运算符 作用: 判断某一个变量 不是 该类的类型
格式: boolean b = an instanceof 类名
总结:
多态的好处:
提高程序的灵活性,扩展性,复用性 因为父类的变量 可以接收任何一个子类对象
多态的弊端:
不能调用子类特有的方法