JAVA高级读书笔记

final

  • final class 无法被继承
  • final 变量无法改变,其初始化
    1. A final variable that is not initialized at the time of declaration is known as blank final variable.

    2. final声明时可以先不初始化,也可以初始化

    3. 如果之前没有初始化,则一定要在类的构造器里初始化,否则报错

    4. 初始化后无法修改

  • final方法无法被重写Override 但子类可以继承使用
  • final 参数无法被修改
	int cube(final int n){
//		n = n+1;
		return n*n*n;
	}
  • static fianl 参数
    如果在声明的时候没有初始化,则只能在static 段static blank 里初始化
	static final int data;
//	public  BikeFinalStatic(){
//		data = 100;
//	}
//	
	static{
		data = 100;
	}
    

两种方法来达到抽象

  • abstract class
    it cannot be instantiated

  • interface

    为什么使用继承

  1. 实现抽象
  2. 多继承
  3. 实现松耦合 loose coupling
  4. Interface fields are public, static and final by default, and methods are public and abstract.
  5. 一个接口可以继承extend另一个接口
  6. java8 以后 接口可以有实现 default method
  7. 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
  • 两者相似处
  1. 无法实例化 instantiate
  2. 有未被实现的方法声明
  • 不相似
  1. fields type
  2. extends

什么时候使用抽象

  1. share code
  2. 有很多共同方法 或属性
  3. 想修改父类的信息

什么时候使用interface

  1. 想要多继承
  2. 想要定义一个behavior 但不关心实现
  3. 想要声明一个类具有的某种类型,比如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
    1. extend the Exception
    2. override toString

annoation

  1. a tag
  2. provide additional information
  3. @Override
  4. @Deprecated
  5. @SuppressWarings
  6. user defined annotation
  7. @Target
  8. @Retention
  9. @Inherited
  10. Documented

Collection

  1. collection ->
    1. set -> SortedSet,HashSet,TreeSet
    2. List-> ArrayList,Vector,LinkedList
    3. Queue
  2. map->sorted map,TreeMap:sorted,HashMap:unsorted,HashTable:thread safe
  3. hashCode() equals()
  4. iterator
    • hasNext()
    • E next()
    • remove()
  5. set cannot contain duplicate elements
  6. 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

一般情况下怎么去写程序

  1. 记事本写,编译?
  2. javac helloworld.java
  3. 回退上一层目录
  4. java 包名+helloworld.class
    魔数
    java 去执行就是把java 装载到虚拟机
    运行时数据放在内存

装载-> 连接-> 初始化
验证 是否合格class

逃逸分析:有些对象不在堆里,在栈

System.exit(0);

ClassLoader

loading -> linking -> initiall
java_home
path
classpath

双亲委托去加载

防止篡改
先看缓存

引用是放在栈中,引用值的值在堆中
extclassloader

Runtime Data Area

  1. 方法区
  2. 堆区
  3. 栈区
  4. PC 计数器
  5. 本地方法区

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资源

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值