博客:------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
面向对象(下)
一:代码块:使用{}括起来的代码被称为代码块
局部代码块 :
在方法中出现;限定变量生命周期,及早释放,提高内存利用率
构造代码块:
多个构造方法方法中相同的代码存放到构造代码块中
每次调用构造方法,构造代码块都会执行,并且在构造方法前执行
静态代码块:
并加上static修饰;用于给类进行初始化,
在加载的时候就执行,并且值执行一次
二:继承
1,概念:继承是从已有的类中派生出新的类,
新的类能吸收已有类的数据属性和行为,并能扩展新的能力
2,继承的好处和弊端
提高了代码的复用性
多个类相同的成员可以放到同一个类中
提高了代码的维护性
如果功能的代码需要修改,修改一处即可
让类与类之间产生了关系,是多态的前提
其实这也是继承的一个弊端:类的耦合性很强
继承特点
Java只支持单继承,不支持多继承
Java支持多层继承(继承体系)
3,继承的注意事项:
子类只能继承父类所有非私有的成员(成员方法和成员变量)
其实这也体现了继承的另一个弊端:打破了封装性
子类不能继承父类的构造方法,
但是可以通过super(后面讲)关键字去访问父类构造方法
不要为了部分功能而去继承
4,继承中构造方法的注意事项:
子类通过super去显示调用父类其他的带参的构造方法
super(参数列表)
子类通过this去调用本类的其他构造方法
this(参数列表)
一定要注意
super(…)或者this(….)必须出现在第一条语句上
否则,就会有父类数据的多次初始化
三:this和super的区别
this 代表本类对应的引用
super代表父类存储空间的标识(可以理解为父类引用)
用法(this和super均可如下使用)
访问成员变量
this.成员变量 super.成员变量
访问构造方法(子父类的构造方法问题讲)
this(…) super(…)
访问成员方法(子父类的成员方法问题讲)
this.成员方法() super.成员方法()
四:方法重写
子类中出现了和父类中一模一样的方法声明,也被称为方法覆盖,方法复写。
使用特点
如果方法名不同,就调用对应的方法
如果方法名相同,最终使用的是子类自己的
方法重写的应用:
当子类需要父类的功能,而功能主体子类有自己特有内容时,
可以重写父类中的方法,
这样,即沿袭了父类的功能,又定义了子类特有的内容
方法重写的注意事项:
1:父类中私有方法不能被重写
2:子类重写父类方法时,访问权限不能更低
3:父类静态方法,子类也必须通过静态方法进行重写。
其实这个算不上方法重写,但是现象确实如此,
至于为什么算不上方法重写,多态中我会讲解
五:final关键字
final关键字是最终的意思
修饰类,类不能被继承
修饰变量,变量就变成了常量,只能被赋值一次
修饰方法,方法不能被重写
六:(重点)多态:
概念: 一个事物的多种形态
多态前提和体现
有继承关系或者实现关系
有方法重写
有父类引用指向子类对象
成员访问特点
方法的运行看右边,其他都看左边
多态的好处
提高了程序的维护性(由继承保证)
提高了程序的扩展性(由多态保证)
多态的弊端:
父类不能访问子类的特有方法
如果非要访问,向下转型(强转)
向上转型
从子到父
父类引用指向子类对象
向下转型
从父到子
父类引用转为子类对象
七:抽象类:
抽象类:包含抽象方法的类,就是抽象类。 需要使用关键字 abstract修饰
抽象方法:只有方法声明,没有方法体, 需要使用关键字 abstract修饰
抽象类特点
1:抽象类和抽象方法必须用abstract关键字修饰
格式
abstract class 类名 {}
public abstract void eat();
2:抽象类不一定有抽象方法,有抽象方法的类一定是抽象类
3:抽象类不能实例化
那么,抽象类如何实例化呢?
按照多态的方式,由具体的子类实例化。
其实这也是多态的一种,抽象类多态。
4:抽象类的子类
要么是抽象类
要么重写抽象类中的所有抽象方法
注意:想创建对象,必须要将所有的抽象方法实现,才能创建对象
抽象类的成员特点:
成员变量
可以是变量
也可以是常量
构造方法
有构造方法,但是不能实例化
那么,构造方法的作用是什么呢?
用于子类访问父类数据的初始化
成员方法
可以有抽象方法 限定子类必须完成某些动作
也可以有非抽象方法 提高代码服用性
abstract不能和哪些关键字共存
private 冲突
final 冲突
static 无意义
八:(重点)接口:
接口特点
接口用关键字interface表示
格式:interface 接口名 {}
类实现接口用implements表示
格式:class 类名 implements 接口名 {}
接口不能实例化
那么,接口如何实例化呢?
按照多态的方式,由具体的子类实例化。
其实这也是多态的一种,接口多态。
接口的子类
要么是抽象类
要么重写接口中的所有抽象方法
接口成员特点
成员变量
只能是常量
默认修饰符 public static final
构造方法
没有,因为接口主要是扩展功能的,而没有具体存在
成员方法
只能是抽象方法
默认修饰符 public abstract
类与类关系:
继承关系,只能单继承,但是可以多层继承
类与接口关系:
实现关系,可以单实现,也可以多实现
还可以在继承一个类的同时实现多个接口
接口与接口关系:
继承关系,可以单继承,也可以多继承
九: 形式参数和返回值问题
形式参数:
基本类型:
引用类型:
具体类 : 参数列表中要接收的是,具体类的实例对象
抽象类 : 参数列表中要接收的是,继承抽象类的子类的实例对象
接口 : 参数列表中要接收的是,实现接口的类的实例对象
返回值:
基本类型:
引用类型:
具体类 : 返回结果是,具体类的实例对象
抽象类 :返回结果是,继承抽象类的子类的实例对象
接口 :返回结果是,实现接口的类的实例对象
十:匿名内部类,就是没有名字的内部类,它是内部类的简化写法。
前提:存在一个类或者接口
这里的类可以是具体类也可以是抽象类。
格式:
new 类名或者接口名() {
重写方法;
};
本质:
是一个继承了类或者实现了接口的子类匿名对象
匿名内部类:
理解为继承了一个类或者是实现了一个接口的子类,
并且完成了子类对象的创建,
同时子类对象没有名字