Java基础知识整理 (匿名内部类, lambda表达式,包装类,拆箱和装箱)

匿名内部类

特点
1.本身没有任何构造方法,但是会调用父类的构造方法
2.虽然没有构造方法,但是内部内会提供一个初始化代码块,JVM在调用父类的构造方法会调用该代码快
3.匿名内部类可以实现接口,还可以继承抽象类

只会在当前使用一次的时候用匿名内部类

使用匿名内部类:

明确实现那个接口,并且确定这个实现只会使用一次,

接口名 匿名内部类的对象名字 = new 接口名(){匿名内部类的主题} 大括号里面只会实现接口中的抽象方法,接口中提供了default方法,也可以选择重写!

匿名内部类对象名只能调用接口中提供的属性和方法

// 调用接口中的方法 //这里只会在当前使用并只使用一次(在当前类中使用) //这种形式类似于 局部内部类
ISmoking instance = new ISmoking() {
  //定义的属性和方法在外部无法调用所以没有实际意义,基本上不会定义 @Override
    public void somke(String name) {
        System.out.println("匿名内部类实现接口"+name); 
    }
}; 
instance.somke("中华");

以下代码效果同上

new ISmoking() {
    @Override
    public void somke(String name) { 
          System.out.println("匿名内部类的简化形式"+name);
     }
}.somke("你好");

lambda表达式

lambda表达式是JDK1.8含1.8之后推出的

lambda表达式是对接口的简单实现,没有lambda之前使用接口可以使用匿名内部内的形式完成,但是语法不够简洁,提供一种比较简单的语法lambda表达式,但是lambda表达式只能实现接口的一个抽象方法

Java提供了一个注解,必须提供一个抽象方法,不然会报错,

@FunctionalInterface 这个注解限制接口中只能有一个抽象方法

这个注解是函数式接口为了证明这个接口为lambda表达式提供的,这个接口也可以用default和static方法

lambda表达式:

语法:(参数列表)->{方法体}

ps:这个参数列表对应的是接口中抽象方法的参数列表;" ->"这个是固定语法 “{}” 这个大括号对应抽象方法的实现

public class Test {
    public static void main(String[] args) {
//调用接口中 show 方法
//需要给lambda表达一个名字 ILambdaTest l = () -> {
   System.out.println("lambda表达式实现"); };
   l.show(); }
}

lambda表达式的进阶

lambda表达式可以对接口中的方法进行一次应用,

做方法应用时注意:

1.这个方法必须属于人,把方法作为静态,隶属于当前的类

2.这个方法需要和接口中的抽象方法参数类型一致和返回值类型一致

使用:

需要在类中定义一个和接口中的抽象方法,返回值和参数类型完全一致的方法。(会被定义为静态方法)

package com.qfedu.Lambda;
@FunctionalInterface
public interface ILmabdaTest4 {
       void showInfosName(String name);
       package com.qfedu.Lambda;
      public class Test4 {
      public static void main(String[] args) {
//使用lambda表达式进行方的引用操作 //引用:设计的方式类的方法即静态 //所以需要使用类名引用 即 类名::方法名 //就相当于类中静态方法将抽象方法实现了
       ILmabdaTest4 l = Test4::show; l.showInfosName("张三");
       ILmabdaTest4 l2= System.out::println; l2.showInfosName("李四");
     }
//1.需要在类定义一个和接口中抽象方法 返回值和参数列表完全相同一个方法 //ps:这个方法会被定义为静态方法
public static void show(String name) {
System.out.println("名字是:"+name); }
}

包装类

含义:包装类是值类型的引用类型,基本数据类型在数据传输的时候,效率极低,为了提高效率,提供了包装类

基本数据类型中没有提供任何对数据的处理方法,但是包装类中有提供

包装类虽然将值类型改变了应用类型,到那回事方法参数传递的时候,依旧是拷贝

在这里插入图片描述

拆箱和装箱

装箱:将基本数据类型转换成包装类类型

语法:

JDK1.5之前——手动装箱

包装类类型 对象 = new 包装类类型(基本数据类型的值);

JDK1.5之后——自动装箱(手动装箱也是支持的)

包装类类型 对象 = 基本数据类型的值;

拆箱:——把包装类类型转换成基本数据类型

语法:

JDK1.5之前 手动拆箱

基本数据类型 变量 = 包装类对象.xxxValue(); "xxx"表示对应的基本数据类型

JDK1.5之后 自动拆箱

基本数据类型 变量 = 包装类对象;

包装类之间的关系

基本数据类型之前,可以进行类型转换;但是基本数据类型对应的包装类之间没有任何关系,彼此独立

ps:有一个系统类Number——>>是Byte,Integer,Long,Float,double类的父类

Integer和String互相转换

integer设计了一个缓存—>>享元原则

原存在一个范围,若当前的是在-128~127之间的任何数字,返回的都是同一个地址

把String类型转换成Integer类型
//1.1还有一个参数 数据类型是 String类
Integer i1 = Integer.valueOf("123"); //1.2通过Integer构造方法将String转换
Integer i2 = new Integer("123"); System.out.println(i1+i2);
将字符串转换为基本数据类型
//转换基本数据类型时可以进行自动装箱操作可以得到包装类类型 //parseXXX --> XXX可以是8中基本数据类型 --> 根据调用者来 Integer i3 = Integer.parseInt("123");

特殊的,Boolean只能得到两个 truefalse 
//Boolean包装类接收字符串是true或false可以 但是其他字符串的到的都是false Boolean b = new Boolean("true");
System.out.println(b);
Boolean b1 = new Boolean("boolean"); System.out.println(b1);//false

Integer和int之间的区别

区别1:int的默认值是0, Integer默认类型是null 所以int是值类型 Integer是引用类型
区别2:int只能存储数据没有提供任何操作数据的方法,Integer除了可以操作数据外还提供了操作数据方法
区别3:集合框架中,只能存储引用类型,不能存储基本数据类型

package com.qfedu.Number;
/**
* 面试题
* @author JKMaster *
*/
public class IntegerFace {
public static void main(String[] args) { //1.使用new关键字创建Integer对象 //i1和i2此时存储的是堆中的地址
          Integer i1 = new Integer(123);
          Integer i2 = new Integer(123);
          System.out.println(i1 == i2); // false
          System.out.println(i1.equals(i2));//true
//i3,i4,i5,i6这里都是使用 valueof进行的装箱操作 //Integer设计了一个缓存-->享元原则
//原则存在一个范围 若当前的是在-128~127之间的任何一个数字, //返回的都是同一个地址
          Integer i3 = Integer.valueOf(123);
          Integer i4 = Integer.valueOf(123);
          System.out.println(i3 == i4);//true
          
		  System.out.println(i3.equals(i4));///true //i5和i6底层调用的也是valueof
			Integer i5 = 123;
			Integer i6 = 123;
			System.out.println(i5 == i6);//true
			System.out.println(i5.equals(i6));//true
			//i7和i8存的是堆空间地址
			Integer i7 = new Integer(250);
			Integer i8 = new Integer(250); System.out.println(i7 == i8);//false System.out.println(i7.equals(i8));//true
			//i9,i10,i11,i12 使用了手动装箱 i11和i12是底层调用 //会触发valueof中的享元原则判断 是有范围的 -128~127之间才可以 //所以i9,i10,i11,i12都超出了这个范围,所以会触发第二个return //new Integer(i) --> 堆地址
			Integer i9 = Integer.valueOf(250);
			Integer i10 = Integer.valueOf(250);
			System.out.println(i9 == i10);
			System.out.println(i9.equals(i10));
			Integer i11 = 250;
			Integer i12 = 250;
			System.out.println(i11 == i12);
            System.out.println(i11.equals(i12));
            }
       }

String字符串

什么是字符串? --> 多个字符组成的一串–>这个串就是字符串(羊肉串)
多个含义: 可以有很多,也可以什么都没有,但是必须使用" "(双引号)引起来的,才算是字符串
字符串分为两大类:
1.不可变字符串**(String):当前字符串对象创建完成之后,该对象的内容是不可修改,一旦进行修改,此时得到的是一个全新 的字符串
2.可变字符串
(StringBuffer和Stringbuilder)**:当前字符串对象创建完成之后,该对象的内容是可以改变,修改字符串时相 当于在原有字符串的内容基础之上进行修改,不会创建新的字符串

String,StringBuffer和StringBuilder都是实现CharSequence(字符序列接口)接口,字符串的本质其实就是一个***字符数组***

各种字符串API需要记住并熟练使用

猜你喜欢

转载自blog.csdn.net/root1994/article/details/89220262