首页 > 编程语言 >Java初学者笔记-03、代码块内部类函数式编程

Java初学者笔记-03、代码块内部类函数式编程

时间:2025-01-17 18:00:56浏览次数:1  
标签:03 Java 内部 实例 初学者 new 方法 表达式 Lambda

代码块

静态代码块 static{} 类加载时自动执行,类只会加载一次,静态代码块只会执行一次,往往用来对类的静态资源的初始化。
实例代码块 {} ,每次创建对象时执行,用来完成对象的初始化的。

内部类

一个类定义在另一个类内部,叫做内部类。
使用场景:当一个类的内部,包含了一个完整的事物,且这个事物没有必要单独设计时,就可以设计成内部类。

成员内部类

外部类的对象持有的,没有static修饰。
内部类创建对象是有要求的。

Outer.Inner oi = new Outer().new Inner();
oi.show();

成员内部类可以直接访问外部类的静态成员,也可以直接访问外部类的实例成员。
成员内部类的实例方法中,可以直接拿到当前外部类的对象:外部类名.this

静态内部类

外部类自己持有的 ,有static修饰。

Outer.Inner oi = new Outer.Inner();
oi.show();

静态内部类可以访问外部类的静态成员,但不可以直接访问外部类的实例成员。

局部内部类

定义在方法、代码块、构造器等执行体中的类。

匿名内部类(重点)

一种特殊的局部内部类。
匿名:程序员不需要为这个类声明名字,默认有个隐藏的名字(外部类名$编号.class)。

new 类或接口(){
	类体(一般是方法重写);
}
=========================

public abstract class Animal {
	public abstract void cry();
}

Animal a = new Animal(){
  @Override
  public void cry(){
     "miaomiaomiao".sout;
  }
};
a.cry();

匿名内部类的本质与作用

  1. 本质:匿名内部类本质是一个子类(如是Animal的子类),同时会立即创建出一个子类对象。
  2. 作用:更方便创建一个子类对象。

匿名内部类的常见使用形式

通常作为一个对象参数传输给方法。调用别人提供的方法实现需求时,正好可以让我们传输一个匿名内部类对象给其使用。

public interface Swim{
	void swimming();
}

public class Test{
	psvm{
		start(new Swim(){
			@Override
			public void swimming(){
				"学生游泳很快".sout;
			}
		});
	}
	
	public static void start(Swim s){
		"开始".sout;
		s.swimming();
		"结束".sout;
	}
}

函数式编程(重点)

函数式编程需要结合匿名内部类学习。

Lambda表达式

  1. 函数:类似数学中的函数,强调做什么。只要输入的数据一致返回的结果也一致。
  2. Java中的函数就是 Lambda表达式。(Java中方法是方法,函数是函数)
  3. Lambda表达式能解决什么问题:使用Lambda函数替代函数式接口的匿名内部类对象,从而让程序更简洁,可读性好。
  4. 函数式接口:有且仅有一个抽象方法的接口。用注解@FunctionalInterface约束。
  5. Lambda表达式通过上下文推断对匿名内部类进行替代。

Lambda表达式的写法

(被重写方法的形参列表) -> {
	被重写方法的方法体列表
}
==============================================
swimStart(new Swim() {
            @Override
            public double swimming(int a, double b) {
                return a+b;
            }
        });
// 简化为:
swimStart((int a, double b)->{
                return a+b;
            });

进一步简化-Lambda表达式的省略策略

可以进一步简化Lambda表达式:

  1. 参数类型全部可以省略不写。
  2. 如果只有一个参数,参数类型省略的同时()也可以省略。(多个参数不能省略小括号)。
  3. 如果Lambda表达式中只有一行代码,大括号可以不写,同时省略分号;如果是return语句,return必须省略。
swimStart((a, b) -> a+b); // 应用1和3

再进一步简化-方法引用

进一步简化Lambda函数。

  1. 静态方法引用
    类名::静态方法

使用场景:如果某个Lambda表达式里只是调用一个静态方法,并且→前后参数形式一致,就可以使用静态方法引用。

  1. 实例方法引用
    对象名::实例方法

使用场景:如果某个Lambda表达式里只是通过对象名称调用一个实例方法,并且→前后参数形式一致,就可以使用实例方法引用。

  1. 特定类型的方法引用
    特定类的名称::方法

特定类的实例方法
使用场景如果某个Lambda表达式里只是调用一个特定类型的实例方法,并且前面参数列表中的第一个参数是作为方法的主调,后面的所有参数都是作为该实例方法的入参的,则此时就可以使用特定类型的方法引用。

  1. 构造器引用
    类名::new

如果某个Lambda表达式里只是在创建对象,并且→前后参数情况一致,就可以使用构造器引用。

常用API

String

  1. 只要是以""方式写出的字符串对象, 会存储到字符串常量池(也在堆内存中),且相同内容的字符串只存储一份;
  2. 通过new方式创建字符串对象,每new一次都会产生一个新的对象放在堆内存中。
  3. 字符串的内容比较千万不要用==

ArrayList

集合是一种容器,用来装数据,类似于数组。
数组定义完成,长度就固定了。集合是可变的。

标签:03,Java,内部,实例,初学者,new,方法,表达式,Lambda
From: https://www.cnblogs.com/subeipo/p/18677472/java-chu-xue-zhe-bi-ji03-dai-ma-kuai-nei-bu-lei

相关文章

  • 运维系列&安卓系列【亲测有效】:Your build is currently configured to use incompati
    YourbuildiscurrentlyconfiguredtouseincompatibleJava21.0.3andGradle5.4.1build报错:YourbuildiscurrentlyconfiguredtouseincompatibleJava21.0.3andGradle5.4.1Cannot...报错显示报错原因成功解决方案尝试过未成功的方案buil......
  • 【代码随想录】刷题记录(103)-整数拆分
    题目描述:给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k>=2 ),并使这些整数的乘积最大化。返回 你可以获得的最大乘积 。 示例1:输入:n=2输出:1解释:2=1+1,1×1=1。示例 2:输入:n=10输出:36解释:10=3+3+4,3× 3× 4=......
  • 【Java】集合框架
    MapTreeMap、HashMap、LinkedHashMap、Hashtable、WeakHashMap概述:Map存储键值对,键不可重复Map下有SortedMap接口、AbsractMap抽象类Map接口提供的通用方法get(Objectkey):返回给定键的值getOrDefault(Objectkey,VdefaultValue):返回给定键的值,若键不存在,则返......
  • java 函数式编程
    1函数式创建对象new接口或抽象类时在花括号里面补全缺失的函数体可以创建匿名子类对象(非子类匿名对象)new普通类时在花括号里面直接重写方法可以创建匿名子类对象(非子类匿名对象)2lumbda表达式创建对象在函数式创建对象的基础上当接口或抽象类中仅有一个方法缺少函数体时可以......
  • java基础Day3 java语法
    java语法新建一个空项目,在项目中新建一个java模块文件菜单中打开项目结构,SDK有报红,要手动选,语言级别也要和SDK对应注释//单行注释/*多行注释*//**文档注释*@DescriptionHelloWorld*@Authortse121*/标识符关键字Demo01所有的标识符都应该以大小写字......
  • Java基于SpringBoot+Vue的酒店管理系统(用户、酒店管理员、管理员)
    所需该项目可以在最下面查看联系方式,为防止迷路可以收藏文章,以防后期找不到项目介绍Java基于SpringBoot+Vue的酒店管理系统(用户、酒店管理员、管理员)系统实现截图技术栈介绍JDK版本:jdk1.8+编程语言:java框架支持:springboot数据库:mysql版本不限数据库工具......
  • Java基于SpringBoot+Vue的高校教室资源管理平台的设计与实现(四端:学生、教室、维护员、
    所需该项目可以在最下面查看联系方式,为防止迷路可以收藏文章,以防后期找不到项目介绍Java基于SpringBoot+Vue的高校教室资源管理平台的设计与实现(四端:学生、教室、维护员、管理员)系统实现截图技术栈介绍JDK版本:jdk1.8+编程语言:java框架支持:springboot数据......
  • Java 17 新特性详解与代码示例
    ......
  • 初学者如何用 Python 写第一个爬虫?
    ......
  • (持续更新)零基础入门 Java 之初始二维数组
    ......