叨逼叨两句
有些书吧,看第一页就会发现作者跟自己是一类人呢,这算是翻看《Thinking in Java》的第一印象了,那么抽象的描述,但是自己第一眼就喜欢上了,看来我选择做程序员这条路果然是对的,总算找到同类了。
09-(01-08):多态
多态概述
事物存在的多种形态
多态前提
- 要有继承关系
- 要有方法重写
- 要有父类引用指向子类对象
多态中的成员访问特点(重要!!!)
该部分值得再看看视频(09-02、09-03)
成员变量(勿论静态还是非静态)
编译看左边(父类),运行看左边(父类)。
非静态成员方法
编译看左边(父类),运行看右边(子类)。【动态绑定】
静态成员方法
编译看左边(父类),运行看左边(父类)。
多态中的向上转型和向下转型
多态中,先向上转型,才能向下转型。
Animal a = new Dog();//向上转型
Dog b = (Dog)a;//向下转型
多态的好处与弊端
弊端
- 不能直接使用子类特有的属性与方法,需要进行强制转换。
好处
- 提高了代码的维护性(继承保证)
- 提高了代码的扩展性(多态保证)【开发时很少在创建对象时将父类引用指向子类对象,直接用子类对象指向子类对象,可使用子类特有属性与方法,更方便,多态的应用主要是在于传递参数】
类型检测
instanceof使用方法
09-(09-15):抽象类
抽象类的特点
- 抽象类不一定有抽象方法,但有抽象方法的类一定是抽象类
- 抽象类不能实例化,必须按照多态的方式,由具体的子类实例化,其实这也是多态的一种,抽象类多态。
- 抽象类的子类:要么是抽象类,要么重写抽象类中所有抽象方法。
抽象类的成员特点
- 成员变量:抽象类的成员变量可以是变量和常量,abstract不能修饰成员变量。
- 成员方法:抽象类的成员方法可以是抽象方法,也可以是非抽象方法
- 构造方法:有,用于子类访问父类数据的初始化。
应用场景
当你无法描述一个方法时,将它定义为抽象的.
注意事项
- 抽象类中如果没有抽象方法,能不能定义为抽象类?当然,它的目的只有一个,就是不让其他类创建本类对象,而是交给子类完成。
abstract不能和哪些关键字共存?
- final:相互矛盾,被abstract修饰的方法和类分别需要被重写和继承,但final都不允许。
- static:被static修饰可以用类名调用,但是abstract没有方法体,用类名调用无意义。
- private:被abstract修饰是为了让子类看到并重写,而加上private就无法让子类看到了。
09-(16-17):接口
接口概述
- 从狭义角度:java中的interface。
从广义角度:对外提供规则的都是接口。【USB接口的例子举的精辟!!!另外老师关于一流公司卖规则、二流公司卖品牌、三流公司卖服务的观点超有启发性!!!解答了我的一个编程外的疑问!!!谢谢!!!】
接口特点
- 接口本身不能被实例化【因为调用内部没有方法体的抽象方法没有意义】,接口通过多态的方式实例化
接口的子类
- 抽象类:可以,但意义不大。
- 具体类:推荐,要重写所有抽象方法。
接口成员特点
- 成员变量:只能是常量,并且是静态和公共的,系统默认修饰符是public static final,他们三个没顺序要求。建议手动写下。
- 成员方法:只能是抽象方法,系统默认修饰符:public abstract,他们两个没顺序要求。建议手动写下。
- 构造方法:接口没有构造方法【别忘了每个类都有继承自Object】
09-18:类与类、类与接口、接口与接口的关系
类与类
- 继承关系,只能单继承,不能多继承。
类与接口
- 实现关系,可以单实现,也能多实现。
- 可以在继承一个类的同时,实现多个接口。
接口与接口
- 继承关系,可以单继承,也可以多继承。
09-19:抽象类与接口的区别
成员区别
抽象类
- 成员变量:可以是变量,也可以是常量。
- 成员方法:可以是抽象方法,也可以是非抽象方法
- 构造方法:有
接口
- 成员变量:只能是常量
- 成员方法:只能是抽象方法
- 构造方法:无
关系区别
同9-18
设计理念区别
- 抽象类:被继承体现的是“is a”的关系。抽象类中定义的是该继承体系的共性功能。
- 接口:被实现体现的是“like a”的关系,接口中定义的是该继承体系的扩展功能。
扩展阅读
区分继承(泛化)、实现、依赖、关联、聚合、组合
区分is-a(继承关系)、has-a(组合关系)、like-a(聚合关系)
09-20:练习
- 子类不会继承父类的构造方法,这个要子类自己写
- 子类初始化时,在其构造方法中用super将参数传给父类进行初始化,再用继承自父类的get方法取用即可。
package test_heima_08;
public class Test_Demo06 {
public static void main(String[] args){
Dog a = new Dog("mm",18);
System.out.println(a.getName() + a.getAge());
}
}
class Animal{
private String name = "kk";
private int age = 60;
public Animal(){
}
public Animal(String name,int age){
this.name = name;
this.age = age;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
}
class Dog extends Animal{
public Dog(){
}
public Dog(String name,int age){
super(name,age);
}
}