5 面向对象的特征
封装
继承
多态
5.1 封装
隐藏对象的属性和实现细节,仅对外提供公共访问方式
好处:
便于使用
提高重用性
提高安全性
例如:函数(最小的封装体)、类、包、框架。
5.2 继承
1、继承的特点
提高了代码的复用性。
类和类之间之间产生了关系,从而有了多态的特性。
java只支持单继承,以为多继承容易带来安全隐患:当多个父类中定义了相同功能,但功能内容不同时,子类对象不确定运行哪一个。但是java保留了这种机制,用接口来完成多实现。
java支持多层继承。
子类和父类中有相同的变量,子类会覆盖父类的变量。
当子类中出现和父类一模一样的函数,当子类对象调用该函数时,会运行子类函数的内容,这就是函数的重写,也叫做覆盖。子类覆盖父类,必须保证子类权限大于等于父类权限才可以覆盖。
静态只能覆盖静态
若要在子类中访问父类中的同名变量或方法时,需要使用关键字super.变量名/方法
在对子类对象初始化时,父类的构造函数也会运行,那是因为子类的构造函数默认第一行有一条隐式得得语句super();super()会访问父类的无参构造函数,而且子类中的构造函数默认第一行都是super();
2、为什么子类一定要访问父类的构造函数?
因为父类中的数据子类可以直接获取,所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的。所以子类在对象初始化时,先要访问一下父类中的构造函数。
如果父类中没有无参构造函数,需要在子类的构造函数中手动定义super语句。
super语句一定定义在子类构造函数的第一行。
5.3 多态
可以理解为事物存在的多种体现形态
1、多态的体现
父类的引用也可以接受自己的子类对象
2、多态的好处
提高了程序额扩展性
3、多态的前提
类与类之间是继承或实现的关系
存在方法的覆盖
4、多态的弊端
只能使用父类的引用访问父类中的成员
5、在多态中成员函数的调用:编译看左边,运行看右边
6、在多态中成员变量额特点:无论编译和运行都参考左边
5.4 final关键字
final是一个修饰符,可以修饰类、函数、变量。
被final修饰的类不可以被继承,为了避免被继承,被子类复写功能
被final修饰的方法不可以被复写
被final修饰的变量是一个常量,只能赋值一次,既可以修饰成员变量,也可以修饰局部变量。常量的命名规范是所有字母都大写,如果有多个单词组成,单词间通过下划线_连接
内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量
5.5 抽象类
抽象类中既可以有抽象方法,也可以有非抽象方法
抽象方法一定定义在抽象类中
抽象方法和抽象类都必须被abstract关键字修饰
抽象类不可以用new创建对象,因为调用抽象方法没意义
抽象类中的抽象方法要被调用,必须由子类复写所有的抽象方法后,建立子类对象调用。如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。
5.6 接口
使用interface关键字声明一个接口
特点:
接口中的属性都是静态常量,默认public static final
接口中的方法都是抽象方法,默认public abstract
接口不可以创建对象,因为有抽象方法
接口需要被子类实现,子类对接口中的方法全都覆盖后,子类才可以实例化,否则子类是一个抽象类
接口可以被类多实现,而且接口之间可以有多继承
5.7 内部类
1、访问规则:
内部类可以直接访问外部类中的成员,包括私有
外部类要访问内部类,必须建立内部类对象
2、访问格式:
外部类名.内部类名 变量名 = 外部类对象.内部类对象
Outer.Inner inner = new Outer().new Inner();
当内部类在成员位置上,就可以被成员修饰符所修饰,比如
private:将内部类在外部类中进行封装
static:内部类就具备static的特性。这时内部类只能直接访问外部类中的static成员
3、注意:
当内部类中定义了静态成员,该内部类必须是static的
当外部类中的静态方法访问内部类时,内部类也必须是static的
内部类定义在局部时,不可以被成员修饰符修饰
可以直接访问外部类中的成员,但是不可以访问他所在的局部中的变量,只能访问被final修饰的局部变量匿名内部类
匿名内部类其实就是内部类的简写格式
4、定义匿名内部类的前提
内部类必须是继承一个类或者实现接口
5、匿名内部类的格式
new 父类或者接口(){定义子类的内容}
其实匿名内部类就是一个匿名子类对象
5.8 异常
异常就是程序在运行时出现的不正常情况,是对问题的描述,将问题进行封装
1、问题的划分:
一种是严重的问题,另一种是非严重的问题
对于严重问题,通过Error类进行描述。一般不编写针对性的代码对其进行处理
对于非严重问题,通过Exception类进行描述,使用针对性的方式进行处理
2、Error和Exception的父类是Throwable
Throwable
|--Error
|--Exception
3、异常处理
try{
需要被检测的代码;
}catch(异常类 变量){
处理异常的代码(处理方式);
}finally{
不管是否出错,一定会执行的语句;
(但是使用System.exit(0)时,不会执行)
}
finally一定会执行的代码,通常用于关闭资源
catch是用于处理异常,如果没有catch就代表异常没有被处理过。如果是检测时异常,就必须声明出去
4、异常特点
异常体系中的所有类以及建立的对象都具有可抛性,可以被throw和throws关键字所操作
5、throws Exception(放在方法的后面)
通过throws关键字声明了该功能可能会出现问题
声明的异常需要用try/catch处理,声明几个异常,就对应几个catch块
6、对捕获到的异常对象进行常见操作
String getMessage();获取异常信息
String toString();异常名称:异常信息
void printStackTrace();异常名称,异常信息,异常出现的位置。也是jvm默认的异常处理机制
7、throws和throw的区别
throws使用在函数上
throw使用在函数内
当函数内容有throw抛出异常对象,并未进行try处理,必须在函数上声明(RuntimeException除外)
如果函数声明了异常,调用者需要进行处理,处理方法有throws和try
throws后面跟的是异常类,可以跟多个,用逗号隔开
throw后面跟的是异常对象
8、Exception中有一个特殊的子类异常RuntimeException运行时异常
如果函数内容抛出该异常,函数上可以不用声明
如果函数上声明了该异常,调用者可以不用进行处理
9、异常的分类:
(1) 编译时被检测的异常
该异常在编译时,如果没有处理,则编译失败
(2)编译时不被检测额异常(运行时异常,RuntimeException及其子类)
在编译时,不需要处理,编译器不检查
该异常的发生,建议不处理,让程序停止
10、异常在子父类覆盖中的体现
子类在覆盖父类时,如果父类的方法抛出异常,那么子类的覆盖方法,只能抛出父类的异常或者该异常的子类
如果父类方法抛出多个异常,那么子类覆盖方法时,只能抛出父类异常额子集
如果父类或者接口额方法中没有异常抛出,那么子类覆盖方法时,也不可以抛出异常。若真发生异常,就必须要进行try/catch处理。
11、自定义异常
定义类继承Exception或者RuntimeException,为了让该自定义累具备可抛性,让该类具备操作异常的共性方法
5.9 包(package)
对类文件分类管理
给类提供多层命名空间
卸载程序文件的第一行
类名的全称是 包名.类名
包也是一种封装形式
1、包与包之间进行访问
被访问的包中的类以及类中的成员,需要public修饰
不同包中的子类还可以直接访问父类中被protected权限修饰的成员
包与包之间可以使用的权限只有两种,public、protected
2、权限范围
public protected default private
同一个类中 ok ok ok ok
同一个包中 ok ok ok
子类 ok ok
不同包中 ok
3、import
为了简化类名的书写,使用import关键字
import导入的是包中的类
本文出自 “java基础” 博客,请务必保留此出处http://8163413.blog.51cto.com/8153413/1712318
原文地址:http://8163413.blog.51cto.com/8153413/1712318