欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java面向对象(三)——关键字(this,super,static,final,abstract,interface,implements,throw)

程序员文章站 2022-10-03 18:02:11
Java面向对象(三)——关键字(this,super,static,final,abstract,interface,implements,throw)1.this2.super3.static4.final5.abstract6.interface、implements7.try-catch-finally、throw、throws前面两篇文章我们介绍了类和类的成员以及面向对象的三大特征,但并不全面。因此这篇文章再对主要的一些基础关键字进行说明,对前面的内容作一个补充。1.thisthis关键字的...

Java面向对象(三)——关键字(this,super,static,final,abstract,interface,implements,throw)


前面两篇文章我们介绍了类和类的成员以及面向对象的三大特征,但并不全面。因此这篇文章继续基于atguigu系列课程再对主要的一些基础关键字进行总结,对前面的内容作一个补充。

1.this

this关键字的作用和它的词义很接近,在方法内使用时表示这个方法所属对象的引用;在构造器中使用时表示该构造器正在初始化的对象。 this可以调用类的属性、方法和构造器,使用时有如下需要注意的:

  1. 当形参与成员变量同名时, 如果在方法内或构造器内需要使用成员变量,必须添加this来表明该变量是类的成员变量;例如:this.name = name;中this.name表示本类的成员变量,而name表示方法或构造器的形参。
  2. 通常情况下(形参与成员变量不重名时)this可以省略,加上this能够增强程序的可阅读性;
  3. 使用this访问属性和方法时, 优先在本类中找,如果在本类中未找到,会从父类中查找;
  4. this可以在构造器中调用本类重载的构造器。

关于第四点需要说明:调用其他构造器时使用“this(形参列表)”的语法,必须声明在类的构造器的首行,且一个构造器中最多只能声明一个;构造器中不能调用自身构造器;如果一个类中声明了n个构造器,则最多有 (n - 1)个构造器中使用了 “this(形参列表)”。

2.super

super关键字使用的前提是继承,super可用于访问父类中定义的属性、成员方法以及在子类构造器中调用父类的构造器 ,尤其当子父类出现同名成员时,可以用super.属性、super.方法表明调用的是父类中的成员。调用父类构造器时,子类中所有的构造器默认都会访问父类中空参数的构造器,当父类中没有空参数的构造器时,子类的构造器必须通过 "this(形参列表)"或者 "super(形参列表)"语句指定调用本类或者父类中相应的构造器(只能二选一,且放在构造器首行)。super对父类的追溯不仅限于直接父类。

super和this的作用较为类似,我们对这两个关键字进行区别:

区别点 this super
访问属性、方法 访问本类中的属性或方法,如果本类没有此属性则从父类中继续查找 直接访问父类中的属性或方法
调用构造器 调用本类构造器 调用父类构造器

3.static

static关键字可以修饰属性、方法、代码块、内部类。当一个类的成员作为该类各个对象之间共享的变量时,即不因对象的不同而改变时,可以考虑使用static修饰该成员,被修饰后具有如下特点:

  1. 随着类的加载而加载 ,优先于对象存在;
  2. 修饰的成员被所有对象所共享 ;
  3. 访问权限允许时,可不创建对象直接被类调用(调用格式:类名.属性或类名.方法名());
  4. static修饰的属性(静态变量或类变量)加载在方法区的静态域中,仅存在一份;
  5. 在static方法内部只能访问类的static修饰的属性或方法,不能访问类的非static的结构;
  6. 因为不需要实例就可调静态方法,因此static方法内部不能有this、super关键字;
  7. static修饰的方法不能被重写

需要注意,在理解static关键字时,要从类和对象的生命周期角度去理解。

4.final

final关键字可以修饰类、变量和方法。

  1. final修饰的类不能被继承(例如String类、System类、StringBuffer类 );
  2. final修饰的方法不能被子类重写(例如Object类中的getClass());
  3. 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