Java week3-4 总结

重载

image-20200603111200391

接口

一个需求表明,接口中有的方法必须被掉用类的覆盖了才可以用implement

不需要有方法,但可以有(默认方法)

实现该接口的类的实例可以用:接口名 xx = 类名(args);

可能的冲突:

  • 超类冲突,如果超类提供了一个具体方法,同名而且有相同参数类型的默认方法会
    被忽略。
  • 接口冲突。 如果一个超接口提供了一个默认方法,另一个接口提供了一个同名而且
    参数类型 (不论是否是默认参数)相同的方法, 必须覆盖这个方法来解决冲突。

复习一下覆盖,同名方法+super关键字(不加super可能无法访问超类的域)

垃圾回收

放实例,方法区引用

方法区

class文件信息,运行时常量池,以及编译器编译后的代码堆:存储对象,对象包含类的信息,指向方法区

虚拟机栈:表示Java方法执行的内存模型,每调用一个方法就会为每个方法生成一个栈帧(Stack Frame),用来存储局部变量表、操作数栈、动态链接、方法出口,线程等信息。

程序计数器:程序计数器用来记录当前正在执行的指令

用一个十分简单的代码段模拟一下Java堆栈的运行过程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class AppTest {
public static void main(String[] args) {
Person person = new Person("张三");
person.sayHello();
}
}
class Person {
String name;
public Person(String name) {
this.name = name;
}
public void sayHello()
{
System.out.println("hello " + name);
}
}

新建一个main线程的一个栈

jvm在方法区寻找是否存在Person类的信息

如果没找到类加载器加载Person类信息到方法区,然后在堆中创建Person对象,并持有方法区的引用

把person添加到main主线程栈中,并指向堆上的Person实例。

执行person的sayhello方法,找到堆上的Person实例。

根据堆上Person的方法区引用,找到方法区上sayhello的字节码,然后执行完成。

回收方式

image-20200603171520932

image-20200603171512678

变量回收小结:

  • 静态成员变量在类装载的时候就进行了创建,在整个程序结束时按序销毁。
  • 实例变量在类实例化对象时候创建,在对象销毁的时候销毁。
  • 局部变量在局部范围使用时创建,跳出局部范围销毁。

JVM中判断是否回收一个对象使用的是可达性分析算法,GC ROOT不可到达的节点都将会被标记上,一个对象如果被标记了两次就会被回收掉

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Test {
private static Test TEST= null;
public static void main(String args[]) {
TEST = new Test();
TEST = null;
System.gc();
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(TEST);
}
@Override
public void finalize() throws Throwable {
System.out.println("要死了要死了要死了!");
}
}

output:
"要死了要死了要死了!"
NULL

工具类(Math,string)

String

字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。例如:

1
2
String str = "abc";

等效于:

1
2
char data[] = {'a', 'b', 'c'};
String str = new String(data);

常用方法:

string.length();

string1.concat(string2); //连接两个字符串

Java charAt() 方法 //返回指定索引处的字符

image-20200603104917493

string.append()

string.insert()

string.setCharAt(index,string);

string.substring(index,index+2) /左闭右开!

eg:

image-20200603164324214

output:swear oft.

string类api

Math类

Java 的 Math 包含了用于执行基本数学运算的属性和方法,如初等指数、对数、平方根和三角函数。

Math 的方法都被定义为 static 形式,通过 Math 类可以在主函数中直接调用。

public class Test {

​ public static void main (String []args) {

​ System.out.println(“90 度的正弦值:” + Math.sin(Math.PI/2));

​ System.out.println(“0度的余弦值:” + Math.cos(0));

​ System.out.println(“60度的正切值:” + Math.tan(Math.PI/3));

​ System.out.println(“1的反正切值: “ + Math.atan(1));

​ System.out.println(“π/2的角度值:” + Math.toDegrees(Math.PI/2));

​ System.out.println(Math.PI);

​ }

}

以上实例编译运行结果如下:

1
2
3
4
5
6
90 度的正弦值:1.0
0度的余弦值:1.0
60度的正切值:1.7320508075688767
1的反正切值: 0.7853981633974483
π/2的角度值:90.0
3.141592653589793

Number类

然而,在实际开发过程中,我们经常会遇到需要使用对象,而不是内置数据类型的情形。为了解决这个问题,Java 语言为每一个内置数据类型提供了对应的包装类。

所有的包装wrapper类(Integer、Long、Byte、Double、Float、Short)都是抽象类 Number 的子类。

image-20200603105234111

回顾一下装箱和自动拆箱。。

image-20200603105317150

需要把5(int 内置类型)装箱为integer,然后为了加运算,再自动拆箱为int

Numbers类的一个重大用处是用在泛型,<>内必须是对象而非基本类型

Swing

没啥复习的,buttom action那块再看看

布局

EXCEPTION

基本定义

image-20200602102721746

IO为input output错误;Runtime 为运行时错误

派生于 RuntimeException 的异常包含下面几种情况:
• 错误的类型转换。
• 数组访问越界 i
• 访问 null 指针

不是派生于 RuntimeException 的异常包括:
•试图在文件尾部后面读取数据。
•试图打开一个不存在的文件。
•试图根据给定的字符串查找 Class 对象, 而这个字符串表示的类并不存在

派生于RuntimeException和ERROR的为非受查(uncheck)异常,即不需要写throw,系统会自动考虑。其他都是受查异常,根据需要写(告诉编译器可能有什么错误发生)

throws:抛出异常

抛出异常

JAVA的错误返回的是一个异常类对象,可以用一些方法来读取错误信息。

一般步骤:

  • 找到合适的异常类
  • 创建这个对象
  • 将对象抛出

eg:

1
2
3
4
5
EOFException e = nw EOFException();
throw e;
或者
throw new EOPException(匿名)

创建异常类

一般要继承

例如, 定义一个派生于 IOException 的类。
习惯上, 定义的类应该包含两个构造器, 一个是默认的构造器;另一个是带有详细描述信息
的构造器(超类 Throwable 的 toString 方法将会打印出这些详细信息, 这在调试中非常有用)。

eg:

1
2
3
4
5
6
7
8
9
class FileFormatException extends IOException
{
public FileFormatExceptionO {}
public FileFormatException(String gripe)
{
super(gripe); //原本的含参gripe为:
"Content-length: " + len + ", Received: " + n;
}
}

补充,一些throwable的方法

e.getMessage();

e.getClass().getName();

捕获异常

try
more code
}
catch (ExceptionType e)
{
handlerfor this type
}

逻辑:

  • 如果try任何代码有e的错误,跳过try剩余代码,执行catch

  • 如果没有e错误,则跳过catch

文件输入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
LocalDateTime dNow = LocalDateTime.now();
DateTimeFormatter ft = DateTimeFormatter.ofPattern("yyyy-MM-dd-hh-mm-ss");
UrlString = UrlString.replaceAll("\\.","-");
File f = new File(UrlString+"-"+ft.format(dNow)+".txt");
f.createNewFile();
FileOutputStream file1 = new FileOutputStream(f);
PrintStream print2 = new PrintStream(file1);
System.setOut(print2);
System.out.println(UrlString+"-"+ft.format(dNow)+".txt");
System.out.println();
System.out.println("RTT(ms) histogram");
for(int i = 0;i<3;i++){
System.out.print(list.get(list.size()-1)+3*i+"-"+(list.get(list.size()-1)+3*(i+1))+":"+list_hist.get(i));
System.out.println();
}

scanner.close();