自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

you can you up up up的博客

别看,看了也不会,会了也不用,用了也报错

  • 博客(152)
  • 收藏
  • 关注

原创 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 1682

原创 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 410

原创 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 259

原创 1.19 利用内部类实现多重继承

多重继承指的是一个类可以同时从多于一个的父类那里继承行为和特征,然而我们知道 Java 为了保证数据安全,只允许单继承。有些时候我们会认为如果系统中需要使用多重继承,那往往都是糟糕的设想,这时开发人员往往需要思考的不是怎么使用多重继承,而是他的设计是否存在问题。但是,有时候开发人员确实需要实现多重继承,而且现实生活中真正地存在这样的情况,例如遗传,我们既继承了父亲的行为和特征,也继承了母亲的行为和特征。Java 提供的两种方法让我们实现多重继承:接口和内部类。例 1本节我们以生活中常见的遗传例子进

2020-09-30 13:12:41 217

原创 1.18 Java匿名类,匿名内部类

匿名类是指没有类名的内部类,必须在创建时使用 new 语句来声明类。其语法形式如下:new <类或接口>() { // 类的主体};这种形式的 new 语句声明一个新的匿名类,它对一个给定的类进行扩展,或者实现一个给定的接口。使用匿名类可使代码更加简洁、紧凑,模块化程度更高。匿名类有两种实现方式:继承一个类,重写其方法。实现一个接口(可以是多个),实现其方法。下面通过代码来说明。public class Out { void show() {

2020-09-30 13:12:36 2099 3

原创 1.17 局部内部类

局部内部类是指在一个方法中定义的内部类。示例代码如下:public class Test { public void method() { class Inner { // 局部内部类 } }}局部内部类有如下特点:局部内部类与局部变量一样,不能使用访问控制修饰符(public、private 和 protected)和 static 修饰符修饰。局部内部类只在当前方法中有效。public class Test {

2020-09-30 13:12:31 136

原创 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 110

原创 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 149

原创 1.14 java内部类是什么鬼东西

在类内部可定义成员变量和方法,且在类内部也可以定义另一个类。如果在类 Outer 的内部再定义一个类 Inner,此时类 Inner 就称为内部类(或称为嵌套类),而类 Outer 则称为外部类(或称为宿主类)。内部类可为静态,可用protected和private修饰(而外部类只能使用public和缺省的包访问权限)。内部类主要有以下几类:成员内部类、局部内部类、静态内部类、匿名内部类内部类可以很好地实现隐藏,一般的非内部类是不允许有 private 与 protected 权限的,但内部类可以。内部类

2020-09-30 13:12:19 162

原创 1.13 抽象类和接口的区别

接口是一种特殊的抽象类,接口和抽象类的渊源颇深,有很大的相似之处,所以在选择使用谁的问题上很容易迷糊。1)抽象类在 Java 中,被关键字 abstract 修饰的类称为抽象类;被 abstract 修饰的方法称为抽象方法,抽象方法只有方法声明没有方法体。抽象类有以下几个特点:抽象类不能被实例化,只能被继承。包含抽象方法的类一定是抽象类,但抽象类不一定包含抽象方法(抽象类可以包含普通方法)。抽象方法的权限修饰符只能为 public、protected 或 default,默认情况下为 publ

2020-09-30 13:12:13 101

原创 1.11 抽象(abstract)类

Java 语言提供了两种类,分别为具体类和抽象类。前面学习接触的类都是具体类。这一节介绍一下抽象类。在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,那么这样的类称为抽象类。在 Java 中抽象类的语法格式如下:<abstract>class<class_name> { <abstract><type><method_name>(para

2020-09-29 11:07:19 372

原创 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 264

原创 1.9 多态性:什么是多态?

多态性是面向对象编程的又一个重要特征,它是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。对面向对象来说,多态分为编译时多态和运行时多态。其中编译时多态是静态的,主要是指方法的重载,它是根据参数列表的不同来区分不同的方法。通过编译之后会变成两个不同的方法,在运行时谈不上多态。而运行时多态是动态的,它是通过动态绑定来实现的,也就是大家通常所说的多态性。Java 实现多态有 3 个必要条件:继承、重写和向上转型。只

2020-09-29 11:07:08 7013

原创 1.8 方法重写

在子类中如果创建了一个与父类中相同名称、相同返回值类型、相同参数列表的方法,只是方法体中的实现不同,以实现不同于父类的功能,这种方式被称为方法重写(override),又称为方法覆盖。当父类中的方法无法满足子类需求或子类具有特有功能的时候,需要方法重写。子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强。在重写方法时,需要遵循下面的规则:参数列表必须完全与被重写的方法参数列表相同。返回的类型必须与被重写的方法的返回类型相同(Java1

2020-09-29 11:07:02 108

原创 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 111

转载 1.6 为什么使用向上转型而不直接创建子类对象?

初学者在学习向上转型可能会很难理解,向上转型并不能调用子类特有属性和方法,我们必须先生成子类实例再赋值给父类引用(向上转型),然后将父类引用向下强制转换给子类引用(向下转型),这样才能调用子类中的所有成员。这看起来像是多次一举,还不如直接创建子类实例。随着技术的提升,我们在学习其它开源项目时会发现很多地方都用了向上转型和向下转型的技术。本节将带大家了解向上转型和向下转型的意义及使用场景。例 1定义父类 Animal,代码如下:public class Animal { public void

2020-09-29 11:06:45 232

原创 1.5 对象类型转换:向上转型和向下转型

将一个类型强制转换成另一个类型的过程被称为类型转换。本节所说的对象类型转换,是指存在继承关系的对象,不是任意类型的对象。当对不存在继承关系的对象进行强制类型转换时,会抛出 Java 强制类型转换(java.lang.ClassCastException)异常。Java 语言允许某个类型的引用变量引用子类的实例,而且可以对这个引用变量进行类型转换。Java 中引用类型之间的类型转换(前提是两个类是父子关系)主要有两种,分别是向上转型(upcasting)和向下转型(downcasting)。1)向上转型

2020-09-29 11:06:35 435

原创 1.4 super关键字详解

由于子类不能继承父类的构造方法,因此,如果要调用父类的构造方法,可以使用 super 关键字。super 可以用来访问父类的构造方法、普通方法和属性。super 关键字的功能:在子类的构造方法中显式的调用父类构造方法访问父类的成员方法和变量。super 关键字的用法:super.父类属性名:调用父类中的属性super.父类方法名:调用父类中的方法super():调用父类的无参构造方法super(参数):调用父类的有参构造方法super调用父类构造方法super 关键字可以在子类的

2020-09-29 11:06:29 638

原创 1.3 继承(extends)

继承是面向对象的三大特征之一。继承和现实生活中的“继承”的相似之处是保留一些父辈的特性,从而减少代码冗余,提高程序运行效率。Java 中的继承就是在已经存在类的基础上进行扩展,从而产生新的类。已经存在的类称为父类、基类或超类,而新产生的类称为子类或派生类。在子类中,不仅包含父类的属性和方法,还可以增加新的属性和方法。注意:Java 类默认是可以被继承的,但加了 final 关键字后就不能被继承了,如 String 类。类的变量和方法有 public、private 和 protected 修饰符,

2020-09-29 11:06:23 536

原创 1.2 实例:封装图书信息类

了解上节有关封装的知识后,本节通过完整的例子再次实现封装。要求编写表示图书的 Book 类,实现以下需求:基本信息包括图书名称(bookName)、总页数(pagelbtalNum),其中页数不能少于 200 页,否则输出错误信息,并赋予默认值 200。为各个属性设置赋值和取值方法。具有 details() 方法,该方法在控制台输出每本图书的名称和总页数。编写 BookTest 测试类,为 Book 对象的属性赋予初始值,并调用 details() 方法输出详细信息。根据上面的描述添加代码,步骤如下

2020-09-29 10:19:16 705

原创 ==与equals,String的equals()方法

==介绍它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型比较的是值,引用数据类型比较的是内存地址)。基本数据类型:byte,short,char,int,long,float,double,boolean。他们之间的比较,应用双等号(==),比较的是他们的值。引用数据类型:当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址(确切的说,是堆内存地址)。public class test { public static void main(Str

2020-09-28 11:49:40 203

原创 代码块

简介1.普通代码块:类中方法的方法体2.构造代码块:构造块会在创建对象时被调用,每次创建时都会被调用,优先于类构造函数执行。3.静态代码块:用static{}包裹起来的代码片段,只会执行一次。静态代码块优先于构造块执行。4.同步代码块:使用synchronized(){}包裹起来的代码块,在多线程环境下,对共享数据的读写操作是需要互斥进行的,否则会导致数据的不一致性。同步代码块需要写在方法中。静态代码块和构造代码块的异同点相同点:都是JVM加载类后且在构造函数执行之前执行,在类中可定义多

2020-09-28 11:47:16 291

原创 1.9 通过反射获取注解信息

使用注解修饰了类、方法、变量等成员之后,这些注解不会自己生效,必须由开发者提供相应的工具来提取处理。要想获取类、方法或变量的注解信息,必须通过 Java 的反射技术来获取 Annotation 对象,除此之外没有其它方法。下面主要介绍 Java 基于反射机制获取注解的方法,并以结合实例的方式讲解了获取注解信息的具体实现方法与操作事项。所有 Java 注解类型都继承于 java.lang.annotation.Annotation 接口,该接口代表程序中可以接收注解的程序元素。该接口主要有如下几个实现类。

2020-09-28 10:37:27 1018

原创 1.8 自定义注解

前面我们学习了 Java 的基本注解和元注解,如果这两种注解不能满足你的需求,可以自定义注解。下面介绍如何自定义注解。声明自定义注解使用 @interface 关键字(interface 关键字前加 @ 符号)实现。定义注解与定义接口非常像,如下代码可定义一个简单形式的注解类型。// 定义一个简单的注解类型public @interface Test {}上述代码声明了一个 Test 注解。默认情况下,注解可以在程序的任何地方使用,通常用于修饰类、接口、方法和变量等。定义注解和定义类相似,注解

2020-09-28 10:37:21 170

原创 1.7 元注解作用及使用

元注解是负责对其它注解进行说明的注解,自定义注解时可以使用元注解。Java 5 定义了 4 个注解,分别是 @Documented、@Target、@Retention 和 @Inherited。Java 8 又增加了 @Repeatable 和 @Native 两个注解。这些注解都可以在 java.lang.annotation 包中找到。下面主要介绍每个元注解的作用及使用。@Documented@Documented 是一个标记注解,没有成员变量。用 @Documented 注解修饰的注解类会被 J

2020-09-28 10:37:15 251

原创 1.6 @FunctionalInterface注解

在学习 Lambda 表达式时,我们提到如果接口中只有一个抽象方法(可以包含多个默认方法或多个 static 方法),那么该接口就是函数式接口。@FunctionalInterface 就是用来指定某个接口必须是函数式接口,所以 @FunInterface 只能修饰接口,不能修饰其它程序元素。函数式接口就是为 Java 8 的 Lambda 表达式准备的,Java 8 允许使用 Lambda 表达式创建函数式接口的实例,因此Java 8 专门增加了 @FunctionalInterface。例如,

2020-09-28 10:37:08 294

原创 1.5 @SafeVarargs注解

在介绍 @SafeVarargs 注解用法之前,先来看看如下代码:public class HelloWorld { public static void main(String[] args) { // 传递可变参数,参数是泛型集合 4 display(10, 20, 30); // 传递可变参数,参数是非泛型集合 6 display("10", 20, 30); // 会有编译警告 } 10 public static

2020-09-28 10:37:01 195

原创 1.4 @SuppressWarnings:抑制编译器警告

Java 中的 @SuppressWarnings 注解指示被该注解修饰的程序元素(以及该程序元素中的所有子元素)取消显示指定的编译器警告,且会一直作用于该程序元素的所有子元素。例如,使用 @SuppressWarnings 修饰某个类取消显示某个编译器警告,同时又修饰该类里的某个方法取消显示另一个编译器警告,那么该方法将会同时取消显示这两个编译器警告。@SuppressWarnings 注解主要用在取消一些编译器产生的警告对代码左侧行列的遮挡,有时候这样会挡住我们断点调试时打的断点。如下图所示。如果

2020-09-28 10:36:53 668

原创 1.3 @Deprecated注解

Java 中 @Deprecated 可以用来注解类、接口、成员方法和成员变量等,用于表示某个元素(类、方法等)已过时。当其他程序使用已过时的元素时,编译器将会给出警告。使用 @Deprecated 注解示例代码如下:@Deprecatedpublic class Person { @Deprecated protected String name; private int age; public String getName() { return na

2020-09-28 10:36:43 616

原创 1.2 @Override注解

Java 中 @Override 注解是用来指定方法重写的,只能修饰方法并且只能用于方法重写,不能修饰其它的元素。它可以强制一个子类必须重写父类方法或者实现接口的方法。使用 @Override 注解示例代码如下:public class Person { private String name = ""; private int age; ... @Override public String t0String() { //toString() r

2020-09-28 10:36:36 387

原创 1.21 实例:统计商品信息

在一个货架上有 5 件商品,编写程序,在输入商品价格之后输出最高价格、总价格和平均价格。首先要创建一个包含 5 个空元素的价格数组,然后使用 for 循环使用户从控制台录入商品的价格,并将价格保存至数组中,再使用一个 for 循环来遍历该数组,求出最高价格和总价格。最后用总价格除以商品数量算出平均价格。public static void main(String[] args) { // 声明数组 int[] prices = new int[5]; int maxPrice =

2020-09-28 10:36:25 573

原创 1.7 Character类

Character 类是字符数据类型 char 的包装类。Character 类的对象包含类型为 char 的单个字段,这样能把基本数据类型当对象来处理,其常用方法如表 1 所示。表 1 Character类的常用方法方法描述void Character(char value)构造一个新分配的 Character 对象,用以表示指定的 char 值char charValue()返回此 Character 对象的值,此对象表示基本 char 值int compareT

2020-09-28 10:35:16 359

原创 1.27 递归算法

程序调用自身的编程技巧称为递归(recursion),它做为一种算法在程序设计语言中广泛应用。Java 支持递归,在 Java 编程中,递归是允许方法调用自身调用的属性。调用自身的方法称为是递归的。递归的典型例子是数字的阶乘。数字 N 的阶乘是 1 到 N 之间所有整数的乘积。例如 3 的阶乘就是 1×2×3。下面的程序使用递归来计算数字的阶乘。public class Factorial { int fact(int n) { int result; if (n

2020-09-27 12:49:04 120

原创 1.26 Java使用自定义包

包的声明和使用非常简单,在了解基本语法之后,下面通过一个案例演示在 Java 程序中声明包,以及不同包之间类的使用。1)创建一个名为 com.dao 的包。2)向 com.dao 包中添加一个 Student 类,该类包含一个返回 String 类型数组的 GetAll() 方法。Student 类代码如下:package com.dao;public class Student { public static String[] GetAll() { String[] nam

2020-09-27 12:48:55 209

原创 1.25 包(package)详解

在编写 Java 程序时,随着程序架构越来越大,类的个数也越来越多,这时就会发现管理程序中维护类名称也是一件很麻烦的事,尤其是一些同名问题的发生。有时,开发人员还可能需要将处理同一方面的问题的类放在同一个目录下,以便于管理。为了解决上述问题,Java 引入了包(package)机制,提供了类的多层命名空间,用于解决类的命名冲突、类文件管理等问题。包允许将类组合成较小的单元(类似文件夹),它基本上隐藏了类,并避免了名称上的冲突。包允许在更广泛的范围内保护类、数据和方法。你可以在包内定义类,而在包外的代码不

2020-09-27 12:48:43 1888

原创 1.24 析构方法

析构方法与构造方法相反,当对象脱离其作用域时(例如对象所在的方法已调用完毕),系统自动执行析构方法。析构方法往往用来做清理垃圾碎片的工作,例如在建立对象时用 new 开辟了一片内存空间,应退出前在析构方法中将其释放。在 Java 的 Object 类中还提供了一个 protected 类型的 finalize() 方法,因此任何 Java 类都可以覆盖这个方法,在这个方法中进行释放对象所占有的相关资源的操作。对象的 finalize() 方法具有如下特点:垃圾回收器是否会执行该方法以及何时执行该方法

2020-09-27 12:48:34 577

原创 1.23 实例:查询个人信息

每个员工都会有自己的档案,主管可以查看在职员工的档案。使用 Java 创建一个员工实体类,然后通过构造方法创建一个名为“王洁”的员工,最后打印出员工档案信息。示例步骤如下。(1) 创建 Person 类,在该类中定义个人基本信息属性,并定义一个带有参数的构造方法,代码如下:public class Person { private String name; // 姓名 private int age; // 年龄 private String sex; // 性

2020-09-27 12:48:25 768

原创 1.22 构造方法

构造方法是类的一种特殊方法,用来初始化类的一个新的对象,在创建对象(new 运算符)之后自动调用。Java 中的每个类都有一个默认的构造方法,并且可以有一个以上的构造方法。Java 构造方法有以下特点:方法名必须与类名相同,包括大小写。可以有 0 个、1 个或多个参数构造方法不能在方法名前面定义方法类型,即不能定义void,也不能有返回值(不能有return语句)。默认返回类型就是对象类型本身构造方法不能自己调用,构造方法调用必须通过new语法,对象初始化的时候由系统自动调用。一个类中的构造

2020-09-27 12:48:14 192

原创 1.21 方法的可变参数(String...names)

在具体实际开发过程中,有时方法中参数的个数是不确定的。为了解决这个问题,在 J2SE 5.0 版本中引入了可变参数的概念。声明可变参数的语法格式如下methodName({paramList},paramType…paramName)其中,methodName 表示方法名称;paramList 表示方法的固定参数列表;paramType 表示可变参数的类型;… 是声明可变参数的标识;paramName 表示可变参数名称。注意:可变参数必须定义在参数列表的最后。例 1每次参加考试的人数是不固定的

2020-09-27 12:47:53 801

原创 1.20 main()方法

在 Java 中,main() 方法是 Java 应用程序的入口方法,程序在运行的时候,第一个执行的方法就是 main() 方法。main() 方法和其他的方法有很大的不同。下面先来看最简单的一个 Java 应用程序 HelloWorld,我们将通过这个例子讲解 Java 类中 main() 方法的奥秘,程序的代码如下:public class HelloWorld { public static void main(String args[]) { System.out.pri

2020-09-27 12:47:41 371

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除