Java基础知识点总结
说明一下public static void main(String[] args)这段声明里每个关键字的作用。
答:public表示权限修饰符,表明任何类或对象都可以访问这个方法;
static表示main()方法是一个静态方法,即方法中的代码是存储在静态存储区的,只要类被加载后,就可以使用该方法而不需要通过实例化对象来访问;
void表示该方法没有返回值;
main是JVM识别的特殊方法名,是程序的入口方法。
我们知道,程序的入口方法为:public static void main(String[] args),main方法是否还有其他可用的定义格式?
答:
1)由于public与static没有先后顺序关系,因此下面的定义也是合理的。
static public void main(String[] args)
2)也可以把main()方法定义为final。
public static final void main(String[] args)
3)也可以用synchronized来修饰main()方法。
static public synchronized voin main(String[] args)
不管哪种定义方式,都必须保证main()方法的返回值为void,并有static与public关键字修饰。同时由于main()方法为程序的入口方法,因此不能用abstract关键字来修饰。
常见笔试题:
Java程序中程序运行入口方法main的签名正确的有(ABCD)
A.public static void main(String[] args)
B.public static final void main(String[] args)
C.static public void main(String[] args)
D. static public synchronized void main(String[] args)
E. static public abstract void main(String[] args)
如何实现在main()方法执行前输出“Hello World”?
答:静态代码块。
如果去掉了main()方法中的static修饰符会怎样?
答:程序能正常编译,但运行时会抛NoSuchMethodError异常。
Java程序初始化的顺序是怎样的?
答:Java程序的初始化一般遵循3个原则(优先级依次递减):①静态对象(变量)优先于非静态对象(变量)初始化,其中,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次。②父类优先于子类进行初始化。③按照成员变量的定义顺序进行初始化。即使变量定义散布于方法定义之中,它们依然在任何方法(包括构造函数)被调用之前先初始化。
Java程序初始化工作可以在许多不同的代码块中来完成(例如静态代码块、构造函数等),它们执行的顺序如下:父类静态变量,父类静态代码块、子类静态变量,子类静态代码块,父类非静态变量、父类非静态代码块、父类构造函数、子类非静态变量、子类非静态代码块、子类构造函数。
常见笔试题:
class B extends Object{
static{
System.out.println(“Load B1”);
}
public B(){
System.out.println(“Create B”);
}
static{
System.out.println(“Load B2”);
}
}
class A extends B{
static{
System.out.println(“Load A”);
}
public A(){
System.out.println(“Create A”);
}
}
public class Testclass{
public static void main(String[] args){
new A();
}
}
A、Load B1 Load B2 Create B Load A Create A
B、Load B1 Load B2 Load A Create B Create A
C、Load B2 Load B1 Create B Create A Load A
D、Create B Create A Load B1 Load B2 Load A
答案:B。
Java中的作用域有哪些?
答:在计算机程序中,声明在不同地方的变量具有不同的作用域,例如局部变量、全部变量等。在Java语言中,作用域是由花括号的位置决定的。
在Java语言中,变量的类型主要有3种:成员变量、静态变量和局部变量。类的成员变量的作用范围与类的实例化对象的作用范围相同,当类被实例化时,成员变量就会在内存中分配空间并初始化,直到这个被实例化对象的生命周期结束时,成员变量的生命周期才结束。被static修饰的成员变量被称为静态变量或全局变量,与成员变量不同的是,静态变量不依赖于特定的实例,而是被所有实例所共享,也就是说,只要一个类被加载,JVM就会给类的静态变量分配内存空间。因此,就可以通过类名和变量名来访问静态变量。局部变量的作用域与可见性为它所在的花括号内。
此外,成员变量也有4种作用域,它们分别是:
private 当前类
default 当前类 同一package
protected 当前类 同一package 子类
public 当前类 同一package 子类 其他package
需要注意的是,这些修饰符只能修饰成员变量(静态变量),不能用来修饰局部变量。private和protected不能用来修饰类(只有public、abstract或final能用来修饰类)。
常见笔试题:
下列说法中,正确的是(D)
A.实例方法可直接调用超类的实例方法 B.实例方法可直接调用超类的类方法
B.实例方法可直接调用其它类的实例方法 D.实例方法可直接调用本类的类方法
答案:D。当超类的实例方法或类方法为private时,是不能被子类调用的。同理,当其他类的实例方法为private时,也不能被直接调用。
一个Java文件中是否可以定义多个类
答:可以。但只能有一个public修饰的类。
下列关于构造函数的叙述中,错误的是(C)
A. Java语言规定构造方法名与类名必须相同
B. Java语言规定构造方法没有返回值,但不用void声明
C. Java语言规定构造方法不可以重载
D. Java语言规定构造方法只能通过new自动调用
下列说法中,正确的是(C)
A. class中的constructor不可省略
B. constructor必须与class同名,但方法不能与class同名(普通方法可以与class同名)
C. constructor在一个对象被new时执行
D. 一个class只能定义一个constructor
不能用来修饰interface的有(ACD)
A. private B.public C.protected D.static
Java中有指针吗?
答:由于指针不仅会给开发人员带来使用上的不便,而且也是造成程序不稳定的根源,为了消除C/C++语言的这些缺点,Java语言取消了指针的概念,但这只是在Java语言中没有明确提供指针的概念和用法,而实质上每个new语句返回的都是一个指针的引用,只不过在大部分情况下开发人员不需要关心如果去操作这个指针而已。
总结:Java中没有指针这个概念,但有和指针起相同作用的引用。
什么是反射机制?
答:反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,同时也允许对其内部的成员进行操作。由于反射机制能够实现在运行时对类进行装载,因此能够增加程序的灵活性,但是不恰当地使用反射机制,也会严重影响系统的性能。
具体而言,反射机制提供的功能主要有:得到一个对象所属的类;获取一个类的所有成员变量和方法;在运行时创建对象;在运行时调用对象的方法。
其实,反射机制非常重要的一个作用就是可以在运行时动态地创建类的对象。
在反射机制中,Class是一个非常重要的类,那么如何才能获取class类呢?总共有如下3种方法可以获取到Class类:
1)Class.forName(“类的路径”)
2)类名.Class
3)实例.getClass()
常见笔试题:
Java创建对象的方式有几种?
答:共有4种创建对象的方法。
1)通过new语句实例化一个对象。
2)通过反射机制创建对象。
3)通过clone()方法创建一个对象。
4)通过反序列化的方式创建对象。
变量命名有哪些规则?
答:变量名可包含字母,数字,下划线’_’,$符号,不能以数字开头,不能为java中的关键字。
常见笔试题:
下列不属于Java标识符的是(B)
A._HelloWorld B.3HelloWorld
C.$HelloWorld D.HelloWorld3
下列标识符不合法的有(ACD)
A.new B.$usdollars
C.12340 D.car.taxi
break、continue以及return有什么区别?
答:break跳出当前循环语句
continue结束本次循环,进入下一次循环
return起一个跳转作用,表示一个方法的返回,让程序返回到调用该方法的位置。
Java语言中是否存在goto关键字?
答:存在。但是goto关键字作为保留字存在,并未在Java中使用。
final、finally和finalize有什么区别?
答:final:可用来声明属性、方法和类,分别表示属性不可变、方法不可重写和类不可被继承。
finally:是异常处理的一部分,与try/catch合用,finally代码块里面的代码一定会被执行,常用来释放资源。但有特殊情况不会被执行,即,在执行到finally代码块之前退出了JVM虚拟机,用System.exit(0)可实现;
finalize:是Object类的一个方法,用于垃圾回收
throws和throw的区别(面试题)
答:
throws
用在方法声明后面,跟的是异常类名
可以跟多个异常类名,用逗号隔开
表示抛出异常,由该方法的调用者来处理
throws表示出现异常的一种可能性,并不一定会发生这些异常
throw
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
表示抛出异常,由方法体内的语句处理
throw则是抛出了异常,执行throw则一定抛出了某种异常
如果catch里面有return语句,请问finally里面的代码还会执行吗?如果会,请问是在return前,还是return后。
答:会。前。准确地说,在中间。
JDK中哪些类是不可以被继承的?
答:不能被继承的类是用final关键字修饰的类。常见的有String、Math等。
什么是实例变量?什么是类变量?什么是局部变量?什么是final变量?
答:实例变量又称为成员变量,属于对象,只有实例化对象之后才可以使用,可多次创建。
类变量又称为静态变量,属于类,随着类的加载而初始化,只创建一次。
局部变量是定义在方法里面的变量,可定义在方法参数中,也可定义在方法内部,使用之前必须初始化,随着方法的结束而销魂。
final变量是被final关键字修饰的变量,一旦声明,不可被改变。
static和final结合使用表示什么意思?
答:Java语言中,static关键字常与final关键字结合使用,用来修饰成员变量和成员方法。
对于变量,若使用static final修饰,该变量不可被修改,随着类的加载而被创建,只创建一次,能通过类名访问。
对于方法,若使用static final修饰,该方法不可被重写,随着类的加载而被调用,能通过类名访问。
instanceof有什么作用?
答:instanceof关键字的作用是判断一个引用类型的变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例,即它左边的对象是否是它右边的类的实例,该运算符返回boolean类型的数据。
Java提供了几种数据类型?
答:8种。分别是byte(1)、boolean(1)、char(2)、short(2)、int(4)、long(8)、float(4)、double(8)。
常见笔试题:
- 下列表达式中,正确的是(D)
A.byte b=128; B.boolean flag=null;
C.float f=0.9239 D.long a=2147483648L
答案:D。A中byte能表示的取值范围为[-128,127],因此不能表示128。B中boolean的取值只能是true或false,不能为null。C中0.9239为double类型,需要进行数据类型转换。
String是最基本的数据类型吗?
答:不是。
int和Integer有什么区别?
答:int是Java语言的基本数据类型,Integer是Java语言为int提供的封装类,属于引用类型。
赋值语句float f=3.4是否正确?
答:不正确。数据3.4默认情况下是double类型,即双精度浮点数,将double类型数值赋值给float类型的变量,会造成精度损失,因此需要对其进行强制类型转换,即将3.4转换成float类型或者将3.4强制写成float类型。所以,float f=(float)3.4或者float f=3.4F写法都是可以的。
值传递和引用传递有哪些区别?
答:(1)值传递
在方法调用中,实参会把它的值传递给形参,形参只是用实参的值初始化一个临时的存储单元,因此形参与实参虽然有着相同的值,但是却有着不同的存储单元,因此对形参的改变不会影响实参的值。
(2)引用传递
在方法调用中,传递的是对象(也可以看作是对象的地址),这时形参与实参的对象指向同一块存储单元,因此对形参的修改就会影响实参的值。
在Java语言中,原始数据类型在传递参数时都是按值传递,而包装类型在传递参数时按引用传递的。
当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
答:是引用传递。
++i和i++有什么区别?
答:i++是在程序执行完毕后进行自增,而++i是在程序开始执行前进行自增。
常见笔试题
假设x=1.y=2,z=3,则表达式y+=z–/++x的值是(A)
A.3 B.3.5 C.4 D.5
char变量是否可以存储一个中文汉字?
答:在Java语言中,默认使用的是Unicode编码方式,即每个字符占用两个字节,因此可以用来存储中文。
如下哪个字串在Java中可作为自定义标识符(A)
A.$number B.super C.3number D.#number
如果获取系统当前的时间,请用代码演示。
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd hh-mm-ss”);
String s = sdf.format(new Date());
System.out.println(“当前系统时间为:”+s);
什么是标识接口?
没有声明任何方法的接口称之为标识接口。
为什么Java中有些接口没有任何方法?
答:由于Java不支持多继承,即一个类只能有一个父类,为了克服单继承的缺点,Java语言引入了接口这一个概念。接口是抽象方法定义的集合(接口中也可以定义一些常量值),是一种特殊的抽象类。接口中只包含方法的定义,没有方法的实现。接口中的所有方法都是抽象的。接口中成员的作用域修饰符都是public,接口中的常量值默认使用public static final修饰。由于一个类可以实现多个接口,因此通常可以采用实现多个接口的方式来间接达到多重继承的目的。
在Java语言中,有些接口内部没有声明任何方法,也就是说,实现这些接口的类不需要重写任何方法,这些没有任何方法声明的接口又被叫做标识接口,标识接口对实现它的类没有任何语义上的要求,它仅仅充当一个标识的作用,用来表明实现它的类属于一个特定的类型。这个标签类似于汽车的标志图标,每当人们看到一个汽车的标志图标时,就能知道这款汽车的品牌。Java类库中已存在的标识接口又Cloneable和Serializable等。在使用时会经常用instanceof来判断实例对象的类型是否实现了一个给定的标识接口。
构造器(constructor)是否可被重写(override)?
构造器可以被重载,不可以被重写
用最有效的方法算出2乘以8等于几?
左移3位
看下面的程序,给出结果:
public class foo{
public static void main(String[] args) {
String s;
System.out.println(“s=”+s);
}
}
结果:编译失败
再看下面的程序,给出结果:
public class foo{
static class s;
public static void main(String[] args) {
System.out.println(“s=”+s);
}
}
结果:s=null
分析:s是静态的,在main方法执行之前就被加载了,在加载的时候,系统给s赋了个初始值null
面试题:
数组有没有length()方法呢?字符串有没有length()方法呢?集合有没有length()方法呢?
答:数组有length属性,字符串有length()方法,集合没有size()方法。
什么是构造函数?什么是构造函数的重载?
方法名与类名完全一致,没有返回值。这样的函数叫构造函数。多个构造函数,同名不同参,称为构造函数的重载。
Error和Exception有什么区别?
Error 程序员处理不了问题,比如:内存溢出。
Exception 异常 程序员可以处理的问题。又分为编译期异常和运行期异常。
编译期异常必须处理,不然程序报错,编译无法通过;
运行期异常,我们可以进行处理,也可以不进行处理,这时代码不够严谨造成的,如果程序出现了问题,而我们又没进行任何处理,最终JVM会做出默认处理。
列出一些你常见的运行时异常
ClassCastException 类型转换异常
ClassNotFoundException 类加载异常
NullPointerException 空指针异常
IndexOutOfBoundsException 角标越界异常
ArithmeticException 算术异常
方法重写和方法重载的区别?方法重载能改变返回值类型吗?
方法重写:在子类中,出现和父类中一模一样的方法声明的现象。
方法重载:同一个类中,出现的方法名相同,参数列表不同的现象。
方法重载能改变返回值类型,因为它和返回值类型无关。
Override:方法重写
Overload:方法重载
this关键字和super关键字分别代表什么?以及他们各自的使用场景和作用。
this:代表当前类的对象引用
super:代表父类存储空间的标识。(可以理解为父类的引用,通过这个东西可以访问父类的成员)
场景:
成员变量:
this.成员变量
super.成员变量
构造方法:
this(…)
super(…)
成员方法:
this.成员方法
super.成员方法
什么是OSI,请简单谈一下。
答:OSI,Open System Interconnect 开放系统互连参考模式。简称它为网络模型,分为7层:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。
什么是网络编程?
答:就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换的技术。网络编程三要素:IP地址、端口、协议。
每一台计算机都有一个唯一的标识,就是IP地址,通过IP地址找到了你这台计算机,但是我的电脑上有qq,eclipse,飞q等多款软件,你用qq发给我一个消息,但你为什么能直接找到我这台计算机上的qq,而不是eclipse?那足以说明我这台电脑上的所有应用程序,它也都会有一个标记,这个标记就是端口,说白了,它就是用来区分这台电脑上的每一个应用程序。找到这台电脑,然后区分这台电脑上的程序。我找到这台电脑,找到这款软件之后,我要怎么和它进行通信呢?这就是协议!下面的例子也很好的说明了这三要素:
IP地址属于网络层,由网路号段和主机号段组成。
TCP/IP协议属于传输层。
UDP和TCP/IP协议有什么区别?
答:UDP和TCP/IP协议都是通信协议,区别如下:
UDP把数据打包、数据传输大小限制在64k、不建立连接、速度快但不可靠。
TCP三次握手建立连接,数据传输大小没有限制,速度慢但可靠。
举例:UDP:发短信;TCP:打电话
下面的方法,当输入值为2的时候返回值是多少?()
public static int getValus(){
int result = 0;
switch(i){
case 1:
result = result + i;
case 2:
result = result + i*2;
case 3:
result = result + i*3;
}
return result;
}
结果:10。
GC是否为守护线程?(是)
答:java中有两种线程:用户线程和守护线程。
System类包含一些有用的类字段和方法,不能被实例化。
类字段有err、in、out。
方法有:gc(),exit(),currentTimeMillis(),
gc():运行垃圾回收器。如果你想回收垃圾,只需要调用System类中的gc()方法就可以了,(但是不要一直调,因为每一次的调用都会强制启动垃圾回收器,这样会耗费很多的系统资源,会与正常的java程序抢夺资源)执行gc()方法的时候会自动调用finalize()方法先释放自己的资源,再通过super.finalize()方法释放父类的资源。
exit():终止当前正在运行的java虚拟机。
存在使i + 1 < i的数?
答:会。int最大值加1就会变成int最小值。
不通过构造函数也能创建对象吗?
答:能。对象创建的几种方法:
1.使用new关键字 2.使用clone方法 3.反射机制 4.反序列化
其中1,3都会明确的显式的调用构造函数
2是在内存上对已有对象的影印 所以不会调用构造函数
4是从文件中还原类的对象 也不会调用构造函数
创建对象有几种方式?
答:使用new关键字,使用clone方法,使用反射机制,使用反序列化。
Java多线程中调用wait()和sleep()方法有什么不同?
答:sleep():属于Thread类;必须指定时间;不释放锁;不需要被外接唤醒。
wait():属于Object类;可以不指定时间,也可以指定时间;释放锁;需要被外界唤醒。
数据库的索引和约束是什么?
答:索引就是一个指向表中数据的指针,如果我们把书比作数据,那么各个章节就相对于数据库中的表,而书的目录就是索引了。
约束的用途是限制用户输入到表中的数据的值的范围,一般分为列级约束和表级约束两种。
&和&&的区别?
&是位与 &&是逻辑与
用最有效率的方法计算2乘以8?
答: 2 << 3(左移3位相当于乘以2的3次方,右移3位相当于除以2的3次方)
String和StringBuilder、StringBuffer的区别?
String 是定长字符串,里面的内容不可被修改
StringBuffer和StringBuilder是变长字符串,里面的内容可以被修改
StringBuffer 线程安全,效率低
StringBuilder 线程不安全,效率高
抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?
答:都不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。本地方法是由本地代码(如C代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。
阐述静态变量和实例变量的区别。
答:静态变量是被static修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存。
是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
答:不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,在调用静态方法时可能对象并没有被初始化。
String s = new String(“xyz”);创建了几个字符串对象?
答:一个或两个对象,如果方法区的常量池中包含字符串常量”xyz”,就创建一个对象;如果方法区的常量池中不包含字符串常量”xyz”,就创建两个对象。
接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concrete class)?
答:接口可以继承接口,而且支持多重继承。抽象类可以实现(implements)接口,抽象类可继承具体类也可以继承抽象类。
override和overload的区别。
答:方法的重写和方法的重载。
方法重写:
在子类中,出现和父类中一模一样的方法声明的现象。
方法重载:
同一个类中,出现的方法名相同,参数列表不同的现象。
方法重载能改变返回值类型,因为它和返回值类型无关。方法的重写不可改变返回值类型。