Java基础总结(一)

1.什么是虚拟机?

Java虚拟机是执行字节码文件(.class)的虚拟机进程。

Java源程序(.java)被编译器编译成字节码文件(.class),然后字节码文件,将由Java虚拟机解释成机器码(不同的平台的机器码不同)。利用机器码操作硬件和操作系统。

2.为什么Java被称为平台无关的编程语言?

因为不同的平台装有不同的JVM,它们能够将相同的.class文件,解释成不同平台所需要的机器码,正是因为有JVM的存在,Java被称为平台无关的编程语言。

3、详细解释(可以不看)

1)什么是平台?

CPU和操作系统的总称。

CPU进行计算和控制计算机系统,所以每种CPU都有自己的指令集

操作系统:控制程序执行的程序,充当程序和硬件之间的中介

JDK和JRE的区别是什么?

2)什么是平台无关(跨平台)?

平台无关,不是说源程序(.java)和平台无关,能运行在各个不同的平台;而是说源程序编译后的.class文件,能在不同的平台上运行(只要不同的平台装有不同的JVM)

那来个平台相关的例子:VC编译出来的C语言可执行文件exe,能够在windows上运行,不能在linux上运行。


也就是说java源程序不是直接编译成机器码,而是二次编译的。第一次java源程序被javac编译成.class文件(这个文件和平台无关)。第二次,.class文件被JVM中的解释器编译,解释执行为不同平台所需要的机器码

(英语——》普通话——》各地的方言)


3)javac和JVM都包含在JDK(Java Developement ToolKit)中

参考来自子衿_青青的博客

4.JDK和JRE的区别是什么?

JRE为Java的运行时环境,是运行Java程序依赖的。如果仅仅是运行已经存在的Java程序,只安装JRE即可。

JDK为Java的开发环境,是开发时依赖的。包含JRE

5.static关键字是什么意思?Java中是否可以覆盖(override)一个private或者是 static的方法?

“static”关键字表明一个成员变量或者是成员方法在没有所属的类的实例变量的情况下被访问。

Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是在编译时静态绑定的。static方法跟类的任何实例都不相关。

在《java编程思想》中有这样一段话形容static关键字:

通常,我们创建类时会指出那个类的对象的外观与行为。除非用new 创建那个类的一个对象,否则实际上并 
未得到任何东西。只有执行了new 后,才会正式生成数据存储空间,并可使用相应的方法。 
但在两种特殊的情形下,上述方法并不堪用。一种情形是只想用一个存储区域来保存一个特定的数据——无 
论要创建多少个对象,甚至根本不创建对象。另一种情形是我们需要一个特殊的方法,它没有与这个类的任 
何对象关联。也就是说,即使没有创建对象,也需要一个能调用的方法。为满足这两方面的要求,可使用 
static(静态)关键字。一旦将什么东西设为static,数据或方法就不会同那个类的任何对象实例联系到一 
起。所以尽管从未创建那个类的一个对象,仍能调用一个 static方法,或访问一些 static数据。而在这之 
53 
前,对于非 static数据和方法,我们必须创建一个对象,并用那个对象访问数据或方法。这是由于非 
static数据和方法必须知道它们操作的具体对象。当然,在正式使用前,由于static方法不需要创建任何 
对象,所以它们不可简单地调用其他那些成员,同时不引用一个已命名的对象,从而直接访问非 static成员 
或方法(因为非static成员和方法必须同一个特定的对象关联到一起)。 
有些面向对象的语言使用了“类数据”和“类方法”这两个术语。它们意味着数据和方法只是为作为一个整 
体的类而存在的,并不是为那个类的任何特定对象。有时,您会在其他一些Java 书刊里发现这样的称呼。

这说明了static所修饰的方法/变量可以直接通过类名访问,而不是先创建对象再对里面的静态方法/变量进行访问,当然这样也可以。

static所修饰的变量/代码块/方法在该类被加载时加载/运行(这里特指静态代码块,并且只执行一次)。同时,被static修饰的变量在堆只有一个副本,所有对象对该变量的操作都是在操作同一个变量,如果是实例变量的话,每个对象都有各自的副本,每个对象操作的都是各自的副本。

6.是否可以在static环境中访问非static变量?

不能。

static变量在java中是属于类的,在类的所有实例中,它的值都是一样的。在类被JVM载入时,静态变量的值就确定了。

而非静态变量是属于实例的,要在new一个实例之后,值才会存在。

在static环境中,调用非static变量,可能这个变量都还不存在,当然会出错。

7.Java支持的数据类型有哪些?什么是自动拆装箱?

1)8种基本数据类型:

byte  8位  取值范围 -2^7 ~ 2^7 -1

short 16位  取值范围  -2^15 ~ 2^15 - 1

char  16位  取值范围 0 ~ 2 ^16 - 1

boolean 位数不明确   取值  true false

int 32位   取值范围 -2^31 ~ 2^31 - 1

long 64位 取值范围 -2^63 ~ 2^ 63 - 1

float 32位 取值范围 1.4e-45 ~ 3.40e38

double 64位 取值范围 4.9e-324 ~ 1.79e308

2)引用类型,包括类、接口、数组

需要注意的是,String不是基本数据类型,而是引用类型

引用类型声明的变量,是指该变量在内存中实际上存储的是个引用地址,创建的对象实际是在堆中

自动拆装箱

自动拆装箱,是指基本数据类型和引用数据类型之间的自动转换

如Integer 和 int 可以自动转换; Float和float可以自动转换

  1. //基本类型转换成包装类型,称为装箱  
  2.         Integer intObjct = new Integer(2); //装箱  
  3.         //Integer intObjct = 2 //自动装箱  
  4.         //自动装箱,如果一个基本类型值出现在需要对象的环境中,会自动装箱  
  5.           
  6.         //开箱  
  7.         int a = 3 + new Integer(3); //加法需要的是数值,所以会自动开箱  
  8.           
  9.         Integer b = 3 + new Integer(3); //自动开箱,再自动装箱  
  10.           
  11.         Double x = 3.0;  
  12.         //Double x = 3; //编译器不给过  
  13.         //double y = 3; //而这个可以 

8.Java中的方法覆盖(Overriding)和方法重载(Overloading)是什么意思?

java中的方法重载发生在同一个类里面两个或者多个方法的方法名相同但是参数不同的情况。与此相对,方法覆盖是说子类重新定义了父类的方法。方法覆盖必须有相同的方法名,参数列表和返回类型。

覆盖者可能不会限制它所覆盖的方法的访问。

重载(Overloading)

(1)方法重载是让类以统一的方法处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数(类型)。重载Override是一个类中多态性的一种表现。

(2)java的方法重载,就是在类中可以创建多个方法,他们具有相同的名字,但具有不同参数和不同的定义。调用方法时通过传递给他们不同的参数个数和参数类型来决定具体使用那个方法,这就是多态性。

(3)重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不同。无法以返回类型来作为重载函数的区分标准。

重写(Overriding)

(1)父类与子类的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写。在java中,子类可继承父类的方法,则不需要重新编写相同的方法。但有时子类并不想原封不动继承父类的方法,而是想做一定的修改,这就采用方法重写。方法重写又称方法覆盖。

(2)若子类中的方法与父类的中的某一方法具有相同的方法名、返回类型和参数表,则新方法覆盖原有的方法。如需要父类的原有方法,可以使用super关键字,该关键字引用房钱类的父类。

(3)子类函数访问权限大于父类。

9.Java中,什么是构造函数?什么是构造函数重载?什么是复制构造函数?

当新对象被创建的时候,构造函数会被调用。每一个类都有构造函数。在程序员没有提供构造函数的情况下,Java编译器会为这个类创建一个默认的构造函数。

Java中的构造函数重载和方法重载很类似,可以为一个类创建多个构造函数。每一个构造函数都必须有它自己唯一的参数列表

10.Java支持多继承吗?

java只支持单继承,这是由于安全性的考虑,如果子类继承的多个父类里面有相同的方法或者属性,子类将不知道具体要继承哪个,而接口可以多实现,是因为接口只定义方法,而没有具体的逻辑实现,多实现也要重新实现方法。

11.接口和抽象类的区别是什么?

一 接口和抽象类的相似性

1 接口和抽象类都不能被实例化,它们都位于继承树的顶端,用于被其他类实现和继承。

2 接口和抽象类都可以包含抽象方法,实现接口或继承抽象类的普通子类都必须实现这些抽象方法。

 

二 接口和抽象类的区别

1 接口里只能包含抽象方法,静态方法和默认方法,不能为普通方法提供方法实现,抽象类则完全可以包含普通方法。

2 接口里只能定义静态常量,不能定义普通成员变量,抽象类里则既可以定义普通成员变量,也可以定义静态常量。

3 接口不能包含构造器,抽象类可以包含构造器,抽象类里的构造器并不是用于创建对象,而是让其子类调用这些构造器来完成属于抽象类的初始化操作。

4 接口里不能包含初始化块,但抽象类里完全可以包含初始化块。

5 一个类最多只能有一个直接父类,包括抽象类,但一个类可以直接实现多个接口,通过实现多个接口可以弥补Java单继承不足。

11.什么是值传递和引用传递?

值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。

引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。

12.进程和线程的区别?

(1)进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元
(2)同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文),一个进行至少包括一个线程。
(3)进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束
(4)线程是轻两级的进程,它的创建和销毁所需要的时间比进程小很多,所有操作系统中的执行功能都是创建线程去完成的
(5)线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源
(6)线程有自己的私有属性TCB,线程id,寄存器、硬件上下文,而进程也有自己的私有属性进程控制块PCB,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志

13.创建线程有几种不同的方式?你喜欢哪一种?为什么?

三种方式可以用来创建线程:

  • 继承Thread类

  • 实现Runnable接口

  • 应用程序可以使用Executor框架来创建线程池

实现Runnable接口这种方式更受欢迎,因为这不需要继承Thread类。在应用设计中已经继承了别的对象的情况下,这需要多继承(而Java不支持多继承),只能实现接口。

同时,线程池也是非常高效的,很容易实现和使用。

14.概括的解释下线程的几种可用状态。
1. 新建( new ):新创建了一个线程对象。
2. 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 start ()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取 cpu 的使用权 。
3. 运行( running ):可运行状态( runnable )的线程获得了 cpu 时间片( timeslice ) ,执行程序代码。
4. 阻塞( block ):阻塞状态是指线程因为某种原因放弃了 cpu 使用权,也即让出了 cpu timeslice ,暂时停止运行。直到线程进入可运行( runnable )状态,才有 机会再次获得 cpu timeslice 转到运行( running )状态。阻塞的情况分三种:
(一). 等待阻塞:运行( running )的线程执行 o . wait ()方法, JVM 会把该线程放 入等待队列( waitting queue )中。
(二). 同步阻塞:运行( running )的线程在获取对象的同步锁时,若该同步锁 被别的线程占用,则 JVM 会把该线程放入锁池( lock pool )中。
(三). 其他阻塞: 运行( running )的线程执行 Thread . sleep ( long ms )或 t . join ()方法,或者发出了 I / O 请求时, JVM 会把该线程置为阻塞状态。            当 sleep ()状态超时、 join ()等待线程终止或者超时、或者 I / O 处理完毕时,线程重新转入可运行( runnable )状态。
5. 死亡( dead ):线程 run ()、 main () 方法执行结束,或者因异常退出了 run ()方法,则该线程结束生命周期。死亡的线程不可再次复生。

猜你喜欢

转载自blog.csdn.net/m0_37044606/article/details/80564109