1.多态的概述以及代码体现

* A:多态概述
  * 事物存在的多种形态
* B:多态前提
  * a:要有继承关系。
    * 一个类是父类,一个类是子类
  * b:要有方法重写。
  * c:要有父类引用指向子类对象。自动类型提升,向上转型
    * Animal a = new Cat(); ----------向上转型
    * 父类 -------- 子类对象
    * Cat c = (Cat)a;----------------向下转型

2.多态中的成员访问特点

* A:多态中的成员访问特点
  * a:成员变量
    * 编译看左边(父类),运行看左边。
  * b:成员方法
    * 编译看左边,运行看右边(子类)。
  * c:静态方法
    * 编译看左边,运行看左边。
    * (静态和类相关,算不上重写,所以,访问还是左边的)

* B:案例演示
* 多态中的成员访问特点
class Demo1DuoTai {
public static void main(String[] args) {
DemoA da = new DemoB();//3.父类引用指向子类对象
da.print();
System.out.println(da.num);
da.show();
}
}
class DemoA {
int num=10;
public void print(){
System.out.println("多态");
}
public static void show(){
System.out.println("父类静态方法");
}
}
class DemoB extends DemoA { //1.继承
int num =20;
public static void show(){
System.out.println("子类静态方法");
}
public void print(){
System.out.println("多态重写");//2.重写
}
}
/*
多态:
概念:事物存在的多种形态,
前提:1.继承,即一个子类继承父类,extends,
2.方法重写,即父类中的方法在子类中重写(重写的理解),
3.父类引用指向子类对象,
成员访问的特点:
1.成员变量
编译看左边,运行也看左边;
2.成员方法
编译看左边,运行看右边(动态绑定);
3.静态方法
编译看左边,运行也看左边
总结:只有非静态的成员方法,编译看左边,运行看右边,
*/

3.超人故事

通过该案例帮助理解多态的现象:
class Demo2DuoTai {
public static void main(String[] args) {
DemoA2 da = new DemoB2();
System.out.println(da.name);
da.TanShengYi();
//da.fly(); //父类不能访问子类的特有功能
DemoB2 db = (DemoB2)da;
db.fly();
}
}
class DemoA2 {
String name = "克拉克";
public void TanShengYi(){
System.out.println("谈生意");
}
}
class DemoB2 extends DemoA2{
String name = "超人";
public void TanShengYi(){
System.out.println("几个亿,小生意而已");
}
public void fly(){
System.out.println("我飞去救人");
}
}
/*
超人的故事:
1.多态的前提--继承,方法重写,父类引用子类对象,
2.父类不能使用子类的特有功能,
3.自动类型提升--向上转型--DemoA2 da = new DemoB2();
4.向下转型--DemoB2 db = (DemoB2)da;
*/

4.多态的好处和弊端

* A:多态的好处
  * a:提高了代码的维护性(继承保证)
  * b:提高了代码的扩展性(由多态保证)

* B:多态的弊端
  * 不能使用子类的特有功能。

5.多态中的题目分析题

class Fu {
public void show() {
System.out.println("fu show");
}
} class Zi extends Fu {
public void show() {
System.out.println("zi show"); //此句为运行的结果
} public void method() {
System.out.println("zi method");
}
} class Test1Demo {
public static void main(String[] args) {
Fu f = new Zi();//父类引用指向子类
//f.method(); ----------//此句报错,原因:不能使用子类的特有功能
f.show();
}
}
class A {
public void show() {
show2();
}
public void show2() {
System.out.println("我");
}
}
class B extends A {
public void show2() {
System.out.println("爱");
}
}
class C extends B {
public void show() {
super.show();
}
public void show2() {
System.out.println("你");
}
}
public class Test2DuoTai {
public static void main(String[] args) {
A a = new B();
a.show(); //爱 B b = new C();
b.show(); //你
}
}

6.抽象类的概述及其特点

* A:抽象类概述
* B:抽象类特点
  * a:抽象类和抽象方法必须用abstract关键字修饰
    * abstract class 类名 {}
    * public abstract void eat();
  * b:抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
  * c:抽象类不能实例化那么,抽象类如何实例化(创建对象)呢?
    * 按照多态的方式,由具体的子类实例化。其实这也是多态的一种,抽象类多态。
  * d:抽象类的子类
    * 要么是抽象类
    * 要么重写抽象类中的所有抽象方法

7.抽象类的成员特点

* A:抽象类的成员特点
  * a:成员变量:既可以是变量,也可以是常量。
  * b:构造方法:有。
    * 用于子类访问父类数据的初始化。
  * c:成员方法:既可以是抽象的,也可以是非抽象的。
* B:抽象类的成员方法特性:
  * a:抽象方法 强制要求子类做的事情。
  * b:非抽象方法 子类继承的事情,提高代码复用性。

8.抽象类中的面试题

* 详见java面试题大全

9.接口的概述及其特点

* A:接口概述
  * 从狭义的角度讲就是指java中的interface
  * 从广义的角度讲对外提供规则的都是接口
* B:接口特点
  * a:接口用关键字interface表示
    * interface 接口名 {}
  * b:类实现接口用implements表示
    * class 类名 implements 接口名 {}
  * c:接口不能实例化
    * 那么,接口如何实例化呢?
     * 按照多态的方式来实例化。
  * d:接口的子类
    * a:可以是抽象类。但是意义不大。
    * b:可以是具体类。要重写接口中的所有抽象方法。(推荐方案)

10.接口的成员特点

* A:接口成员特点
  * 成员变量;只能是常量,并且是静态的。
  * 默认修饰符:public static final
    * 他们三的顺序不影响结果
    * 建议:自己手动给出。
  * 构造方法:接口没有构造方法。
  * 成员方法:只能是抽象方法。
    * 默认修饰符:public abstract
    * 建议:自己手动给出。
    * 接口方法不带用主体。

11.类与类,类与接口,接口与接口的关系

* a:类与类:
  * 继承关系,只能单继承,可以多层继承。
* b:类与接口:
  * 实现关系,可以单实现,也可以多实现。
  * 并且还可以在继承一个类的同时实现多个接口。
* c:接口与接口:
  * 继承关系,可以单继承,也可以多继承。

12.抽象类和接口的区别

* A:成员区别
  * 抽象类:
    * 成员变量:可以变量,也可以常量
    * 构造方法:有
    * 成员方法:可以抽象,也可以非抽象
  * 接口:
    * 成员变量:只可以常量
    * 成员方法:只可以抽象
* B:关系区别
  * 类与类
    * 继承,单继承
  * 类与接口
    * 实现,单实现,多实现
  * 接口与接口
    * 继承,单继承,多继承
* C:设计理念区别
  * 抽象类 被继承体现的是:”is a”的关系。抽象类中定义的是该继承体系的共性功能。
  * 接口 被实现体现的是:”like a”的关系。接口中定义的是该继承体系的扩展功能。

最新文章

  1. Composer根据Name显示与隐藏
  2. C学习
  3. Android 之 log
  4. 配置 Hdp 4 Window 中的一些问题
  5. Codeforces 622B The Time 【水题】
  6. zoom 用法
  7. 初识CLR
  8. php设置和获取变量类型
  9. admin嵌套在spring mvc项目里,菜单栏点击新连接每次都会重置
  10. IE6常见bug
  11. nginx配置文件中的location详解
  12. spark单机部署及样例运行
  13. Java 反射实例
  14. 关于hession 随笔
  15. (hdu step 8.1.6)士兵队列训练问题(数据结构,简单模拟——第一次每2个去掉1个,第二次每3个去掉1个.知道队伍中的人数<=3,输出剩下的人 )
  16. ruby module extend self vs module_funciton
  17. Go Deeper HDU - 3715(2 - sat 水题 妈的 智障)
  18. Linxu基础知识:终端、终端模拟器、shell
  19. 使用html+css+js实现弹球游戏
  20. <转>MYSQL数据库数据拆分之分库分表总结

热门文章

  1. uva 11991 查询中容器的运用
  2. 51nod1053 最大M子段和 V2
  3. 有关WebView开发问题(转)
  4. Java常用的集合类(转)
  5. MFC中的双缓冲技术(解决绘图闪烁问题)
  6. 【面试 springMVC】【第四篇】springMVC的一些问题
  7. 如何在ASP.NET Core自定义中间件中读取Request.Body和Response.Body的内容?
  8. chromium爱好者不可错过的一个开源分支
  9. 嵌入式程序员应知道的0x10个C语言Tips
  10. centos Linux 常用命令汇总