equals()与hashCode()
1.equals()相等的两个对象他们的hashCode()肯定相等,也就是用equals()对比是绝对可靠的。
2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。
Java 类的初始化加载顺序通常遵循以下顺序:
父类静态成员变量 父类静态代码块 子类静态成员变量 子类静态代码块 父类非静态成员变量,父类非静态代码块,父类构造函数,子类非静态成员变量,子类非静态代码块,子类构造函数
Java的跨平台特性是指它的源代码可以在多个平台运行。()
-
正确
-
错误
Java的跨平台特性是因为JVM的存在, 它可以执行.class字节码文件,而不是.java源代码
复制的效率System.arraycopy>clone>Arrays.copyOf>for
Object类中的方法
关于抽象类
JDK 1.8以前,抽象类的方法默认访问权限为protected
JDK 1.8时,抽象类的方法默认访问权限变为default
关于接口
JDK 1.8以前,接口中的方法必须是public的
JDK 1.8时,接口中的方法可以是public的,也可以是default的
JDK 1.9时,接口中的方法可以是private的
下面代码的运行结果为:()
链接:https://www.nowcoder.com/questionTerminal/66eb5b79d0584d09b86d8b5d07593cc6
来源:牛客网
import java.io.*;
import java.util.*;
public class foo{
public static void main (String[] args){
String s;
System.out.println("s=" + s);
}
}
-
代码得到编译,并输出“s=”
-
代码得到编译,并输出“s=null”
-
由于String s没有初始化,代码不能编译通过
-
代码得到编译,但捕获到 NullPointException异常
局部变量可以先申明不用必须初始化,但使用到了一定要先初始化
都是Throwable的子类:
1.Exception(异常) :是程序本身可以处理的异常。
3.检查异常(编译器要求必须处置的异常) : 除了Error,RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。
for循环的执行顺序用如下表达式:
for(expression1;expression2;expression3){
expression4;
}
执行的顺序应该是:
1)第一次循环,即初始化循环。
首先执行表达式expression1(一般为初始化语句);再执行expression2(一般为条件判断语句),判断expression1是否符合expression2的条件;如果符合,则执行expression4,否则,停止执行;最后执行expression3。
2)第N(N>=2)次循环
首先执行expression2,判断在expression3是否符合在expression2要求;如果符合,则继续执行在expression4,否则,停止执行。最后执行在expression3。如此往复,直至expression3不满足在expression2条件是为止。
总结:
总的来说,执行的顺序是一致的。先条件判断(expression2),再函数体执行(expression4),最后for执行(expression3)。往复......区别在于,条件判断的对象。第一次判断时,对象为初始化语句(expression1),后续的判断对象为执行后的结果(expression3)。
jre 判断程序是否执行结束的标准是()
-
所有的前台线程执行完毕
Java只支持单继承,实现多重继承三种方式:
(1)直接实现多个接口
(2)扩展(extends)一个类然后实现一个或多个接口
(3)通过内部类去继承其他类
静态变量会默认赋初值,局部变量和final声明的变量必须手动赋初值
interface中的方法默认为public abstract 的 ,变量默认为public static final
抽象类中的方法默认权限是default
把你看得懂的转换为看不懂的,就是序列化。
把你看不懂的转换为看得懂的,就是反序列化。
1.构造方法作用:
(1).构造出来一个类的实例
(2).对构造出来个一个类的实例(对象)初始化。
2.构造方法的名字必须与定义他的类名完全相同,没有返回类型,甚至连void也没有。
抽象类和接口
抽象类
特点:
1.抽象类中可以构造方法
2.抽象类中可以存在普通属性,方法,静态属性和方法。
3.抽象类中可以存在抽象方法。
4.如果一个类中有一个抽象方法,那么当前类一定是抽象类;抽象类中不一定有抽象方法。
5.抽象类中的抽象方法,需要有子类实现,如果子类不实现,则子类也需要定义为抽象的。
接口
1.在接口中只有方法的声明,没有方法体。
2.在接口中只有常量,因为定义的变量,在编译的时候都会默认加上
public static final
3.在接口中的方法,永远都被public来修饰。
4.接口中没有构造方法,也不能实例化接口的对象。
5.接口可以实现多继承
6.接口中定义的方法都需要有实现类来实现,如果实现类不能实现接口中的所有方法
7.则实现类定义为抽象类。
接口可以有default、static方法。
异常
java.lang.NullPoninterException:变量未被初始化、对象未赋值、对象为空(俗称的空指针异常)
java.lang.NumberFormatException:数据格式转换失败(integer的取值范围为:-128~127,超过范围都会访问false)
java.lang.RuntimeException:运行时异常
java.lang.ArrayindexOutOfBoundsException:数组下标越界
线程私有:java虚拟机栈,程序计数器,本地方法栈
线程共享:java堆,方法区
Vector & ArrayList 的主要区别
1) 同步性:Vector是线程安全的,也就是说是同步的 ,而ArrayList 是线程序不安全的,不是同步的 数2。
2)数据增长:当需要增长时,Vector默认增长为原来一倍 ,而ArrayList却是原来的50% ,这样,ArrayList就有利于节约内存空间。
Java运行
- 编译器将Java源代码编译成字节码class文件
- 类加载到JVM里面后,执行引擎把字节码转为可执行代码
- 执行的过程,再把可执行代码转为机器码,由底层的操作系统完成执行。
抛InterruptedException的代表方法有:
-
java.lang.Object 类的 wait 方法
-
java.lang.Thread 类的 sleep 方法
-
java.lang.Thread 类的 join 方法
关于Java程序初始化顺序:
-
父类的静态代码块
-
子类的静态代码块
-
父类的普通代码块
-
父类的构造方法
-
子类的普通代码块
-
子类的构造方法
JVM内存
方法区和堆内存是线程共享的。
程序计数器、虚拟机栈是线程隔离的。
使用mvc模式设计的web应用程序具有以下优点,除了?
A
可维护行强
B
可扩展性强
C
代码重复少
D
大大减少代码量
方法内定义的变量没有初始值,必须要进行初始化。 类中定义的变量可以不需要赋予初始值,默认初始值为0。
内存回收
加载驱动方法
1.Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
2. DriverManager.registerDriver(new com.mysql.jdbc.Driver());
3.System.setProperty("jdbc.drivers", "com.mysql.jdbc.Driver");
常用ASCII码值:空格为32;数字0为48;“A”为65;“a”值为97。
在调用子类构造器之前,会先调用父类构造器,当子类构造器中没有使用"super(参数或无参数)"指定调用父类构造器时,是默认调用父类的无参构造器,如果父类中包含有参构造器,却没有无参构造器,则在子类构造器中一定要使用“super(参数)”指定调用父类的有参构造器,不然就会报错
Java集合框架
javac编译。javah生成c++头文档。javadoc生成解释API文档。jar,打包
java,exe是java虚拟机
javadoc.exe用来制作java文档
jdb.exe是java的调试器
javaprof,exe是剖析工具
定义在类中的变量是类的成员变量,可以不进行初始化,Java会自动进行初始化,如果是引用类型默认初始化为null,如果是基本类型例如int则会默认初始化为0
局部变量是定义在方法中的变量,必须要进行初始化,否则不同通过编译
Servlet生命周期分成3个阶段:
1)初始化阶段:调用init方法
2)响应客户请求:调用service
3)终止:调用destory方法
每天更新遇到的小知识点