编程学习
未读lambda 表达式的本质:作为函数式接口的实例(即该接口的匿名实现类的对象)
Lambda 表达式的使用一1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283import org.junit.Test;import java.util.ArrayList;import java.util.function.Consumer;/** * Lambda表达式的使用 * * 1.举例: (o1,o2) -> Integer.compare(o1,o2); * 2.格式: * -> :lambda操作符 或 箭头操作符 * ->左边:lambda形参列表 (其实就是接口中的抽象方法的形参列表) * ->右边:lambda体 (其实就是重写的抽象方法的方法体) * * 3.Lambd ...
自定义注解参照 @SuppressWarnings 定义
注解声明为 @interface
内部定义成员,通常使用value
可以指定成员的默认值,使用default定义
如果自定义注解没有成员,表明是一个标识作用;
如果有成员,在使用注解时,需要指明成员的值(有默认值不用)
自定义注解通常都会指定两个元注解:Retention、Target
元注解
Retention:指定所修饰的Annotation 的生命周期:SOURCE\CLASS(默认行为)\RUNTIME,只有声明为 RUNTIME 的注解才能通过反射获取。
Target:用于指定被修饰的Annotation能用于修饰哪些程序元素
Documented:表示所修饰的注解在被javadoc解析时,保留下来
Inherited:被它修饰的Annotation将具有继承性
编程学习
未读
定义接口:定义接口中的成员
JDK7及以前:接口中只能定义全局常量和抽象方法:
全局常量:public static final 的,但是在接口中书写时,可以省略不写;
抽象方法:public abstract 的。
JDK8:除了全局常量和抽象方法,还可以定义静态方法、默认方法,二者可以有方法体:
静态方法:只能通过接口来调用;
默认方法:
通过实现类的对象,可以调用接口中的默认方法;如果实现类重写了接口中的默认方法,调用时仍然调用的是重写后的方法;
如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,那么实现类在没有重写此方法的情况下会报错。——> 接口冲突。这就需要我们在实现类中重写此方法;
如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的默认方法,那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数方法。——>类优先原则
注意:类优先原则仅针对方法,不包括属性,见下方面试题1
规定:在子类(或实现类)的方法中可以调用父类、接口中被子类重写的方法,语法如下(见代码演示1):
super.testFun ...
编程学习
未读
即使catch中又出现了异常,try或者catch中有return语句时,finally里的语句都会执行;
如果操作系统中断了我们的程序,那么finally 代码块可能就不能被执行。也有很多其他类似的行为导致 finally代码块不被执行,比如:
调用System.exit函数
调用halt函数
守护线程,如果守护线程刚开始执行到 finally 代码块,此时没有任何其他非守护线程,那么虚拟机将退出,此时 JVM 不会等待守护线程的 finally 代码块执行完成。
Try 代码块出现无限循环,且不出现异常,finally 也将永远得不到执行。
编程学习
未读== 的作用 基本类型:比较值是否相等 引用类型:比较内存地址值是否相等
equals 的作用 引用类型:默认情况下,比较内存地址值是否相等。可以按照需求逻辑,重写对象的equals方法。
原因Object类中equals方法是直接使用 == 的,源码如下:
123public boolean equals(Object obj) { return (this == obj);}
String、Date等类中重写了equals方法,使该方法实现值比较的作用
编程学习
未读Java 中 String、StringBuffer、StringBuilder 的区别介绍String 是 Java 中很常用的类之一,同时,字符串是 Java 面试中最重要的话题之一。
StringBuffer 和 StringBuilder 类提供了操作字符串的方法。
我们将研究 StringBuffer 和 StringBuilder 之间的区别。
StringBuffer 与 StringBuilder 的区别是 Java 中很常见的面试题。
在控制台上打印程序的内容,可以使用 String。此博客介绍 String 类的主要功能,然后我们将比较 StringBuffer 和 StringBuilder 类。
String因为 String 是 final 修饰的,无法被继承。所以 String 不是 Java 的基本数据类型。字符串在 Java 中是不可变的,因此适合在多线程环境下使用。当我们使用双引号创建一个字符串时,如下,JVM 首先在字符串池中寻找具有相同值的字符串。
1String str1 = "ABC";
如果找到了,它将返回字符串池中的字 ...
内部类的定义将一个类定义在另一个给类里面或者方法里面,这样的类就被称为内部类。内部类可以分为四种:成员内部类、局部内部类、匿名内部类、静态内部类,下面我们逐一介绍这四种内部类。
成员内部类它定义在另一个类中,一般定义格式如下:
12345class C{ class D{ }}
因为类C相对与类D在外面,我们且称类C为外部类,成员内部类可以无条件访问外部类的属性和方法,但是外部类想要访问内部类属性或方法时,必须要创建一个内部类对象,然后通过该对象访问内部类的属性或方法。
成员内部类无条件访问外部类的属性和方法123456789101112class C{ private String name = "外部类"; public void run(){ System.out.println("外部类奔跑"); } class D{ public void say(){ Sys ...
代码块的作用:用来初始化类、对象
代码块如果有修饰的话,只能是static
分类:静态代码块 非静态代码块
静态代码块:
内部可以有输出语句
随着类的加载而执行,而且只执行一次
作用:初始化类的信息
如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行
静态的代码块中只能调用静态的属性、方法,不能调用非静态的结构
非静态代码块:
内部可以有输出语句
随着对象的创建而执行
每创建一个对象,就执行一次非静态代码块
作用:在对象创建时,对对象的属性进行初始化
如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行
非静态代码块可以调用静态的属性、方法,以及非静态的属性、方法
对属性可以赋值的位置
默认初始化
显示初始化
构造器中初始化
有了对象后,可以通过”对象.属性”或者”对象.方法”的方式,进行赋值
在代码块中赋值
执行先后顺序:1 – 2 / 5 – 3 – 4
2和5谁写在前面就先执行谁
示例代码1234567891011121314151617181920212223242526package shangguiguTest.enumTest;/* 1.枚举类先提供对象,下面再写构造器, 2.注意对象写法较为省略,多个对象间用“,”,最后一个用“;" 3.所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。 */public enum enumTest { t1("春天","春暖花开"),//t1其实是一个对象,省略了new t2("夏天","夏日炎炎"), t3("秋天","秋高气爽"), t4("冬天","冰天雪地"); private final String s; private final String s1; enumTest(String s, String s1) ...
