Java面向对象(三)——关键字(this,super,static,final,abstract,interface,implements,throw)
Java面向对象(三)——关键字(this,super,static,final,abstract,interface,implements,throw)
前面两篇文章我们介绍了类和类的成员以及面向对象的三大特征,但并不全面。因此这篇文章继续基于atguigu系列课程再对主要的一些基础关键字进行总结,对前面的内容作一个补充。
1.this
this关键字的作用和它的词义很接近,在方法内使用时表示这个方法所属对象的引用;在构造器中使用时表示该构造器正在初始化的对象。 this可以调用类的属性、方法和构造器,使用时有如下需要注意的:
- 当形参与成员变量同名时, 如果在方法内或构造器内需要使用成员变量,必须添加this来表明该变量是类的成员变量;例如:this.name = name;中this.name表示本类的成员变量,而name表示方法或构造器的形参。
- 通常情况下(形参与成员变量不重名时)this可以省略,加上this能够增强程序的可阅读性;
- 使用this访问属性和方法时, 优先在本类中找,如果在本类中未找到,会从父类中查找;
- this可以在构造器中调用本类重载的构造器。
关于第四点需要说明:调用其他构造器时使用“this(形参列表)”的语法,必须声明在类的构造器的首行,且一个构造器中最多只能声明一个;构造器中不能调用自身构造器;如果一个类中声明了n个构造器,则最多有 (n - 1)个构造器中使用了 “this(形参列表)”。
2.super
super关键字使用的前提是继承,super可用于访问父类中定义的属性、成员方法以及在子类构造器中调用父类的构造器 ,尤其当子父类出现同名成员时,可以用super.属性、super.方法表明调用的是父类中的成员。调用父类构造器时,子类中所有的构造器默认都会访问父类中空参数的构造器,当父类中没有空参数的构造器时,子类的构造器必须通过 "this(形参列表)"或者 "super(形参列表)"语句指定调用本类或者父类中相应的构造器(只能二选一,且放在构造器首行)。super对父类的追溯不仅限于直接父类。
super和this的作用较为类似,我们对这两个关键字进行区别:
区别点 | this | super |
---|---|---|
访问属性、方法 | 访问本类中的属性或方法,如果本类没有此属性则从父类中继续查找 | 直接访问父类中的属性或方法 |
调用构造器 | 调用本类构造器 | 调用父类构造器 |
3.static
static关键字可以修饰属性、方法、代码块、内部类。当一个类的成员作为该类各个对象之间共享的变量时,即不因对象的不同而改变时,可以考虑使用static修饰该成员,被修饰后具有如下特点:
- 随着类的加载而加载 ,优先于对象存在;
- 修饰的成员被所有对象所共享 ;
- 访问权限允许时,可不创建对象直接被类调用(调用格式:类名.属性或类名.方法名());
- static修饰的属性(静态变量或类变量)加载在方法区的静态域中,仅存在一份;
- 在static方法内部只能访问类的static修饰的属性或方法,不能访问类的非static的结构;
- 因为不需要实例就可调静态方法,因此static方法内部不能有this、super关键字;
- static修饰的方法不能被重写
需要注意,在理解static关键字时,要从类和对象的生命周期角度去理解。
4.final
final关键字可以修饰类、变量和方法。
- final修饰的类不能被继承(例如String类、System类、StringBuffer类 );
- final修饰的方法不能被子类重写(例如Object类中的getClass());
- final修饰的变量即为常量,声明时或在每个构造器中或代码块中显式赋值,然后才能使用。,只能被赋值一次。
5.abstract
abstract关键字可以修饰类和方法,不能修饰变量、代码块、构造器。
用abstract修饰的类叫做抽象类——一个父类设计得非常抽象,以至于它没有具体的实例。
用abstract来修饰的方法叫做抽象方法——只有方法的声明,没有方法的实现,以分号结束。 例如:
public abstract void talk();
含有抽象方法的类必须被声明为抽象类。抽象类不能被实例化,抽象类是用来被继承的(因此抽象类中一定包含构造器,便于子类对象实例化),抽象类的子类必须重写父类的抽象方法,并提供方法体,若没有重写全部的抽象方法,仍为抽象类。此外,不能用abstract修饰私有方法、静态方法、final的方法、final的类,均由于上述类或类的成员中不能重写父类的方法,与abstract子类必须重写父类中抽象方法相矛盾。
6.interface、implements
Java本身不支持多继承,但有时必须从几个类中派生出一个子类,接口的使用可以达到多重继承的效果,但继承是“is-a”的关系,而接口实现是“能不能”的关系。例如U盘、手机、打印机之间并不具有“is-a”的关系,但都支持USB连接这一共同的特征,也就是都能够使用USB连接。
用interface来定义接口,用implements来实现接口,例如:
public interface Runner { } //定义接口
class SubClass extends SuperClass implements InterfaceA{ } //实现接口
接口时抽象方法和常量值定义的集合(JDK7.0之前),其具有以下特点:
- 接口采用多继承机制
- 接口中没有构造器
- 接口中的所有成员变量都默认是由public static final修饰
- 接口中的所有抽象方法都默认是由public abstract修饰的。
从本质上讲接口是一种特殊的抽象类。一个类可以实现多个接口,实现接口的类中必须提供接口中所有方法的具体实现内容,方可实例化。接口也可以继承其它接口,与继承关系类似,接口与实现类之间存在多态性 。
既然说接口是一种特殊的抽象类,那我们就来将接口和抽象类作一个对比:
区别点 | 抽象类 | 接口 |
---|---|---|
定义 | 包含抽象方法的类 | 主要是抽象方法和全局常量的集合 |
组成 | 构造方法、抽象方法、普通方法、 常量、变量 | 常量、抽象方法、(jdk8.0:默认方法、静态方法) |
使用 | 子类继承抽象类(extends) | 子类实现接口(implements) |
关系 | 抽象类可以实现多个接口 | 接口不能继承抽象类,但允许继承多个接口 |
局限 | 抽象类有单继承的局限 | 接口没有此局限 |
实际 | 作为一个模板 | 作为一个标准或是表示一种能力 |
对象 | 都通过对象的多态性产生实例化对象 | |
选择 | 如果抽象类和接口都可以使用的话,优先使用接口,因为避免单继承的局限 |
在JDK8.0中对接口做了改进,允许用户在接口中定义静态方法和默认方法。
静态方法:用 static 关键字修饰,可以通过接口直接调用静态方法,并执行 其方法体。
默认方法:用 default 关键字修饰,可以通过实现类对象来调用。
7.try-catch-finally、throw、throws
提到这三个关键字不得不先说一说异常处理,异常事件可分为两类:
- Error:Java虚拟机无法解决的严重问题,一般不编写针对性 的代码进行处理。
- Exception: 其它因编程错误或偶然的外在因素导致的一般性问题,可以使 用针对性的代码进行处理。
我们着重说明Exception异常,按照发生的事件可以将Exception异常分为两类——编译时异常、运行时异常。常见的编译时异常有IOException、ClassNotFoundException等;常见的运行时异常有NullPointerException、ArrayIndexOutOfBoundsException、ClassCastException、NumberFormatException、InputMismatchException、ArithmeticException等。
在编写程序时,经常要在可能出现错误的地方加上检测的代码,Java异常处理的方式:
- 方式一:try-catch-finally(对异常进行处理)
- 方式二:throws + 异常类型(仅抛出异常)
如果一个方法内抛出异常,该异常对象会被抛给调用者方法中处 理。如果异常没有在调用者方法中处理,它继续被抛给这个调用 方法的上层方法。这个过程将一直继续下去,直到异常被处理。如果一个异常回到main()方法,并且main()也不处理,则程序运行终止。
try-catch-finally异常处理格式如下:
try{
// 可能产生异常的代码
}catch(ExceptionName1 e){
// 当产生ExceptionName1型异常时的处置措施
}catch(ExceptionName2 e){
//当产生ExceptionName2型异常时的处置措施
} finally{
//无论是否发生异常,都无条件执行的语句
//finally是可选的
}
如果明确知道产生的是何种异常,可以用该异常类作为catch的参数;也可用其父类作为catch的参数。例如:可以用 ArithmeticException 类作为参数的地方,就可以用RuntimeException类作为参数,或者用所有异常的父类Exception类作为参数。
catch中处理异常的方式常见的有:
- getMessage() 获取异常信息,返回字符串。
- printStackTrace() 获取异常类名和异常信息,以及异常出现在程序中的位置,返回值void。
使用throws是声明抛出异常,只是显示地声明抛出异常,表明该方法将不对这些异常进行处理, 而由该方法的调用者负责处理。例如:
public void readFile(String file) throws FileNotFoundException { }
使用throw手动抛出异常,首先要生成异常类对象,然后通过throw语句实现抛出操作(提交给Java运行环境)。例如:
IOException e = new IOException();
throw e;
以上就是关于Java面向对象基础关键字的总结,如果有错误的地方欢迎大家指正。
本文地址:https://blog.csdn.net/weixin_44011294/article/details/107301434
上一篇: 浅谈设计模式1 -- 责任链模式
下一篇: java实现异步调用