1、Java语言有哪些优点?
1)Java为纯面向对象的语言。everything is object!
2)平台无关性。“一次编译,到处运行”。可以很好地跨平台执行,具有很好的可移植性。
3)Java提供了很多内置的类库,通过这些类库,简化了开发人员的程序设计工作,同时缩短了项目的开发时间。
4)提供了对web应用开发的支持。
5)具有较好的安全性和健壮性。Java语言经常被用在网络环境中,为了增强程序的安全性,Java语言提供了一个防止恶意代码攻击的安全机制(数组边界检测和bytecode校验等)。Java的强类型机制、垃圾回收器、异常处理和安全检查机制使得用Java语言编写的程序有很好的健壮性。
6)去除了C++语言中难以理解、容易混淆的特性。
Java语言是由C++语言改进并重新设计而来的。C++语言是一种静态数据类型检查的、支持多重编程范式的通用设计语言,它支持过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计等多种程序设计风格。
2、Java与C/C++有什么异同?
相同点:
都是面向对象语言,都使用了面向对象思想(如封装、继承、多态等),由于面向对象有许多非常好的特性(继承、组合等),因此二者都有很好的可重用性。
不同点:
不同点 | Java | C/C++ |
解释性语言,其运行过程为:程序源代码经过Java编译器编译成字节码,然后由JVM解释执行。 执行速度慢,能跨平台执行 | 编译型语言,源代码经过 编译和链接后生成可执行的二进制代码。 执行速度快,但不能跨平台执行 | |
纯面向对象语言,所有代码(包括函数、变量等)必须在类中实现,除基本数据类型外,所有类型都是类。 Java不存在全局变量或全局函数 | C++兼具面向过程和面向过程编程的特点,可以定义全局变量和全局函数 | |
Java没有指针,这有效防止了C/C++语言中操作指针引起的系统问题,从而使程序变得更加安全。 | 有指针 | |
Java不支持多重继承,但是引入了接口的概念,可以同时实现多个接口。由于接口也具有多态特性,因此在Java语言中可以通过实现多个接口来实现与C/C++语言中多继承类似的目的。 | 支持多重继承 | |
Java语言中提供了垃圾回收器来实现垃圾的自动回收,不需要程序显示地管理内存的分配。 Java语言中没有析构函数,却引入了一个finalize()方法,当垃圾回收器将要释放无用对象的内存时,会首先调用该对象的finalize()方法,因此开发人员不需要关心也不需要知道对象所占的内存空间何时会被释放。 | 需要开发人员去管理对内存的分配(包括申请与释放) C++语言中,通常都会把释放资源的代码放在析构函数中 |
不同点 | JAVA | C++ |
不支持运算符重载; 没有预处理,但提供import与C++中预处理器功能类似; 不支持默认函数参数; 不提供goto语句,但goto是保留关键字; 不支持自动强制类型转换,必须由开发人员显示强制转换; | 支持运算符重载; 支持默认函数参数; 支持goto语句; 支持自动强制类型转换,但会导致 程序的不安全; | |
平台无关性,每种数据类型都分配固定长度。 | 同一个数据类型在不同的平台上会分配不同的字节数 | |
包含了一些标准文档,用于完成特定的任务,同时这些库简单易用,能够大大缩短开发周期。 | C++则依靠一些非标准的、由其他厂商提供的库 |
下面说法中,错误的有( )
A. Java面向对象语言容许单独的过程与函数存在;
B. Java面向对象语言容许单独的方法存在;
C. Java语言中的方法属于类中的成员(member);
D. Java语言中的方法必定隶属于某一类(对象),调用方法与过程或函数相同。
答案:
ABC
解释:
方法与函数:这两个概念不严格区分,就是一个东西,通过对象调用的,就是方法,直接调用,就是函数;
在java中,everything is object 所以,方法,函数,必须隶属于某一个类或对象, java中没有过程。
(类中的代码块不知道算不算,就算代码块是过程,也是必须在类中才有的)
对于C选项,方法分为静态方法和非静态方法,静态方法属于类成员,非静态方法属于实例成员。
3、为什么需要public static void main(String[] args) 这个方法?
此方法为java程序的入口方法,jvm在运行程序时,会首先查找main()方法。其中public是权限修饰符,表明任何类或对象都可以访问这个方法,static表明是静态方法,及方法中的代码是存储在静态存储区的,只要类被加载后,就可以使用该方法,不需要通过实例化来访问,可直接通过类名.main()直接访问, jvm在启动时就是按照上诉方法的签名(必须有public和static修饰,返回值为void,且方法参数为字符串数组)来查找方法的入口地址,若找到就执行,找不到就会报错。void表明方法没有返回值,mian是jvm识别的特殊方法,名,是程序的入口方法。字符串数组参数args为开发人员在命令行状态下与程序交互提供了一种手段。
引申:
1、(1)public与static没有先后顺序关系
static public void mian(String[] args)
(2)也可以把main()方法定义为final
public static final void main(String[] args)
(3)也可以用syncchronized来修饰main()方法
static public synchronized void main(String[] args)
不管是哪种定义形式,都必须保证返回值为void,并有static和public关键字修饰,因为是入口函数,所以绝对不能用abstract关键字来修饰
2、同一个.java文件可以有多个main方法,但只有与文件名相同的用public修饰的类中的main()方法才能作为整个程序的入口方法
4、如何实现在main()方法执行前输出“hello world”?
众所周知,在Java语言中,main()方法是程序的入口方法,在程序运行时,最先加载的就是main()方法,但这并不意味着main()方法就是程序运行时第一个被执行的模块!!!
在Java语言中,由于静态块在类被加载时就会被调用,因此可以在main()方法执行前,利用静态块实现输出“hello world”的功能。由于静态块不管顺序如何,都会在main()方法之前执行。
5、Java程序初始化的顺序是怎样的?
在Java语言中,当实例化对象时,对象所在类的所有成员变量首先要进行初始化,只有当所有类成员完成初始化后,才会调用对象所在类的构造函数创建对象。
Java程序的初始化顺序一般遵循三个原则(优先级依次递减):
①静态对象(变量)优先于非静态对象(变量)初始化,其中,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次。
②父类优先于子类进行初始化。
③按照成员变量的定义顺序进行初始化。即使变量定义散布于方法定义之中,它们依然在任何方法(包括构造函数)被调用之前先初始化。
Java程序初始化工作可以在许多不同的代码块中来完成(例如静态代码块、构造函数等),它们的执行顺序如下:父类静态变量、父类静态代码块、子类静态变量、子类静态代码块、父类非静态变量、父类非静态代码块、父类构造函数、子类非静态变量、子类非静态代码块、子类构造函数。
在Java中除了使用构造器类对单个对象进行初始化操作外,我们还可以通过初始化块来实现。
在一个类中可以有多个初始化块,相同类型的初始化块之间有顺序:
前面定义的初始化块先执行,后面定义的初始化块后执行。
使用static修饰的初始化块,称为静态初始化块,在初始化块中可以定义局部变量、调用其他对象的方法,以及使用分支、循环语句等。
静态初始化块:
执行优先级高于非静态的初始化块,它会在对象装载到系统的时候执行一次,执行完成便销毁,它仅能初始化类变量,即static修饰的数据成员。
非静态初始化块:
执行的时候如果有静态初始化块,先执行静态初始化块再执行非静态初始化块,在每个对象生成时都会被执行一次,它可以初始化类的实例变量。非静态初始化块会在构造函数执行时,在构造函数主体代码执行之前被运行。
package base;
class A{
static{
System.out.println("i am A static block!");
}
public A(){
System.out.println("i am A constructor!");
}
{
System.out.println("i am A block!");
}
}
public class B extends A{
static{
System.out.println(" I AM B STATIC BLOCK!");
}
{
System.out.println("I AM B BLOCK!");
}
public B(){
System.out.println("I AM B CONSTRUCTOR!");
}
public static void main(String[] args) {
// TODO Auto-generated method stub
new B();
}
}
运行结果:
i am A static block!
I AM B STATIC BLOCK!
i am A block!
i am A constructor!
I AM B BLOCK!
I AM B CONSTRUCTOR!