1.多态
多态:一个事物在不同时刻体现出来的不同状态:
*
* 水:固态,汽态 ,液态
* Animal a = new Cat() ;
*
*对于多态的三个前提条件
*
* 1)条件1:必须有继承关系(如果没有继承关系,谈不上多态!)
* 2)条件2:必须有方法重写
* 子类出现了父类一样的 方法声明
* 3)有父类引用指向子类对象:向上转型
* Fu f = new Zi() ;
* 多态的三个条缺一不可!
*
*
*
*多态的成员访问特点:
* 成员变量:
* 编译看左边,运行看左边
* 成员方法(非静态的成员方法):
* 编译看左,运行看右;由于存在方法重写,所以就运行最终的就是子类的成员方法
* 静态成员方法:(静态方法算不上方法重写,静态直接跟类有关系!)
* 编译看左,运行看左
例:
多态的好处(特点):
*
* 1)提高代码的维护性(由继承保证)
* 2)提高代码的扩展性(由多态保证)
*
* java的开发原则:低耦合,高内聚
多态的弊端
不能访问子类特有功能
如图
解决方法
1)创建子类的具体对象,来访问自己的特有功能;虽然可以解决多态的弊端,但是从内存角度考虑,需要创建子类对象,那么必须在堆内存开辟空间,
* 耗费内存,浪费空间!
* 2)既然多态的第三个前提条件:父类引用指向子类对象,那么可不可以将子类的引用指向父类对象呢?
* 可以的:向下转型:将父类的引用强制转换为子类的引用:前提必须有父类的引用存在;
* 向下转型必须依赖于向上转型!
* 注意 一般情况下:向下转型使用不当会造成一个异常:
* Throwable:
* error:严重问题
* Exception:
* 编译时期异常:
* 运行时期异常:RuntimeException
*
* 运行时期异常:
* ClassCastException:类转换异常:org.westos_02_多态.Cat4 cannot be cast to org.westos_02_多态.Dog4
* *
猫狗案例
2.抽象
抽象类的概念:
* 每一个动物的吃和睡的功能不一样,不应该把动物类定义为一个具体类,而是给出一个声明(abstract)
* 当一个类中如果有抽象功能(抽象方法)的时候,那么这个类一定要定义为抽象类!
*
* 问题:一个抽象类中可以有非抽象方法吗?
* 一个抽象类中可以抽象,也可以有非抽象的(作为一个判断题记忆!)
*
* 抽象类不能实例化:抽象类不能创建对象
* 一个抽象类如何进行实例化:
* 通过抽象类多态形式:父类的引用指向子类对象,通过子类进行初始化!
* 抽象类的子类的特点:
*
* 1)抽象类的子类是抽象类,那么没有意义!
* 最终使用的就是通过子类进行对象初始化的,如果子类都被抽象修饰了,那么也不能创建对象,所以没意义
*
* 抽象类多态:
* 强制子类必须重写当前抽象的父类中所有的抽象方法
* 还可以提高代码的维护性(里面继承关系保证!)
*
*
抽象类的成员特点
* 成员变量:
* 可以是变量也可以是自定义常量
* 构造方法:
* 抽象类可以有构造方法:包括有参构造和无参构造
* 作用:通过抽象类多态的形式:让子类进行数据的初始化
* 成员方法:
* 可以有抽象方法,也可以有非抽象方法
*
* 抽象类的成员方法特性:
* 抽象方法:强制子类必须要做到一件事情:方法重写(覆盖)
* 非抽象方法:由继承保证可以去提高代码的复用性
* */
注意
问题:
* 一个类中如果没有抽象方法,那么这个类可不可以定义为一个抽象类呢?
* 可以!为什么
* 不能让其创建对象!
*
* abstract不能和哪些关键字共同使用?
* private 和abstract不能共同使用
* final和abstract不能共同使用
* static和abstract不能共同使用
tset:经理与员工
接口的概念:
* 接口体现的是一种:扩展功能: 比如:猫可以跳高(并不是所有的猫都具有跳高功能)
*
* 如何表示接口:
* interface:接口interface 接口名{
*
* }
* 接口里面的方法可以是非抽象方法吗?
* 不可以,只能是抽象方法
* 接口中不能有构造方法
*
* 接口的特点:不能实例化(不能直接创建对象)
* 接口如何实例化:
* 接口的子实现类:
* 1)接口的子实现类是抽象类,没有意义,子类都不能创建对象了;实际开发中用的就是子类的对象进行初始化!
* 2)接口的子实现类是非抽象类
* 接口的实例化:就是通过子实现类对数据进行初始化!
*
* 接口的子实现类和接口的关系:implements:
* 格式:
* class 子实现类名 implments(实现) 接口名{
*
*
接口成员的特点:
* 成员变量:
* 只能是常量:存下默认修饰符:public static final (永远建议自己给出默认修饰符)
* 构造方法:
* 接口是没有构造方法的
* 成员方法:
* 接口中的成员方法默认修饰符:public abstract(永远建议自己给出默认修饰符)
*
* 类,抽象类,接口
制作和使用API
打开API:
显示---->输入你查找的类
索引---->搜索
找到某一个类:
对该类的描述
看类结构:
看该类是否有字段(变量),构造方法(如何创建该类对象),方法(类的成员方法)
出现该类的版本号:
Scanner java.util.Scanner;
JDK5.0以后的新特性:自动拆装箱(int--->Integer,char--->Character),静态导入(导入的方法级别),可变参数,增强for循环(集合),枚举
JDK7.0也有新特性(匿名内部类:局部内部类访问局部变量特性:局部变量必须被final讲)
形式参数和返回值问题研究;
/**
形式参数:
基本数据类型,你要什么数据类型,在实际传参的时候就传什么数据类型;形式参数的改变对实际参数没有影响(String是引用类型和基本数据类型的效果一样String s ="abc")
如果形式参数是引用类型:
具体类类:如果形式参数是一个具体类,那么需要创建该类对象
抽象类:如果形式参数是抽象类的情况,那么需要自定义一个抽象类的子类,来进行实例化(创建对象)!,创建对象的实质:抽象类多态!
接口:如果形式参数是接口情况,那么需要自定义一个接口的子实现类,然后通过接口多态的形式给接口进行实例化!(接口多态!)
返回值:
具体类:直接返回该类对象(通常实际开发中使用的是匿名对象)
抽象类:返回值如果是抽象类,需要的返回是该抽象类的子类对象
接口:返回值如果是接口类型,需要的是返回该接口的子实现类对象(通过子实现类进行实例化!)
形参是抽象类
形参是接口
返回值是抽象类
返回值是接口
内部类;
在一个类中定义另一个类,那么把这种情况:内部类:
举例:
在类A中定义一个类B,那么类B就是类A的内部类,同理,类A就是类B的外部类
内部类是直接可以访问外部类的成员,包括私有
外部类想要访问内部类的成员,必须通过创建内部类的对象访问该内部类的成员
* */