黑马程序员技术交流社区

标题: java基础第九天笔记 [打印本页]

作者: Nrnnr110    时间: 2016-6-26 00:06
标题: java基础第九天笔记
01_面向对象(多态的概述及其代码体现)
什么是多态:事物在不同时刻存在的不同状态

多态的前提:
        1 要有继承关系
        2 要有方法的重写(没有方法的重写也叫多态,只是没有意义)
        3 要有父类引用指向子类对象  Fu f = new Zi();

------------------------------------------------------------------------------------------------------------------
02_面向对象(多态中的成员访问特点之成员变量)

多态中成员变量的访问特点是什么?
成员变量                编译看父类(编译时看父类有无调用的这个成员变量,没有的话报错),
                                运行看父类(调用后的结果是父类的)。

class Demo2_Polymorphic {
        public static void main(String[] args) {
                Father f = new Son();                                        //父类引用指向子类对象
                System.out.println(f.num);

        }
}

class Father {
        int num = 10;
        public void print() {
                System.out.println("father");
        }
}

class Son extends Father {
        int num = 20;

        public void print() {
                System.out.println("son");
        }

}
------------------------------------------------------------------------------------------------------------------
03_面向对象(多态中的成员访问特点之成员方法)

成员方法
         编译看左边(编译时看父类有无调用的这个成员方法,没有的话报错),
         运行看右边(调用后的结果是子类的)。


思考为什么多态中的成员符合以上两个特点呢?
因为成员变量不存在重写,而方法存在重写.
------------------------------------------------------------------------------------------------------------------
04_面向对象(多态中的成员访问特点之静态成员方法)

静态方法
         编译看左边(父类),运行看左边(父类)。
         (静态和类相关,算不上重写,所以,访问还是左边的)
------------------------------------------------------------------------------------------------------------------
05_面向对象(超人的故事)

这就是多态的使用
class fruit
{
}
class apple extends fruit
{
}
class A
{
        public void basket(fruit f)\;
//        public void basket(橘子 f){};
//        public void basket(梨 f){};
}

比如你要做个篮子放水果,你当然不希望造这样的篮子--苹果篮子,橘子篮子,梨篮子,正常人都会想,麻烦啊,我就造个篮子,什么都能放,干嘛造那么多啊?


回归程序:你造个篮子 basket();参数是水果 fruit,这样你调用的时候就可以这样 basket(fruit f);然后往里放苹果啊,梨啊,什么都行,只要是水果类的子类

好处:这样设计你的程序,等你的参数变了的时候,只要还是水果,你就不用去改程序了,这就是可扩展性的体现

以后开发中接口多态是最为常见的.



--------------------------------------------------------------------------------------------------------
06_面向对象(多态中向上转型和向下转型)

注意:在转型时,只能把数据转成它原本的类型或者它的父类型.
         两个毫无关系的类型是不能互相转换的(不存在继承或实现关系)

--------------------------------------------------------------------------------------------------------
07_面向对象(多态的好处和弊端)

多态的好处:提高代码的扩展性和可维护性。

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

解决办法:通过子父类间的类型转换.

关键字 instanceof 判断前边的引用是否是后边的数据类型
--------------------------------------------------------------------------------------------------------
08_面向对象(多态中的题目分析题)


------------------------------------------------------------------------------------------------------------------
09_面向对象(抽象类的概述及其特点)

一 想要定义一个类为抽象类怎么表示:
abstract 定义抽象
这个关键字可以修饰类 ,可以修饰方法
抽象方法是没有方法体的

二 抽象类不能被实例化。那么,怎么实例化呢?
创建一个子类去继承抽象类,然后创建子类对象.


三 如果一个类继承抽象类,那么想要代码不出错怎么解决?
1 如果类不定义为抽象,那么必须重写抽象类中所有的抽象方法
2 如果定义的类也为抽象的话,就不需要重写方法.

------------------------------------------------------------------------------------------------------------------
10_面向对象(抽象类的成员特点)

一 抽象类的成员特点:
A:成员变量:可以有成员变量,也可以有成员常量。
B:构造方法:有构造方法。
C:成员方法:可以有抽象方法,也可以有非抽象方法。
(抽象方法是为了要求子类做某些事情。)
(非抽象方法是为了提高代码的复用性,被子类继承)


二 抽象类既然不能被实例化,那么有构造方法有什么用呢?
答:可以用于子类访问父类数据前,对父类数据进行初始化。

注意:abstract 不能修饰成员变量
注意:有抽象方法的类一定是抽象类(或者接口),抽象类中不一定有抽象方法。
------------------------------------------------------------------------------------------------------------------
11_面向对象(葵花宝典)
------------------------------------------------------------------------------------------------------------------
12_面向对象(抽象类练习猫狗案例)
------------------------------------------------------------------------------------------------------------------
13_面向对象(抽象类练习老师案例)
------------------------------------------------------------------------------------------------------------------
14_面向对象(抽象类练习员工案例)
------------------------------------------------------------------------------------------------------------------
15_面向对象(抽象类中的面试题)

一个抽象类如果没有抽象方法,可不可以定义为抽象类?如果可以,有什么意义?
可以,这么做目的只有一个,就是不让其他类创建本类对象,交给子类完成

abstract不可以和那些关键字共存?

static 被静态修饰的方法可以 类名. 调用,而抽象方法没有方法体这样做没有意义

final 被 final 修饰的方法不能被重写,而抽象方法最终都是要被重写的两者冲突

private 抽象方法需要被重写,而如果父类的方法被私有化,子类是看不到的无法完成重写
------------------------------------------------------------------------------------------------------------------
16_面向对象(接口的概述及其特点)

一 如何定义一个接口?
        使用关键字 interface        

二         如何让一个类去实现一个接口?以及各式
  类 implements 接口    这就是一个类实现了该接口

接口特点
1 不能实例化
2 接口的子类要么重写它所有的抽象方法,要么也是一个抽象类或接口.

--------------------------------------------------------------------------------------------------------
17_面向对象(接口的成员特点)

A:成员常量:接口中只有常量,因为有默认修饰符 public static final

B:构造方法:没有构造方法,因为接口中所有方法不需要初始化,而且常量是静态修饰的class文件加载时就已经有值了

C:成员方法:接口中只有抽象方法,因为有默认修饰符 public abstract

--------------------------------------------------------------------------------------------------------
18_面向对象(类与类,类与接口,接口与接口的关系)

A:类与类的关系
类与类之间是继承关系,可以单继承,可以多层继承,但是不能多继承

B:类与接口的关系
类与接口是实现关系,可以单实现也可以多实现
并且还可以在继承一个类的同时实现多个接口.

C:接口与接口的关系
接口与接口是继承关系,可以单继承也可以多继承.
------------------------------------------------------------------------------------------------------------------
19_面向对象(抽象类和接口的区别)
设计理念区别
         抽象类 被继承体现的是:”is a”的关系。抽象类中定义的是该继承体系的共性功能。
         接口 被实现体现的是:”like a”的关系。接口中定义的是该继承体系的扩展功能。
------------------------------------------------------------------------------------------------------------------





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2