JAVA高级读书笔记
final
-
final class 无法被继承
-
final 变量无法改变,其初始化
-
A final variable that is not initialized at the time of declaration is known as blank final variable.
-
final声明时可以先不初始化,也可以初始化
-
如果之前没有初始化,则一定要在类的构造器里初始化,否则报错
-
初始化后无法修改
-
-
final方法无法被重写Override 但子类可以继承使用
-
final 参数无法被修改
int cube(final int n){
// n = n+1;
return n*n*n;
}
static final int data;
// public BikeFinalStatic(){
// data = 100;
// }
//
static{
data = 100;
}
两种方法来达到抽象
-
abstract class
it cannot be instantiated -
interface
为什么使用继承
- 实现抽象
- 多继承
- 实现松耦合 loose coupling
- Interface fields are public, static and final by default, and methods are public and abstract.
- 一个接口可以继承extend另一个接口
- java8 以后 接口可以有实现 default method
- An interface which has no member is known as marker or tagged interface. For example: Serializable, Cloneable, Remote etc. They are used to provide some essential information to the JVM so that JVM may perform some useful operation
- 两者相似处
- 无法实例化 instantiate
- 有未被实现的方法声明
- 不相似
- fields type
- extends
什么时候使用抽象
- share code
- 有很多共同方法 或属性
- 想修改父类的信息
什么时候使用interface
- 想要多继承
- 想要定义一个behavior 但不关心实现
- 想要声明一个类具有的某种类型,比如cloneable
Exception
目标: 即使异常也要让程序正确执行完毕
Throwable :
- Error : error of JVM,not executed yet ,outofmemory stackoverfloat
- Exception : the exception when program has been executed
- unchecked exception RuntimeException 和 error Unchecked exceptions do not need to be
declared in a method or constructor’s throws clause - 自定义 user defined Exception
- extend the Exception
- override toString
annoation
- a tag
- provide additional information
- @Override
- @Deprecated
- @SuppressWarings
- user defined annotation
- @Target
- @Retention
- @Inherited
- Documented
Collection
- collection ->
- set -> SortedSet,HashSet,TreeSet
- List-> ArrayList,Vector,LinkedList
- Queue
- map->sorted map,TreeMap:sorted,HashMap:unsorted,HashTable:thread safe
- hashCode() equals()
- iterator
- hasNext()
- E next()
- remove()
- set cannot contain duplicate elements
- compareTo(Object)
Generic
equal ==
String s1 = "ab";
String s2 = "cd";
String s3 = "abcd";
String s4 = "ab" + "cd";
String s5=s1+s2;
System.out.println("s3 = s1 + s2:" + (s3 == (s1+s2)));//false
System.out.println("s3 = s4:" + (s3 == s4));//true
第二种情况:至今在常量池中相加,及还是在栈区中进行
第一种情况:对于上述情况,若str1,str2采用String定义,拼接时需要额外创建一个StringBuffer(或StringBuilder,combo2就是新建的StringBuilder
),之后将StringBuffer转换为String,在此处new了一个对象,因此实在堆区中进行的
多态
实质: 父类的引用指向子类对象
方法多态,
属性不多态。
static 函数不多态
父类 instanceof 子类?
PA a = new PB();
System.out.println(a instanceof PB); //true
接口
- interface 可以有函数实现 1. static 函数 2. default 函数
- 接口的static函数无法被继承
- default函数 可以被继承,可以重载,主要是为了向后兼容,即interface新加一个函数,之前接了这个接口的类也能够有其实现方法,而不会报错
- 接口冲突函数怎么办,用接口名+super+方法名
class TestInterface implements Test11,Test22{
@Override
public void show(){
Test22.super.run1();
}
@Override
public void run1() {
Test11.super.run1();
}
}
1.接口可以实现接口吗?
ans:不可以实现,但是可以继承一个或多个接口.
2.抽象类可以实现接口吗?
ans:可以
3.接口默认的修饰符
所有的接口 的 成员变量默认都是:puiblic static final 的
所有接口的 方法默认都是:public abstract
static
先运行static 代码块
package cn.tju.scs.c01;
public class StaticBlockDemo {
public static void main(String[] args) {
System.out.println("Main");
}
static{
System.out.println("Static Block!");
System.exit(0);
}
}
重载
重载(overload)
方法的重载是指一个类中可以定义有相同的名字,但参数不同的多个方法。调用时,会根据不同的参数表选择对应的方法。
两同三不同。
——同一个类,同一个方法名。
——不同:参数列表不同。(类型,个数,顺序不同)
只有返回值不同不构成方法重载。
只有形参的名称不同,不构成方法重载。
与普通方法一样,构造函数也可以重载。
作者:Darkray1
来源:CSDN
原文:https://blog.csdn.net/darkray1/article/details/79475835
JVM
java源代码->java编译器-> java 字节码 -> jvm-> 具体平台上的机器指令
类加载顺序
类的field在哪声明都没有关系,即使在声明代码之前调用这个field,因为编译器会自己去寻找
private Singleton()
{
counter1++;
counter2++;
System.out.println(counter2);
}
public static int counter1;
public static int counter2 = 0;
异常
使用异常逻辑更清晰
你可以用系统的throw new Exception(“用户名错误”)
try{
login(username,password);
}catch(Exception e){
System.out.println(e.getMessage);
doSomeThing.......
}
但是假如说其他问题呢 比如说数据库断了你是不是应该重新登陆试试呢
都在这一个Exception 里,肯定满足不了要求的
try{
login(username,password);
}catch(ErrorUserException e){
System.out.println(e.getMessage);
doSomeThing.......
}catch(SqlErrorException e){
System.out.println(e.getMessage);
doSomeThing.......
}
Collection
set,List 是collection 的子接口
hashtable 线程安全,hashmap 线程不安全
collection io
JVM dynamy
Concurrency
泛型
解决Object 的安全问题
stream
Interface Collection
for each
iterator
HashSet
会看compareTo方法!!!
hashSet根据compareTo()方法的写法不同,hashSet是可以加入重复元素的(即使这2个元素的hashCode相同)
Message<? extends List> mes=new Message<String>()
这是不行的
? extends List
表示实现List接口的子类,或者继承的子类
<? super T>
表示包括T在内的任何T的父类,<? extends T>
表示包括T在内的任何T的子类
泛型只能用引用类型,不能用基本类型
类型安全
消除强制类型转换,性能收益
编译不报错,运行可能报错
File
只能对文件和目录进行操作,不能对文件内容进行操作
要用流来进行操作
list
只能用于目录,返回目录里含有多少文件/目录
size
只能用于文件,返回文件含有多少byte
mkdirs() 将文件的所有父目录都建立
IO
- 以数据流的方向不同分为inputStream outputstream
- 以处理数据单位不同分为Byte Stream/Character Stream
字节流
InputStream OutputStream
字符流
reader writter
flush
强制将缓存放在目的地
write
为什么参数是int不是byte
read 无参数 一个一个字节读
读中文可能有问题
byte data[] = new byte[1024];
String str = new String(data,0,foot);
如果String(data) 则将1024包括空字节全部输出
while((temp =isb.read())!=-1){
int t=isb.read();
//这样就读了两次
}
OutputStream output = new FileOutputStream(file);
//将OutputStream类对象传递给OutputStreamWriter类的构造方法,而后向上转型为Writer
Writer wrt = new OutputStreamWriter(output);
wrt.write("OurputStream Writer");
System.out 是PrintStream
对象序列化,就是把对象放在文件里面,
使用Java的FileWriter写文件,需要换行时,假设已经新建FileWriter fr,
在Windows操作系统中,fr.write("\n");
是不行的,需要 fr.write("\r\n");
即回车换行
而在Linux系统中,只要fr.write("\n");
即可
为了程序能在不同操作系统运行,可以写成 fr.write(System.getProperty("line.separator"));
IO FOR JSON
javascript object notation
used for format data
xml 标记语言 比较重
json是一个数据格式用来传递数据
IO FOR OFFICE
POI
JAVA reflection
Date d=new Date(0);
Class c=d.getClass();
Class ss=Date.class;
Class<?> clazz=Class.forName("java.lang.Object");
Class<?> clazz2=Class.forName("java.lang.Object");
System.out.println(clazz2==clazz);//true
System.out.println(c==ss);//true
反射+工厂
public Drawable DrawFactory(String s) throws Exception{
if ("Circle".equals(s)){
return new Circle();
} else if ("Rectangle".equals(s)){
return new Rectangle();
} else if ("Square".equals(s)){
return new Square();
} else if ("Star".equals(s)){
return new Star();
}
return null;
// Drawable d ;
//
// Class<?> c = Class.forName("cn.tju.scs.c01." + s);
// Object obj = c.newInstance();
// d = (Drawable)obj;
// return d;
}
jvm jdk jre
java虚拟机(JVM)
使用java编程语言的主要优势就是平台的独立性。你曾经想知道过java怎么实现平台的独立性吗?对,就是虚拟机,它抽象化了硬件设备,开发者和他们的程序的得以操作系统。虚拟机的职责就是处理和操作系统的交流。java不同的接口规范对任何平台都有良好的支持,因为jvm很好的实现了每个平台的规范.jvm可以理解伪代码字节码,在用户和操作系统之间建立了一层枢纽。
java运行时环境(JRE)
java运行时环境是JVM的一个超集。JVM对于一个平台或者操作系统是明确的,而JRE确实一个一般的概念,他代表了完整的运行时环境。我们在jre文件夹中看到的所有的jar文件和可执行文件都会变成运行时的一部分。事实上,运行时JRE变成了JVM。所以对于一般情况时候使用JRE,对于明确的操作系统来说使用JVM。当你下载了JRE的时候,也就自动下载了JVM。
java开发工具箱(JDK)
java开发工具箱指的是编写一个java应用所需要的所有jar文件和可执行文件。事实上,JRE是JDK的一部分。如果你下载了JDK,你会看到一个名叫JRE的文件夹在里面。JDK中要被牢记的jar文件就是tools.jar,它包含了用于执行java文档的类还有用于类签名的jar包。
JVM
一般情况下怎么去写程序
- 记事本写,编译?
- javac helloworld.java
- 回退上一层目录
- java 包名+helloworld.class
魔数
java 去执行就是把java 装载到虚拟机
运行时数据放在内存
装载-> 连接-> 初始化
验证 是否合格class
逃逸分析:有些对象不在堆里,在栈
System.exit(0);
ClassLoader
loading -> linking -> initiall
java_home
path
classpath
双亲委托去加载
防止篡改
先看缓存
引用是放在栈中,引用值的值在堆中
extclassloader
Runtime Data Area
- 方法区
- 堆区
- 栈区
- PC 计数器
- 本地方法区
JIT just in time compile
Execution Engine
并发
上下文切换
Thread
wait noify notifyAll 是Object
run,start join sleep 是线程
new
runable
runing
block
waiting
timewaiting
terminated
synchronic + static函数 锁的是整个类
synchronic + 非static函数 锁的是this
notify 一个从等待池出来到锁池和其他线程竞争CPU资源