特点
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表达式是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表达式可以对接口中的方法进行一次应用,
做方法应用时注意:
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设计了一个缓存—>>享元原则
原存在一个范围,若当前的是在-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只能得到两个 true和false
//Boolean包装类接收字符串是true或false可以 但是其他字符串的到的都是false Boolean b = new Boolean("true");
System.out.println(b);
Boolean b1 = new Boolean("boolean"); System.out.println(b1);//false
区别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));
}
}
什么是字符串? --> 多个字符组成的一串–>这个串就是字符串(羊肉串)
多个含义: 可以有很多,也可以什么都没有,但是必须使用" "(双引号)引起来的,才算是字符串
字符串分为两大类:
1.不可变字符串**(String):当前字符串对象创建完成之后,该对象的内容是不可修改,一旦进行修改,此时得到的是一个全新 的字符串
2.可变字符串(StringBuffer和Stringbuilder)**:当前字符串对象创建完成之后,该对象的内容是可以改变,修改字符串时相 当于在原有字符串的内容基础之上进行修改,不会创建新的字符串
String,StringBuffer和StringBuilder都是实现CharSequence(字符序列接口)接口,字符串的本质其实就是一个***字符数组***
各种字符串API需要记住并熟练使用