JAVA封装,继承,多态,抽象,接口,内部类
掌握 Java 语言中类的继承
掌握 super 关键字的使用
掌握方法重载和重写的区别
理解抽象类的概念
掌握接口的实现
熟悉内部类和匿名类的使用
不善表演
都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,都是转载的,
展开
-
代码块
简介1.普通代码块:类中方法的方法体2.构造代码块:构造块会在创建对象时被调用,每次创建时都会被调用,优先于类构造函数执行。3.静态代码块:用static{}包裹起来的代码片段,只会执行一次。静态代码块优先于构造块执行。4.同步代码块:使用synchronized(){}包裹起来的代码块,在多线程环境下,对共享数据的读写操作是需要互斥进行的,否则会导致数据的不一致性。同步代码块需要写在方法中。静态代码块和构造代码块的异同点相同点:都是JVM加载类后且在构造函数执行之前执行,在类中可定义多原创 2020-09-28 11:47:16 · 273 阅读 · 0 评论 -
1.24 Lambda表达式与匿名内部类的联系和区别
Java Lambda 表达式的一个重要用法是简化某些匿名内部类的写法,因此它可以部分取代匿名内部类的作用。Lambda 表达式与匿名内部类的相同点如下:Lambda 表达式与匿名内部类一样,都可以直接访问 effectively final 的局部变量,以及外部类的成员变量(包括实例变量和类变量)。Lambda 表达式创建的对象与匿名内部类生成的对象一样,都可以直接调用从接口中继承的默认方法。下面程序示范了 Lambda 表达式与匿名内部类的相似之处。@FunctionalInterface原创 2020-10-01 10:51:13 · 324 阅读 · 0 评论 -
1.23 Lambda表达式的使用
作为参数使用Lambda表达式Lambda 表达式一种常见的用途就是作为参数传递给方法,这需要声明参数的类型声明为函数式接口类型。示例代码如下:public static void main(String[] args) { int n1 = 10; int n2 = 5; // 打印加法计算结果 display((a, b) -> { return a + b;7 }, n1, n2); // 打印减法计算结果9 displ原创 2020-10-01 10:51:03 · 137 阅读 · 0 评论 -
1.21 Lambda表达式
Lambda 表达式(Lambda expression)是一个匿名函数,基于数学中的λ演算得名,也可称为闭包(Closure)。Lambda 表达式是推动 Java 8 发布的重要新特性,它允许把函数作为一个方法的参数(函数作为参数传递进方法中),下面通过例 1 来理解 Lambda 表达式的概念。例 1先定义一个计算数值的接口,代码如下。// 可计算接口public interface Calculable { // 计算两个int数值 int calculateInt(int原创 2020-09-30 13:12:56 · 371 阅读 · 0 评论 -
1.11 抽象(abstract)类
Java 语言提供了两种类,分别为具体类和抽象类。前面学习接触的类都是具体类。这一节介绍一下抽象类。在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,那么这样的类称为抽象类。在 Java 中抽象类的语法格式如下:<abstract>class<class_name> { <abstract><type><method_name>(para原创 2020-09-29 11:07:19 · 349 阅读 · 0 评论 -
1.22 Lambda表达式的3种简写方式
使用 Lambda 表达式是为了简化程序代码,Lambda 表达式本身也提供了多种简化形式,这些简化形式虽然简化了代码,但客观上使得代码可读性变差。本节介绍 Lambda 表达式的几种简化形式。省略参数类型Lambda 表达式可以根据上下文环境推断出参数类型。calculate 方法中 Lambda 表达式能推断出参数 a 和 b 是 int 类型,简化形式如下:public static Calculable calculate(char opr) { Calculable result;原创 2020-09-30 13:13:04 · 1544 阅读 · 0 评论 -
1.20 Java8新特性:Effectively final
Java 中局部内部类和匿名内部类访问的局部变量必须由 final 修饰,以保证内部类和外部类的数据一致性。但从 Java 8 开始,我们可以不加 final 修饰符,由系统默认添加,当然这在 Java 8 以前的版本是不允许的。Java 将这个功能称为 Effectively final 功能。编写同样的代码,分别在 Java 7 和 Java 8 下运行,代码如下:public class Test { public static void main(String[] args) {原创 2020-09-30 13:12:49 · 205 阅读 · 0 评论 -
1.19 利用内部类实现多重继承
多重继承指的是一个类可以同时从多于一个的父类那里继承行为和特征,然而我们知道 Java 为了保证数据安全,只允许单继承。有些时候我们会认为如果系统中需要使用多重继承,那往往都是糟糕的设想,这时开发人员往往需要思考的不是怎么使用多重继承,而是他的设计是否存在问题。但是,有时候开发人员确实需要实现多重继承,而且现实生活中真正地存在这样的情况,例如遗传,我们既继承了父亲的行为和特征,也继承了母亲的行为和特征。Java 提供的两种方法让我们实现多重继承:接口和内部类。例 1本节我们以生活中常见的遗传例子进原创 2020-09-30 13:12:41 · 188 阅读 · 0 评论 -
1.18 Java匿名类,匿名内部类
匿名类是指没有类名的内部类,必须在创建时使用 new 语句来声明类。其语法形式如下:new <类或接口>() { // 类的主体};这种形式的 new 语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。使用匿名类可使代码更加简洁、紧凑,模块化程度更高。匿名类有两种实现方式:继承一个类,重写其方法。实现一个接口(可以是多个),实现其方法。下面通过代码来说明。public class Out { void show() {原创 2020-09-30 13:12:36 · 2057 阅读 · 3 评论 -
1.17 局部内部类
局部内部类是指在一个方法中定义的内部类。示例代码如下:public class Test { public void method() { class Inner { // 局部内部类 } }}局部内部类有如下特点:局部内部类与局部变量一样,不能使用访问控制修饰符(public、private 和 protected)和 static 修饰符修饰。局部内部类只在当前方法中有效。public class Test {原创 2020-09-30 13:12:31 · 116 阅读 · 0 评论 -
1.16 静态内部类
静态内部类是指使用 static 修饰的内部类。示例代码如下:public class Outer { static class Inner { // 静态内部类 }}上述示例中的 Inner 类就是静态内部类。静态内部类有如下特点。1)在创建静态内部类的实例时,不需要创建外部类的实例。public class Outer { static class Inner { }}class OtherClass { Outer.Inner原创 2020-09-30 13:12:28 · 100 阅读 · 0 评论 -
1.15 实例内部类
实例内部类是指没有用 static 修饰的内部类,有的地方也称为非静态内部类。示例代码如下:public class Outer { class Inner { // 实例内部类 }}上述示例中的 Inner 类就是实例内部类。实例内部类有如下特点。1)在外部类的静态方法和外部类以外的其他类中,必须通过外部类的实例创建内部类的实例。public class Outer { class Inner1 { } Inner1 i = new In原创 2020-09-30 13:12:23 · 119 阅读 · 0 评论 -
1.14 java内部类是什么鬼东西
在类内部可定义成员变量和方法,且在类内部也可以定义另一个类。如果在类 Outer 的内部再定义一个类 Inner,此时类 Inner 就称为内部类(或称为嵌套类),而类 Outer 则称为外部类(或称为宿主类)。内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限)。内部类主要有以下几类:成员内部类、局部内部类、静态内部类、匿名内部类内部类可以很好地实现隐藏,一般的非内部类是不允许有 private 与 protected 权限的,但内部类可以。内部类原创 2020-09-30 13:12:19 · 129 阅读 · 0 评论 -
1.13 抽象类和接口的区别
接口是一种特殊的抽象类,接口和抽象类的渊源颇深,有很大的相似之处,所以在选择使用谁的问题上很容易迷糊。1)抽象类在 Java 中,被关键字 abstract 修饰的类称为抽象类;被 abstract 修饰的方法称为抽象方法,抽象方法只有方法声明没有方法体。抽象类有以下几个特点:抽象类不能被实例化,只能被继承。包含抽象方法的类一定是抽象类,但抽象类不一定包含抽象方法(抽象类可以包含普通方法)。抽象方法的权限修饰符只能为 public、protected 或 default,默认情况下为 publ原创 2020-09-30 13:12:13 · 93 阅读 · 0 评论 -
1.12 接口(Interface)的定义和实现
抽象类是从多个类中抽象出来的模板,如果将这种抽象进行的更彻底,则可以提炼出一种更加特殊的“抽象类”——接口(Interface)。接口是 Java 中最重要的概念之一,它可以被理解为一种特殊的类,不同的是接口的成员没有执行体,是由全局常量和公共的抽象方法所组成。在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。定义接口Java 接口的定义方式与类基本相同,不过接口定义使用的关键字是 interface,接口定原创 2020-10-01 10:50:57 · 788 阅读 · 0 评论 -
1.10 instanceof关键字
严格来说 instanceof 是 Java 中的一个双目运算符,由于它是由字母组成的,所以也是 Java 的保留关键字。在 Java 中可以使用 instanceof 关键字判断一个对象是否为一个类(或接口、抽象类、父类)的实例,语法格式如下所示。boolean result = obj instanceof Class其中,obj 是一个对象,Class 表示一个类或接口。obj 是 class 类(或接口)的实例或者子类实例时,结果 result 返回 true,否则返回 false。下面介原创 2020-09-29 11:07:13 · 216 阅读 · 0 评论 -
1.9 多态性:什么是多态?
多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。对面向对象来说,多态分为编译时多态和运行时多态。其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是大家通常所说的多态性。Java 实现多态有 3 个必要条件:继承、重写和向上转型。只原创 2020-09-29 11:07:08 · 6681 阅读 · 0 评论 -
1.8 方法重写
在子类中如果创建了一个与父类中相同名称、相同返回值类型、相同参数列表的方法,只是方法体中的实现不同,以实现不同于父类的功能,这种方式被称为方法重写(override),又称为方法覆盖。当父类中的方法无法满足子类需求或子类具有特有功能的时候,需要方法重写。子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强。在重写方法时,需要遵循下面的规则:参数列表必须完全与被重写的方法参数列表相同。返回的类型必须与被重写的方法的返回类型相同(Java1原创 2020-09-29 11:07:02 · 97 阅读 · 0 评论 -
1.7 方法重载
Java 允许同一个类中定义多个同名方法,只要它们的形参列表不同即可。如果同一个类中包含了两个或两个以上方法名相同的方法,但形参列表不同,这种情况被称为方法重载(overload)。例如,在 JDK 的 java.io.PrintStream 中定义了十多个同名的 println() 方法。public void println(int i){…}public void println(double d){…}public void println(String s){…}这些方法完成的功能类似原创 2020-09-29 11:06:56 · 82 阅读 · 0 评论 -
1.6 为什么使用向上转型而不直接创建子类对象?
初学者在学习向上转型可能会很难理解,向上转型并不能调用子类特有属性和方法,我们必须先生成子类实例再赋值给父类引用(向上转型),然后将父类引用向下强制转换给子类引用(向下转型),这样才能调用子类中的所有成员。这看起来像是多次一举,还不如直接创建子类实例。随着技术的提升,我们在学习其它开源项目时会发现很多地方都用了向上转型和向下转型的技术。本节将带大家了解向上转型和向下转型的意义及使用场景。例 1定义父类 Animal,代码如下:public class Animal { public void转载 2020-09-29 11:06:45 · 196 阅读 · 0 评论 -
1.5 对象类型转换:向上转型和向下转型
将一个类型强制转换成另一个类型的过程被称为类型转换。本节所说的对象类型转换,是指存在继承关系的对象,不是任意类型的对象。当对不存在继承关系的对象进行强制类型转换时,会抛出 Java 强制类型转换(java.lang.ClassCastException)异常。Java 语言允许某个类型的引用变量引用子类的实例,而且可以对这个引用变量进行类型转换。Java 中引用类型之间的类型转换(前提是两个类是父子关系)主要有两种,分别是向上转型(upcasting)和向下转型(downcasting)。1)向上转型原创 2020-09-29 11:06:35 · 429 阅读 · 0 评论 -
1.4 super关键字详解
由于子类不能继承父类的构造方法,因此,如果要调用父类的构造方法,可以使用 super 关键字。super 可以用来访问父类的构造方法、普通方法和属性。super 关键字的功能:在子类的构造方法中显式的调用父类构造方法访问父类的成员方法和变量。super 关键字的用法:super.父类属性名:调用父类中的属性super.父类方法名:调用父类中的方法super():调用父类的无参构造方法super(参数):调用父类的有参构造方法super调用父类构造方法super 关键字可以在子类的原创 2020-09-29 11:06:29 · 514 阅读 · 0 评论 -
1.3 继承(extends)
继承是面向对象的三大特征之一。继承和现实生活中的“继承”的相似之处是保留一些父辈的特性,从而减少代码冗余,提高程序运行效率。Java 中的继承就是在已经存在类的基础上进行扩展,从而产生新的类。已经存在的类称为父类、基类或超类,而新产生的类称为子类或派生类。在子类中,不仅包含父类的属性和方法,还可以增加新的属性和方法。注意:Java 类默认是可以被继承的,但加了 final 关键字后就不能被继承了,如 String 类。类的变量和方法有 public、private 和 protected 修饰符,原创 2020-09-29 11:06:23 · 445 阅读 · 0 评论 -
1.2 实例:封装图书信息类
了解上节有关封装的知识后,本节通过完整的例子再次实现封装。要求编写表示图书的 Book 类,实现以下需求:基本信息包括图书名称(bookName)、总页数(pagelbtalNum),其中页数不能少于 200 页,否则输出错误信息,并赋予默认值 200。为各个属性设置赋值和取值方法。具有 details() 方法,该方法在控制台输出每本图书的名称和总页数。编写 BookTest 测试类,为 Book 对象的属性赋予初始值,并调用 details() 方法输出详细信息。根据上面的描述添加代码,步骤如下原创 2020-09-29 10:19:16 · 657 阅读 · 0 评论 -
1.1 Java类的封装
封装将类的某些信息隐藏在类内部,不允许外部程序直接访问,只能通过该类提供的方法来实现对隐藏信息的操作和访问。例如:一台计算机内部极其复杂,有主板、CPU、硬盘和内存, 而一般用户不需要了解它的内部细节,不需要知道主板的型号、CPU 主频、硬盘和内存的大小,于是计算机制造商将用机箱把计算机封装起来,对外提供了一些接口,如鼠标、键盘和显示器等,这样当用户使用计算机就非常方便。封装的特点:只能通过规定的方法访问数据。隐藏类的实例细节,方便修改和实现。实现封装的具体步骤如下:修改属性的可见性来限制对原创 2020-10-01 10:50:46 · 403 阅读 · 0 评论