Java week3-4 总结
重载
接口
一个需求表明,接口中有的方法必须被掉用类的覆盖了才可以用implement
不需要有方法,但可以有(默认方法)
实现该接口的类的实例可以用:接口名 xx = 类名(args);
可能的冲突:
- 超类冲突,如果超类提供了一个具体方法,同名而且有相同参数类型的默认方法会
被忽略。 - 接口冲突。 如果一个超接口提供了一个默认方法,另一个接口提供了一个同名而且
参数类型 (不论是否是默认参数)相同的方法, 必须覆盖这个方法来解决冲突。
复习一下覆盖,同名方法+super关键字(不加super可能无法访问超类的域)
垃圾回收
堆
放实例,方法区引用
方法区
class文件信息,运行时常量池,以及编译器编译后的代码堆:存储对象,对象包含类的信息,指向方法区
栈
虚拟机栈:表示Java方法执行的内存模型,每调用一个方法就会为每个方法生成一个栈帧(Stack Frame),用来存储局部变量表、操作数栈、动态链接、方法出口,线程等信息。
程序计数器:程序计数器用来记录当前正在执行的指令
用一个十分简单的代码段模拟一下Java堆栈的运行过程:
1 |
|
新建一个main线程的一个栈
jvm在方法区寻找是否存在Person类的信息
如果没找到类加载器加载Person类信息到方法区,然后在堆中创建Person对象,并持有方法区的引用
把person添加到main主线程栈中,并指向堆上的Person实例。
执行person的sayhello方法,找到堆上的Person实例。
根据堆上Person的方法区引用,找到方法区上sayhello的字节码,然后执行完成。
回收方式
变量回收小结:
- 静态成员变量在类装载的时候就进行了创建,在整个程序结束时按序销毁。
- 实例变量在类实例化对象时候创建,在对象销毁的时候销毁。
- 局部变量在局部范围使用时创建,跳出局部范围销毁。
JVM中判断是否回收一个对象使用的是可达性分析算法,GC ROOT不可到达的节点都将会被标记上,一个对象如果被标记了两次就会被回收掉。
1 |
|
工具类(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() 方法 //返回指定索引处的字符
string.append()
string.insert()
string.setCharAt(index,string);
string.substring(index,index+2) /左闭右开!
eg:
output:swear oft.
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 |
|
Number类
然而,在实际开发过程中,我们经常会遇到需要使用对象,而不是内置数据类型的情形。为了解决这个问题,Java 语言为每一个内置数据类型提供了对应的包装类。
所有的包装wrapper类(Integer、Long、Byte、Double、Float、Short)都是抽象类 Number 的子类。
回顾一下装箱和自动拆箱。。
需要把5(int 内置类型)装箱为integer,然后为了加运算,再自动拆箱为int
Numbers类的一个重大用处是用在泛型,<>内必须是对象而非基本类型
Swing
没啥复习的,buttom action那块再看看
布局
EXCEPTION
基本定义
IO为input output错误;Runtime 为运行时错误
派生于 RuntimeException 的异常包含下面几种情况:
• 错误的类型转换。
• 数组访问越界 i
• 访问 null 指针
不是派生于 RuntimeException 的异常包括:
•试图在文件尾部后面读取数据。
•试图打开一个不存在的文件。
•试图根据给定的字符串查找 Class 对象, 而这个字符串表示的类并不存在
派生于RuntimeException和ERROR的为非受查(uncheck)异常,即不需要写throw,系统会自动考虑。其他都是受查异常,根据需要写(告诉编译器可能有什么错误发生)
throws:抛出异常
抛出异常
JAVA的错误返回的是一个异常类对象,可以用一些方法来读取错误信息。
一般步骤:
- 找到合适的异常类
- 创建这个对象
- 将对象抛出
eg:
1 |
|
创建异常类
一般要继承
例如, 定义一个派生于 IOException 的类。
习惯上, 定义的类应该包含两个构造器, 一个是默认的构造器;另一个是带有详细描述信息
的构造器(超类 Throwable 的 toString 方法将会打印出这些详细信息, 这在调试中非常有用)。
eg:
1 |
|
补充,一些throwable的方法
e.getMessage();
e.getClass().getName();
捕获异常
try
more code
}
catch (ExceptionType e)
{
handlerfor this type
}
逻辑:
如果try任何代码有e的错误,跳过try剩余代码,执行catch
如果没有e错误,则跳过catch
文件输入
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!