常量在定义时要使用final关键字修饰。
常量定义实例代码如下:
final String jxDetail="关注“Java 精选”微信公众号";
变量的值可以改变而常量的值在初始化以后是无法改变的。
JAVA中可以通过三个元素来描述变量:变量类型、变量名以及变量值。
变量定义实例代码如下:
String jxDetail="关注“Java 精选”微信公众号";
其中String具有不可变性,重新赋值后会生成新的String对象,jxDetail变量名实际是指向对象地址的引用,“关注“Java 精选”微信公众号”为具体的值。
log4j定义了8个级别的log,除去OFF和ALL可以说分为6个级别。
优先级从高到低依次为:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、ALL。
ALL 最低级别,用于打印所有日志记录。
TRACE 很低的日志级别,一般不会使用。
DEBUG 输出细粒度信息事件有助于调试应用程序,主要用于开发过程中打印一些运行信息。
INFO 消息在粗粒度级别上突出强调应用程序的运行过程,打印一些开发者关注的或者重要的信息,用于生产环境中输出程序运行的一些重要信息,但是不能滥用 避免打印过多的日志。
WARN 表示会出现潜在错误的情况,有些信息不是错误信息,但是用于给开发人员的一些提示。
ERROR 指出虽然发生错误事件 但仍然不影响系统的继续运行,打印错误和异常信息 如果不想输出太多的日志 可以使用这个级别
FATAL 指出每个严重的错误事件将会导致应用程序的退出,这个级别是重大错误可以直接停止程序。
OFF 最高等级,用于关闭所有日志记录。
String是不可变对象,每次对String类型进行操作都等同于产生了一个新的String对象,然后指向新的String对象。因此尽量避免对String进行大量拼接操作,否则会产生很多临时对象,导致GC开始工作,影响系统性能。
StringBuffer是对象本身操作,而不是产生新的对象。因此在有大量拼接的情况下,建议使用StringBuffer。
String是线程不安全的,而StringBuffer是线程安全的。
需要注意是Java从JDK5开始,在编译期间进行了优化。如果是无变量的字符串拼接时,那么在编译期间值都已经确定了的话,javac工具会直接把它编译成一个字符常量。比如:
String str = "关注微信公众号" + "“Java精选”" + ",面试经验、专业规划、技术文章等各类精品Java文章分享!";
在编译期间会直接被编译成如下:
String str = "关注微信公众号“Java精选”,面试经验、专业规划、技术文章等各类精品Java文章分享!";
创建对象 | 构造方法说明 |
---|---|
使用new关键字 | 调用构造方法 |
使用Class类的newInstance方法 | 调用构造方法 |
使用Constructor类的newInstance方法 | 调用构造方法 |
使用clone方法 | 没有调用构造方法 |
使用反序列化 | 没有调用构造方法 |
hh:mm:ss
按照12小时制的格式进行字符串格式化
如果时间处于00:00:00至12:59:59,则返回的字符串正常
如果时间处于13:00:00至23:59:59,则返回的字符串是实际时间-12小时后的值,也就是说比真实的时间少了12个小时。
HH:mm:ss
按照24小时制的格式进行字符串格式化
当时间为任意一个区间,则返回的字符串都是正常的。
实例代码:
Date date = new Date();
SimpleDateFormat fromat = new SimpleDateFormat("hh:mm:ss");
System.out.println("hh:mm:ss 输出结果:" + fromat.format(date));
fromat = new SimpleDateFormat("HH:mm:ss");
System.out.println("HH:mm:ss 输出结果:" + fromat.format(date));
执行结果:
hh:mm:ss 输出结果:04:56:47
HH:mm:ss 输出结果:16:56:47
远程对象的stub扮演了远程对象的代表或者代理的角色。调用者在本地stub上调用方法,它负责在远程对象上执行方法。当stub的方法被调用的时候,会经历以下几个步骤:
1)初始化到包含了远程对象的JVM的连接。
2)序列化参数到远程的JVM。
3)等待方法调用和执行的结果。
4)反序列化返回的值或者是方法没有执行成功情况下的异常。
5)把值返回给调用者。
类名和接口名:通常定义为由具有含义的单词组成,所有单词的首字母大写。
长度基本上没有限制。
但是不能使用Java关键字(例如,public或 class等)作为类名。
非静态的方法可以调用静态的方法,但是静态的方法不可以调用非静态的方法。
类的静态成员(变量和方法)属于类本身,在类加载的时候就会分配内存,可以通过类名直接去访问;非静态成员(变量和方法)属于类的对象,所以只有在类的对象产生(创建类的实例)时才会分配内存,然后通过类的对象(实例)去访问。
在一个类的静态成员中去访问其非静态成员之所以会出错是因为在类的非静态成员不存在的时候类的静态成员就已经存在了,访问一个内存中不存在的东西当然会出错。
a==b 与 a.equals(b) 有什么区别?
假设a和b都是对象
a==b是比较两个对象内存地址,当a和b指向的是堆中的同一个对象才会返回true。
a.equals(b)是比较的两个值内容,其比较结果取决于equals()具体实现。
多数情况下需要重写这个方法,如String类重写equals()用于比较两个不同对象,但是包含的字母相同的比较:
public boolean equals(Object obj) {
if (this == obj) {// 相同对象直接返回true
return true;
}
if (obj instanceof String) {
String anotherString = (String)obj;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
内部类是指把A类定义在另一个B类的内部。
例如:把类User定义在类Role中,类User就被称为内部类。
class Role {
class User {
}
}
1、内部类的访问规则
1)可以直接访问外部类的成员,包括私有
2)外部类要想访问内部类成员,必须创建对象
2、内部类的分类
1)成员内部类
2)局部内部类
3)静态内部类
4)匿名内部类