JAVA基础整理-50.Java继承和多态

Java类的封装

  封装就是将对象的属性和方法相结合,通过方法将对象的属性和实现细节保护起来,实现对象的属性隐藏。

Java类的继承:Java简单的继承及单继承和多继承的区别

简单继承

  注意:类的继承并不改变类成员的访问权限。也就是说,如果父类的成员是公有的、被保护的或默认的,它的子类仍具有相应的这些特性

 extends 关键字直接跟在子类名之后,其后面是该类要继承的父类名称。例如:

  1. public class Student extends Person{}

  注意:如果在父类中存在有参的构造方法而并没有重载无参的构造方法,那么在子类中必须含有有参的构造方法,因为如果在子类中不含有构造方法,默认会调用父类中无参的构造方法,而在父类中并没有无参的构造方法,因此会出错。

单继承

  Java 不支持多继承,只允许一个类直接继承另一个类,即子类只能有一个父类,extends 关键字后面只能有一个类名。

  尽管一个类只能有一个直接的父类,但是它可以有多个间接的父类。

  如果类声明头部没有定义任何 extends 子句,则该类隐含地继承自 java.lang.Object 类。

Java super关键字:super调用父类的构造方法、利用super访问父类成员

  由于子类不能继承父类的构造方法,因此,要调用父类的构造方法,必须在子类的构造方法体的第一行使用 super() 方法。该方法会调用父类相应的构造方法来完成子类对象的初始化工作。

使用 super 调用父类的构造方法

子类可以通过 super 关键字来调用一个由父类定义的构造方法,格式如下:

super(parameter-list);
super() 必须是在子类构造方法的主体第一行。super 用来直接调用父类中的构造方法

  

使用 super 访问父类成员

使用 super 访问父类中的成员与 this 关键字的使用相似,只不过它引用的是子类的父类

super.member
super 还可以用于调用被子类隐藏的方法。

Java对象类型转换和强制对象类型转换

Java 语言允许某个类型的引用变量引用子类的实例,而且可以对这个引用变量进行类型转换。如果把引用类型转换为子类类型,则称为向下转型;如果把引用类型转换为父类类型,则称为向上转型。

强制对象类型转换

Java 编译器允许在具有直接或间接继承关系的类之间进行类型转换。对于向下转型,必须进行强制类型转换;对于向上转型,不必使用强制类型转换。

子类的对象可以转换成父类类型,而父类的对象实际上无法转换为子类类型

Java方法重载

方法重载有两种情况:普通方法的重载和构造方法的重载。

方法重载时必须要注意以下两点:

  • 重载方法的参数列表必须和被重载的方法不同,并且这种不同必须足以清楚地确定要调用哪一个方法。
  • 重载方法的返回值类型可以和被重载的方法相同,也可以不同,但是只有返回值类型不同不能表示为重载。

Java方法重写

在子类中如果创建了一个与父类中相同名称、相同返回值类型、相同参数列表的方法,只是方法体中的实现不同,以实现不同于父类的功能,这种方式被称为方法重写,又称为方法覆盖。

  在重写方法时,需要遵循下面的规则:

  参数列表相同,返回类型相同,

  访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)

Java多态性:Java什么是多态?

  多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为

  对面向对象来说,多态分为编译时多态和运行时多态

  Java 实现多态有 3 个必要条件:继承、重写和向上转型。

  • 继承:在多态中必须存在有继承关系的子类和父类。
  • 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
  • 向上转型:在多态中需要将子类的引用赋给父类对象,只有这样该引用才既能可以调用父类的方法,又能调用子类的方法。

Java抽象(abstract)类

  在面向对象领域,抽象类主要用来进行类型隐藏。

  如果在一个方法之前使用 abstract 来修饰,则说明该方法是抽象方法,不能有方法体;

  注意:abstract 关键字只能用于普通方法,不能用于 static 方法或者构造方法中。在抽象类中必须包含至少一个抽象方法,并且所有抽象方法不能有具体的实现,而应在它们的子类中实现所有的抽象方法(要有方法体)。

  任何使用 new 创建抽象类对象的尝试都会导致编译时错误。

Java接口:接口的定义和接口的实现,定义接口,实现接口

  接口的成员没有执行体

  接口不能被实例化,接口没有构造方法,没有字段。

定义接口

  接口继承和实现继承的规则不同,一个类只有一个直接父类,但可以实现多个接口。

  Java 接口的方法只能是抽象的和公开的,Java 接口不能有构造方法,Java 接口可以有 public、Static 和 final 属性。

   在接口中的方法是没有方法体的。

提示:如果接口本身被定义为 public,则所有的方法和常量都是 public 型的。

实现接口

  如果一个类实现多个接口,这些接口需要使用逗号分隔。

  实现接口的方法必须声明为 public,而且实现方法的类型必须严格与接口定义中指定的类型相匹配。

Java接口和抽象类的区别

  接口内只能是功能的定义 

  接口的实现类中使用 implements 关键字

  而抽象类中则可以包括功能的定义和功能的实现。

  而在抽象类的实现类中,则使用 extends 关键字。一个接口的实现类可以实现多个接口,而一个抽象类的实现类则只能实现一个抽象类。

在接口中,所有的属性肯定是 public、static 和 final,所有的方法都是 abstract,
所以可以默认不写上述标识符;在抽象类中,既可以包含抽象的定义,也可以包含具体的实现方法。
  接口的实现类中使用 implements 关键字

设计思想区别

  抽象类是对一组具有相同属性和方法的逻辑上有关系的事物的一种抽象,而接口则是对一组具有相同属性和方法的逻辑上不相关的事物的一种抽象。

Java内部类:Java什么是内部类?

  内部类拥有外围类的所有元素的访问权限。

  内部类可以分为:实例内部类、静态内部类和成员内部类

内部类也可以分为多种形式,与变量非常类似,如图 1 所示。


图1 内部类的分类

Java内部类:Java实例内部类

  实例内部类是指没有用 static 修饰的内部类。

(1) 在外部类的静态方法和外部类以外的其他类中,必须通过外部类的实例创建内部类的实例。

(2) 在实例内部类中,可以访问外部类的所有成员。

  提示:如果有多层嵌套,则内部类可以访问所有外部类的成员。

(3) 在外部类中不能直接访问内部类的成员,而必须通过内部类的实例去访问。如果类 A 包含内部类 B,类 B 中包含内部类 C,则在类 A 中不能直接访问类 C,而应该通过类 B 的实例去访问类 C。

(4) 外部类实例与内部类实例是一对多的关系,也就是说一个内部类实例只对应一个外部类实例,而一个外部类实例则可以对应多个内部类实例。

(5) 在实例内部类中不能定义 static 成员,除非同时使用 final 和 static 修饰。

Java内部类:Java静态内部类

  静态内部类是指使用 static 修饰的内部类。

(1) 在创建静态内部类的实例时,不需要创建外部类的实例。

(2) 静态内部类中可以定义静态成员和实例成员。

(3) 静态内部类可以直接访问外部类的静态成员,如果要访问外部类的实例成员,则需要通过外部类的实例去访问。

Java内部类:Java局部内部类

  局部内部类是指在一个方法中定义的内部类。

局部内部类有如下特点。

(1) 局部内部类与局部变量一样,不能使用访问控制修饰符(public、private 和 protected)和 static 修饰符修饰。

(2) 局部内部类只在当前方法中有效。

(3) 局部内部类中不能定义 static 成员。

(4) 局部内部类中还可以包含内部类,但是这些内部类也不能使用访问控制修饰符(public、 private 和 protected)和 static 修饰符修饰。

(5) 在局部内部类中可以访问外部类的所有成员。

(6) 在局部内部类中只可以访问当前方法中 final 类型的参数与变量。如果方法中的成员与外部类中的成员同名,则可以使用 <OuterClassName>.this.<MemberName> 的形式访问外部类中的成员。

Java匿名类,Java匿名内部类

匿名类是指没有类名的内部类,必须在创建时使用 new 语句来声明类。

其语法形式如下:

  1. new<类或接口>()
  2. {
  3. //类的主体
  4. };

匿名类有如下特点。

(1) 匿名类和局部内部类一样,可以访问外部类的所有成员。

(2) 匿名类中允许使用非静态代码块进行成员初始化操作。

(3) 匿名类的非静态代码块会在父类的构造方法之后被执行。

Java内部类的作用:Java利用内部类实现多重继承

  Java 提供的两种方法让我们实现多重继承:接口和内部类。

  内部类一个很重要的特性:内部类可以继承一个与外部类无关的类,从而保证内部类的独立性。

 

猜你喜欢

转载自www.cnblogs.com/luojie1216/p/10609502.html