时间对于一个追梦的人来说就是黄金,没有什么能阻挡前行的脚步。--致所有和我一样追逐明天太阳的人
接口的理解:接口是对动作的抽象说动作还不如说功能 抽象类理解:抽象类是对根源的抽象 多态的理解:类加载运行时父类的引用指向子类的对象
抽象大小关系:接口>抽象类
先通过一个例子来有个的概率
人 、学生两个类
首先我们要确定是否有继承关系,我们一般讲 is a或者has a的关系进行判断,也就是说学生是人,人包含了学生,这一点要明确。
其次我们要定义父类,定义这一类的特性,如姓名、年龄、性别、肤色等等这样的共性,学生将会继承这些属性,但是每类职业都会有属于自己的工作,这是我们提炼出来的,对其工作抽象出来处理,让继承了人这个类的子类去实现自己的工作方式。与此同时每个类别的职业人都有自己的生活方式,比如学生除了上课,他还去做些兼职、公交司机上完班后还去跑滴滴等等,那么这时候我们需要使用接口去实现,换句话说除了我们设计的职业之外,他还去干了什么事儿,身上还有其他什么功能这些都是由接口决定的,这就是为什么说接口是实现多继承的原因。
换句术语来说接口是设计(需要什么我去设计什么)的结果 ,抽象类是重构(覆盖、重写)的结果
重构(名词):对软件内部结构的一种调整,目的是在不改变"软件之可察行为"前提下,提高其可理解性,降低其修改成本。
比如一个游戏的版本升级,对某个功能的bug修复,这个时候就会在实现接口的类里面进行修复。归根接底是在类加载程序运行时父类的引用指向了子类的实例化对象,就行成了多态,但是由于java中的只能是单继承,所以担任就交给了接口。
阐述各自的概念:
继承:1、主要是优化代码 2、类与类的层级关系(语言是面向对象的,任何时候都可以拿生活中的例子去套用,开发大脑吧)
强调一点,继承是不要乱用,在面向对象的思想里面,代码应该要有体现,一般用 is a或者has a的关系进行判断
定义一个【人】 类
package com.physical;
//定义一个抽象类,学生类的根源类就是人
public abstract class Person {
int idcard;//身份证
String sname;//姓名
//定义抽象方法的时候一定要使用关键字abstract
//因为抽象类可有可无抽象方法
//抽象方法不能有完成操作的实体也就是{}
abstract void toDoThings();
//定义一个已实现的方法
void eatFood() {
System.out.println("每天一日三餐");
}
}
学生类继承人类
package com.physical;
public class Student extends Person{
//学生这个群体继承了人这个类,子类就隐式添加了父类的成员变量
//定义了两个成员变量,职业、学生编号
//此时学生子类就有了四个成员变量
String profession;
int stuid;
//如果父类没有显示的创建构造函数,那么程序会在加载的时候自动创建一个无参的构造函数
//当创建类的实例化对象的时候,子类隐式的构造函数会的调用父类的隐式构造函数 --一般情况下我们称构造器
//父类过显示的创建了无参的构造函数,如果要创建一个默认对象的时候,子类也必须显示的创建无参数构造函数
Student(){
}
//使用有参的构造函对类成员数初始化
//无论有多少层的继承关系,程序的执行顺序都是从父类一直到Object类,所有没有显示添加继承关系的类都默认是Object的子类
//现在想想Java之父一定是个哲学家,真是大神中的大神,膜拜三方
Student(int idcard,String sname){
super(idcard,sname);
}
//继承了抽象类的子类必须实现父类的抽象方法,除非继承的子类也是抽象类
@Override
void toDoThings() {
System.out.println("我叫"+sname+"身份证号是:"+idcard+"是一名"+profession+"学生编号是"+stuid+"每天的工作就是学习");
}
//写到这里的时候我反问了下自己,父类为什么要去写已实现的方法
//给自己的答案是:父类是所有继承类的超类,对所有超类实现了普适性,也就是说如果子类没有重写父类的方法,那么所有的对象会默认为是子类的行为
//如果这里的eatFood方法我没显示的创建,父类的eatFood方法不会像变量那样加载到子类,这里要的节点在于对象是个引用类型,所以应该解释为子类的子类的eatFood()变量会指向父类的eatFood方法地址
//如果显示的创建eatFood方法,那么就会指向student类的地址
void eatFood() {
System.out.println("我每天上午七点起床,吃早餐喝牛奶");
System.out.println("八点一刻左右的时候练会儿瑜伽");
System.out.println("中午吃点牛肉,碳水化合物很少");
System.out.println("晚上的时候吃个三分饱");
}
}
实现的方法
package com.physical;
public class Test {
public static void main(String[] args) {
Student stu=new Student(123456789,"Joncky");
stu.eatFood();
Person p=new Student();
}
}
输出的结果是