编程学习
未读静态方法调用直接 类名.方法名 调用
非静态方法调用需要实例化对应的类来调用
注意事项
因为static和非static类型的方法加载时间不同,因此static类型的方法无法调用非static类型的方法或属性
创建了类的多个对象后,多个对象共享同一个静态变量;当某一个对象修改了该静态变量后,会导致其他对象再调用该静态变量时,是修改过的。(在修改之前调用静态变量则是修改之前的值)
static方法中,不能使用this、super关键字
static类型的结构随着类的加载而加载
静态结构前没有声明的都是省略的 “类名.”
编程学习
未读如果一个接口中,只声明了一个抽象方法,则此接口就称为函数式接口。
我们可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口。
在 java.util.function 包下定义了Java 8 的丰富的函数式接口
Java从诞生日起就是一直倡导“一切皆对象”,在 Java 里面面向对象(OOP)编程是一切。但是随着 python、scala 等语言的兴起和新技术的挑战,Java 不得不做出调整以便支持更加广泛的技术要求,也即 java 不但可以支持 OOP 还可以支持 OOF(面向函数编程)
在函数式编程语言当中,函数被当做一等公民对待。在将函数作为一等公民的编程语言中,Lambda 表达式的类型是函数。但是在 Java8 中,有所不同。在 Java8 中,Lambda 表达式是对象,而不是函数,它们必须依附于一类特别的对象类型——函数式接口。
简单的说,在 Java8 中,Lambda 表达式就是一个函数式接口的实例。这就是 Lambda 表达式和函数式接口的关系。也就是说,只要一个对象是函数式接口的实例,那么该对象就可以用 La ...
编程学习
未读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 ...

