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.membersuper 还可以用于调用被子类隐藏的方法。

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 提供的两种方法让我们实现多重继承:接口和内部类。

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

原文地址:https://www.cnblogs.com/luojie1216/p/10609502.html

时间: 2024-08-13 16:09:37

JAVA基础整理-50.Java继承和多态的相关文章

JAVA基础整理-22. Java内置包装类

Java Object类详解:Object类的常用方法(equals()和getClass()) Object 是 Java 类库中的一个特殊类,也是所有类的父类.当一个类被定义后,如果没有指定继承的父类,那么默认父类就是 Object 类. 在 Object 类中定义的方法,在其他类中都可以使用 equals() 方法 equals() 方法的作用与运算符类似,用于值与值的比较和值与对象的比较,而 equals() 方法用于对象与对象之间的比较 getClass() 方法 getClass()

JAVA基础整理-80.Java反射机制

Java什么是反射机制?反射机制的概念 在 ORM (Object Relational Mapping 对象关系映射)中间件的实现中,运用 java 反射机制可以读取任意一个 JavaBean 的所有属性,或者给这些属性赋值. Class labelCls=label1.getClass(); //label1为 JLabel 类的对象 Java反射在类中的应用: 通过反射访问构造函数(方法) 为了能够动态获取对象构造方法的信息,首先需要通过下列方法之一创建一个 Constructor 类型的

Java基础10 接口的继承与抽象类(转载)

接口继承 接口继承(inheritance)与类继承很类似,就是以被继承的interface为基础,增添新增的接口方法原型.比如,我们以Cup作为原interface: interface Cup{    void addWater(int w);    void drinkWater(int w);} 我们在继承Cup的基础上,定义一个新的有刻度的杯子的接口,MetricCup 接口如下: interface MetricCup extends Cup{    int WaterContent

java基础之泛型的继承

关于泛型的基本介绍和理解请参考以下几篇文章,或查询更多资料: 泛?型?与?泛?型?继?承 泛型(包括泛型抽象类的继承) 泛型的继承测试 本篇以简单的List<>方式来进行说明. ArrayList<Object>继承了List<Object>, ArrayList<String>没有继承List<Object> List<?>等价于List<? extends Object> 请参考以下代码: /** * author D

Java基础学习总结——Java对象的序列化和反序列化

一.序列化和反序列化的概念 把对象转换为字节序列的过程称为对象的序列化. 把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中: 2) 在网络上传送对象的字节序列. 在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存.比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些s

Java基础19:Java集合框架梳理

Java基础19:Java集合框架梳理 在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影! java中集合大家族的成员实在是太丰富了,有常用的ArrayList.HashMap.HashSet,也有不常用的Stack.Queue,有线程安全的Vector.HashTable,也有线程不安全的LinkedList.TreeMap等等! 上面的图展示了整个集合大家族的成员以及他们之间的关系.下面就上面的各个接口.基类做一

Java基础11:Java泛型详解

Java基础11:Java泛型详解 泛型概述 泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用. 什么是泛型?为什么要使用泛型? 泛型,即"参数化类型".一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参.那么参数化类型怎么理解呢?顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参). 泛型的本质是为了参数化类型(在不创建新的类型的

Java基础17:Java IO流总结

Java基础17:Java IO流总结 IO流概述 在这一小节,我会试着给出Java IO(java.io)包下所有类的概述.更具体地说,我会根据类的用途对类进行分组.这个分组将会使你在未来的工作中,进行类的用途判定时,或者是为某个特定用途选择类时变得更加容易. 输入和输出 术语"输入"和"输出"有时候会有一点让人疑惑.一个应用程序的输入往往是另外一个应用程序的输出?那么OutputStream流到底是一个输出到目的地的流呢,还是一个产生输出的流?InputStre

Java基础16:Java多线程基础最全总结

Java基础16:Java多线程基础最全总结 Java中的线程 Java之父对线程的定义是: 线程是一个独立执行的调用序列,同一个进程的线程在同一时刻共享一些系统资源(比如文件句柄等)也能访问同一个进程所创建的对象资源(内存资源).java.lang.Thread对象负责统计和控制这种行为. 每个程序都至少拥有一个线程-即作为Java虚拟机(JVM)启动参数运行在主类main方法的线程.在Java虚拟机初始化过程中也可能启动其他的后台线程.这种线程的数目和种类因JVM的实现而异.然而所有用户级线