java基础知识

来源:互联网 发布:sql over partition by 编辑:程序博客网 时间:2024/06/06 08:58

学习java已经有三年了,在这时复习java知识,感觉有很多收获。本文忽略了一些很基础的知识,只是针对一些不好理解的方面进行分析。

首先补充一些知识(堆、栈)

在java里面,一个应用就是一个JVM实例,有唯一一个堆空间。堆空间是一个运行时数据区,这些对象通过new等指令建立。但一个应用可以有多个进程,因为每个进程可以有多个线程,而栈和线程是一一对应的,即一个线程有唯一栈对应,所以一个进程有多个栈。一个方法对应一个栈帧,所以一个线程可以有多个栈帧。

堆:堆是存储java对象的内存区域,堆空间是一个运行时数据区,这些对象通过new等指令建立。对象所占空间的释放是由垃圾收集器完成。堆分配比较灵活。值得一提的是方法结构信息也是存储在堆中,但是是在堆中的永久区,不会被GC频繁访问。

栈:栈存储一些基本类型的变量数据(int float等)和对象句柄(引用)。而栈帧存储方法内部变量,返回值等信息。这里解释一下句柄,在我看来,对象句柄(引用)就相当于一个“指针”,就像人的名字,能够标示一个人。

1)类成员和实例成员(static)

类成员,直观上看就是被static修饰的成员,可以通过类名来访问而不用实例化的对象。类成员在编译时就已经确定,也就是说编译后就“实例化”了,而不用通过new这些来得到空间。类成员有类变量和类方法两种。类变量可以实现对个对象的数据共享。类方法能够直接方法类成员而不能访问实例成员。当我们在main函数中尝试使用实例成员是会报错的。实例成员要通过创建类的对象,然后对象去访问。

实例成员:动态确定的成员,典型的要通过实例化的对象去访问的变量和方法。在我看来就是要动态确定存储空间的成员。所以实例成员是对象独有的,每个对象的实例成员是不同的。


2)超类、子类和继承性(多态、重载、抽象、接口)

定义不解释了。注意的是在子类的构造器的第一行首先调用超类构造器(super())在这里有几个很重要的相关名词:多态、重载。

多态是对超类,也叫父类而言,通过不同的实例化子类去调用不同对象的相同方法。

比如B、C是A的子类,A B C都实现了study()这个方法,那么 A a = new B();A aa = new C(),a.study(),aa.study()这种就叫做多态:一个方法多种状态实现。多态对程序的健壮性很有帮助。

重载,也叫方法重载,是同一个类中多个相同名字的方法,这些方法名字相同,返回值和参数类型、数量至少一个不同。这样就可以通过传参的不同确定使用哪个方法。

说道了重载也就提一下覆盖,覆盖子类父类中的概念,指子类和父类有一个一样的类。

abstract:

被abstract修饰的是类或者方法。如果类中有一个抽象方法,那么这个类必然被abstract修饰,但是抽象类中不一定都是抽象方法。抽象是定义行为的一种很好方法。抽象类的抽象方法子类一定要去实现。所以,构造方法类方法私有方法不能定义为抽象方法。抽象类不能被实例化。

接口:接口不属于子类父类的范畴里,但是和抽象很像。接口里定义的所有方法要被实现者实现,接口和抽象比起来更“纯粹”些,处理方法声明啥都没有。


3)异常和异常处理(throwable、throw、throws)

所有异常类都是throwable的子类,有errow和Exception两类。

实现自己的异常类可以继承Throwable实现;

如果不想马上处理异常,而是把异常向上抛,则在方法声明“throws”就OK了,比如

public void addSomthing()throws Exception{

...

}

至于throw,和throws比较,throw是语句用来抛异常,throws则是方法可能抛异常声明,在try catch中,catch后可以不处理直接throw exception,也可以处理。

两者在

1:使用位置上:throw是语句使用,throws是方法使用

2:使用场景上:throw是已经有异常,要抛出,throws是方法内可能发生异常,抛出。

3:使用后:throw后,可以在方法内自己捕获异常,而throws是不在方法内处理的,由方法调用者处理。


4)多线程(Thread、Runnable、synchronized)

线程实现的两个方法:

    1)成为Thread的子类,即继承Thread类

    2)实现Runnable接口

第一种方法在子类中实现run方法,然后实例化子类,用子列对象调用start方法就可以了

第二种方法实现run方法,然后实例化对象,假设是B对象实现了run方法,然后调用Thread构造器去把B变成一个Thread的类,然后在调用start方法。

即: public class B implements Runnable{

...

public void run(){

...

}

}


public class testRun{

public testRun(){

B b = new B();

Thread thread = new Thread(b)

b.start();

}

}

synchronized:这个单词是为了同步的。相当于一个互斥信号量。可以对方法加synchronized,这样方法内部就是一个原子事件,也可以对代码段用

void test(){

int a = 0;

synchronized(this){

...同步代码

}

}

对代码段一定要加(对象名),告诉java要执行该代码要有对象名的所标识(主要是类和方法)。在同步代码执行期间(对应的代码内),可以用wait释放对象锁,然后使用notify()或者notifyAll()来通知其它等待这个对象锁的线程。


0 0