写在前面:
当毕老师讲的这里时,我被毕老师的无鞋彻底打败了
----------------------------华丽的分割线--------------------------------------
继承 is a
将共性描述提取出来。单独描述
1:提高了代码 复用性
2:是类与类直接产生了关系,有了关系,才 有了 多态的特性
java 语言中:只支持单继承,不支持多继承
因为多继承容易带来安全隐患
当多个父类中定义了相同功能,子类对象不知道运行哪一个
但是java保留了这中机制,并用另一种形式来完成;
java继承多层继承,也就是一个继承体系
如何使用一个继承体系中的功能:
先查询体系父类的描述,通过了解共性功能,就可以知道该体系基本功能
聚集关系:has a
根据紧密程度分为:
聚合:好比球队中球员的关系,
组合:好比人身体各个身体部位的关系。更紧密
----------------------------华丽的分割线--------------------------------------
子父类中变量的特点:
1:变量
子类中出现非私有的同名成员变量时,
子类要访问本类中的变量 用this
子类要访问父类中的变量 用super
super代表父类对象的应用
子父类中函数的特点-覆盖(重写)
当子类中出现和父类一模一样的函数时,会运行子类函数的内容,
就好像父类的函数被覆盖一样
注意:子类覆盖父类 必须保证 子类权限大于等于父类权限,否则编译失败;
静态只能覆盖静态
重载只看同名函数的参数列表
重写是 子父类方法要一模一样
子父类中构造函数的特点--子类实例化过程
子类实例化时,父类构造函数先运行,因为
子类构造函数第一行有 隐式 代码 super();
super() 会访问父类空参数的构造函数,而且
子类所有的构造函数第一行都有 隐式 代码 super();
----------------------------华丽的分割线--------------------------------------
为什么 子类一定要访问父类的构造函数:
因为父类中的数据,子类可以直接获取,所以在建立时
需要先查看父类是如何对这些数据进行初始化的;
所以子类在对象初始化时,要先访问父类中的构造函数
如果要父类指定的构造函数,可以手动定义super 语句
子类所以构造函数默认都会访问父类中空参数的构造函数
当父类中没有空参数的构造函数时,子类必须手动 super
语句形式来指定要访问的构造函数;
当然。子类的构造函数第一行可以手动指定this语句来访问本类
中的构造函数,子类中至少会有一个构造函数访问父类的构造函数;
----------------------------华丽的分割线--------------------------------------
final 关键字
final 可以修饰类 方法 变量
final :最终
被final修饰的类不可以被继承
为了避免被继承,被子类复习功能
被final修饰的方法不可以被复写
被final修饰的变量时常量,只能赋值一次,既可以修饰成员变量,
也可以是局部变量。
当在描述事物时,一些数据的出现值是固定的,
那么为了增强阅读性,给这些值命名方便阅读,
而这些数据不需要改变,所以加final修饰
作为常量,常量的书写规范:
所以字母都大写,如果由多个单词组成,之间用_连接
内部类定义在类中的局部位置上时,只能
访问该局部被final修饰的局部变量;
----------------------------华丽的分割线--------------------------------------
抽象类:
当多个类中出现相同功能,但是功能主题不同,
这时可以向上抽取,这时,只抽取功能定义,
不抽取功能主体;
抽象类的特点:
1:抽象方法必须放在抽象类;
2:抽象方法和抽象类都必须被abstract修饰
3:抽象类不可以用new 创建对象,
4:抽象类中的方法要被使用,必须由子类复习所有抽象
方法,建立子类对象调用;如果子类只覆盖了部分抽象方法,
那么该子类还是抽象类;
抽象类中基于抽象方法也有非抽象方法;
抽象类和一般类没有太大不同;
抽象类比一般类多了抽象方法
抽象类不可被实例化
特殊:抽象类中可以不定义抽象方法,这样做仅仅是不让该类建立对象。
abstract class Student
{
abstract final void study();
//abstract void study1();
void sleep()
{
System.out.println("躺着");
}
}
/*
class ChongCiStudent extends Student
{
void study()
{
System.out.println("chongci study");
}
}
class BaseStudent extends Student
{
void study()
{
System.out.println("base study");
}
}
class AdvStudent extends Student
{
void study()
{
System.out.println("adv study");
}
}
*/
class AbstractDemo
{
public static void main(String[] args)
{
//new Student();
//new BaseStudent().study();
}
}
----------------------------华丽的分割线--------------------------------------
模板方法模式:
需求:获取一段代码运行的时间
原理:获取程序开始和结束时间,最后相减
什么是模板方法:
在定义时,功能的一部分是确定的,而一部分是
不确定的,而确定的部分使用不确定的部分;
那么 将不确定部分暴露,有该类的子类完成,
abstract class GetTime
{
public final void getTime()
{
long start = System.currentTimeMillis();
runcode();
long end = System.currentTimeMillis();
System.out.println("毫秒:"+(end-start));
}
public abstract void runcode();
}
class SubTime extends GetTime
{
public void runcode()
{
for(int x=0; x<4000; x++)
{
System.out.print(x);
}
}
}
class TemplateDemo
{
public static void main(String[] args)
{
//GetTime gt = new GetTime();
SubTime gt = new SubTime();
gt.getTime();
}
}
----------------------------华丽的分割线--------------------------------------
4.8接口
接口:初期理解,可以认为是一个特殊的抽象类
当抽象类中的方法都是抽象的,那么该类可以通过接口的形式来表示。
接口定义特点:
1:接口中常见定义:常量,抽象方法
2:接口中的成语都有固定修饰符
常量:public static final
方法:public abstract
接口中的成语都是public
接口不可以创建对象,需要被子类实现,
子类对接口中的抽象方法全部覆盖后,
子类才可以实例化,否则子类是一个抽象类。
接口可以被类多实现,也是对多继承不支持的转换形式。java支持多实现。
接口的特点:
是对外暴露的规则
是程序的功能扩展
可以用来多实现
类与接口是实现关系、类可以继承一个类的同时实现多个
接口;
接口与接口直接可以有继承关系;
接口之间可以有继承关系;
|
组图打开中,请稍候......
|