1.java类中如果有抽象方法,那么这个类也必须是抽象类,抽象方法不用实现,但是不是所有抽象类中的方法都是抽象方法
2.抽象类不可以实例化,即不可以new
3.面向抽象编程:父类类型变量可以引用已经实现父类的具体子类的实例。如Person为父类,Student类和Teacher继承Person,Person t=null;
t=new Student();t=new Student();
这种引用高层类型,避免引用实际子类的方式就叫面相抽象编程。
4.所有接口必须是 public abstract的,所以可以不写
5.一个类只能继承一个类,但是可以实现多个接口
6.接口可以继承接口
7.接口里面的方法全是抽象方法,而抽象类中可以有不是抽象方法的方法。
8.接口中可以实现default方法,default方法无法访问字段
9.classpath是jvm的一个环境变量,它用来指示jvm如何搜索class,通常情况下,jvm启动时才加入classpath 通常我们会看到:
java -classpath 路径
或者缩写成
java -cp 路径
通常如果我们没有传入-cp参数,那么jvm会默认在当前目录找
10.jar包,jar包是吧很多.class放在一起打成一个包,实际上就是一个压缩包,如果我们要执行一个jar包的class,可以把jar包放入classpath中,如:
java -cp ./Helloword.jar com.vast.Helloword,这样jvm会自动去Helloword.jar中去搜索Helloword这个类,jar 命令的语法结构:
jar {ctxu}[vfm0M][jar-文件][manifes][-C目录]文件名
例如:jar cf HelloWorld.jar mypackage
将mypackage打包成HelloWorld.jar
其他:
-D参数可以设置系统的属性
-X参数非标准选项,可以用来设置java虚拟机堆的大小
11.模块(Module)java9之后才有,引入为了解决依赖关系,java9之前,所有java标准库都被打包成一个巨大的包rt.jar,java9之后被拆分成几十个模块。把一堆class封装成jar,仅需要打包,而把class封装成模块不仅需要打包还要写依赖关系。模块中支持多个版本
12.String内部是一个char[]数组
13.StringBuffer是早期的StringBuilder的线程安全版本,执行速度慢
14.StringBuilder可以快速的拼接字符串
15.要枚举一个JavaBean的所有属性,可以直接使用Java核心库提供的Introspector,如下面代码:
类:
public class Person {
private String hands;
private String eyes;
private String ears;
public String getHands() {
return hands;
}
public void setHands(String hands) {
this.hands = hands;
}
public String getEyes() {
return eyes;
}
public void setEyes(String eyes) {
this.eyes = eyes;
}
public String getEars() {
return ears;
}
public void setEars(String ears) {
this.ears = ears;
}
}
测试:
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
public class MyJava {
public static void main(String[] args) throws Exception{
Person person=new Person();
BeanInfo info= Introspector.getBeanInfo(Person.class);
PropertyDescriptor[] property= info.getPropertyDescriptors();
for (int i = 0; i < property.length; i++) {
System.out.println(property[i].getName());
System.out.println(property[i].getReadMethod());
System.out.println(property[i].getWriteMethod());
}
}
}
JavaBean是一种符合命名规范的class,它通过getter和setter来定义属性;
Java标准库内置了日志包java.util.logging
public static void main(String[] args) {
Logger lg=Logger.getGlobal();
lg.severe("severe");
lg.warning("warning");
lg.info("info");
lg.config("config");
lg.fine("fine");
lg.finer("finer");
lg.finest("finest");
}
JDK的Logging定义了7个日志级别,从严重到普通
默认级别是INFO,因此,INFO级别以下的日志,不会被打印出来
第三方日志库Commons Logging
Commons Logging它可以挂接不同的日志系统,并通过配置文件指定挂接的日志系统。默认情况下,Commons Loggin自动搜索并使用Log4j,如果没有找到Log4j,再使用JDK Logging
Commons Loggin使用方法:
第一步,通过LogFactory获取Log类的实例; 第二步,使用Log实例的方法打日志
public static void main(String[] args) {
Log log = LogFactory.getLog(Main.class);
log.info("start...");
log.warn("end.");
}
Commons Logging定义了6个日志级别:
FATAL
ERROR
WARNING
INFO
DEBUG
TRACE
使用Log4j输出一条日志时,Log4j自动通过不同的Appender把同一条日志输出到不同的目的地。例如:
console:输出到屏幕;
file:输出到文件;
socket:通过网络输出到远程计算机;
jdbc:输出到数据库
在输出日志的过程中,通过Filter来过滤哪些log需要被输出,哪些log不需要被输出。例如,仅输出ERROR级别的日志。
最后,通过Layout来格式化日志信息,例如,自动添加日期、时间、方法名称等信息。
16.i/o归纳,带有Stream的属于字节流,带有Writer和Reader的属于字符流,同时有Stream和Reader,Writer的是转换流,即InputStreamReader输入转换流,OutputStreamWriter输出转换流
字节流:一般带有Output的属于输出流,带有Input的属于输入流
字符流:输入流带有Reader,输出流带有Writer
17.从内存到磁盘属于输出,从磁盘到内存属于输入,从内存到控制台属于输出,从控制台到内存属于输入。