------Java培训、Android培训、iOS培训、.Net培训、期待与您交流------
/*
多态: 同一种事物,在不同时刻的状态
举例:
猫是猫的一种: 猫 m = new 猫();
猫同时也是动物: 动物 d = new 猫();
多态的前提:
a: 要有继承关系
b: 需要有方法重写. 没有方法重写也是可以的,但是没有意义
c: 父类的引用指向子类对象
Fu f = new Zi();
类的成员:
成员变量
编译看左边 , 运行看左边
构造方法
创建子类对象的时候,会访问父类的构造方法,对父类的数据进行初始化。
成员方法:
编译看左边 , 运行看右边
静态成员方法
编译看左边 ,运行看左边
多态的好处:
a: 提供了代码的维护性(继承保证)
b: 提供了代码的扩展性(多态保证)
多态的弊端: 就是不能访问子类特有的功能
向下转型: 就是把父类的引用强制转换成子类的引用
向上转型: 就是多态的体现
向下转型目的就是使用子类特有的功能
*/
// 父类
class Fu {
public void show(){
System.out.println("Fu....show....");
}
}
// 子类
class Zi extends Fu {
public void show(){
System.out.println("Zi.... show....");
}
public void function(){
System.out.println("Zi...function.....");
}
}
class DuoTaiTest{
public static void main(String[] args) {
// 创建对象,使用多态的形式
Fu f = new Zi(); // 向上转型
// 调用show方法
f.show();
// 调用function方法
// 错误的: 找不到符号
// f.function();
// 现在这个function方法是在子类中存在的,而我们不能直接使用父类的引用来访问.
// 那么我还想访问这个方法,我们应该怎么办呢?
// 我们可以通过子类的引用来访问,那么我们如何将父类的引用转换成子类的引用呢?
Zi zi = (Zi)f; // 向下转型
// 调用function方法
zi.function();
}
}
/*
抽象类的特点:
a: 抽象类和抽象方法的格式
抽象方法: public abstract 返回值类型 方法名(..) ;
抽象类的格式: abstract class 类名 {}
b: 抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
c: 构造方法,可以由构造方法
用于子类访问父类数据时的初始化
d: 抽象类不能实例化.
我们抽象类不能直接实例化,那么可不可以对其进行间接实例化.
通过多态的形式进行间接实例化
e: 抽象类的子类
(1): 可以是抽象类(没有意义)
(2): 可以是具体的类,需要重写抽象类中的抽象方法
*/
//创建抽象Animal类
abstract class Animal {
public abstract void eat() ;
public void sleep(){
System.out.println("Animal....sleep....");
}
public Animal(){}
}
// Cat不是抽象的, 并且未覆盖Animal中的抽象方法eat()
// class Cat extends Animal {}
// abstract class Cat extends Animal {}
class Cat extends Animal {
public void eat(){
System.out.println("Cat....eat....");
}
}
// 测试类
class AbstractTest {
public static void main(String[] args){
// 直接创建对象
// 错误的: Animal是抽象的; 无法实例化
// Animal a = new Animal();
//使用子类进行创建对象
Animal a = new Cat();
a.eat();
}
}
抽象类的成员特点:
a: 成员变量
这个量可以是变量,也可以是常量
b: 构造方法
可以有 , 用于子类在访问父类数据时候的初始化
c: 成员方法
可以是抽象方法,也可以是非抽象方法
抽象类中成员方法的特征:
抽象方法: 强制要求子类做的事情。
非抽象方法: 子类继承的事情,提高代码复用性。
抽象类的分析:
分析问题: 从具体到抽象的过程
实现: 从抽象到具体
使用的时候: 使用具体的东西
看到具体的事物中存在重复性的东西,我们因该将重复型的东西抽取出来,形成一个公共的父类.
而这个公共的类存在抽象方法,所以这个类我们需要定义成抽象类
a: 一个类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
答案: 可以, 不能让外界创建对象
b: abstract不能和哪些关键字共存?
private 冲突
final 冲突
static 无意义
接口定义以及接口与抽象类的区别
接口的特点:
a: 定义接口格式 interface 接口名 {}
b: 类实现接口用implements表示 格式: class 类名 implements 接口名 {}
c: 构造方法
没有构造方法
d: 无法实例化
接口不能直接实例化,那么我们可不可以对其进行间接实例化呢?
我们可以通过多态的形式,对其进行间接实例化
e: 接口的子类
(1): 可以是抽象类(没有意义)
(2): 可以是非抽象类, 但是该类需要重写接口中的抽象方法
接口中的成员特点:
成员变量: 都是常量, 存在默认的修饰符: public static final
建议自己给出
构造方法: 没有构造方法
成员方法:
都是抽象方法,存在默认的修饰符: public abstract
类与类 , 类与接口 , 接口和接口的关系
类与类: 继承关系,在java只支持单继承,不支持多继承 , 但是支持多层继承
类与接口: 实现的关系(implements), 并且支持多实现,多实现的格式: class 子类名 implements 接口名1, 接口名2 , ...{}
一个类可以继承一个类的同时去实现多个接口
接口和接口: 继承关系 , 并且支持多继承
在java语言中存出多继承吗?
存在, 接口和接口之间就可以多继承
抽象类和接口的区别:
(1): 成员区别
抽象类:
成员变量: 可以是变量也可以是常量
构造方法: 有构造方法
成员方法: 可以是抽象方法,也可以是非抽象方法
接口:
成员变量: 只能是常量 ,存在默认的修饰符: public static final
构造方法: 没有构造方法
成员方法: 只能是抽象方法, 存在默认的修饰符: public abstract
(2): 关系区别:
类与类: 继承关系, 只能是单继承 , 不能是多继承,但是可以是多层继承
类与接口: 实现关系, 可以是单实现,也可以是多实现,并且一个类可以继承一个类的同时去实现多个接口
接口与接口: 继承关系 可以是单继承也可以是多继承
(3): 设计理念
抽象类 体现的关系"is a" 抽象类中定义的是该继承体系的共性功能。
接口 体现的关系"like a" 接口中定义的是该继承体系的扩展功能。