-
Java语言有哪些优点?
1.Java是纯面向对象的语言 2.平台无关性。Java解释性语言,编译器对Java代码进行编译,生成字节码文件,然后由JVM(Java 虚拟机)上解释执行。 3.Java提供了需要内置的类库。例如对多线程的支持。 4.具有较好的安全性和健壮性。Java中提供了一个防止恶意代码攻击的安全机制。另外,还提供了异常处理,垃圾回收器等来保证程序的健壮性。 5.提供了对Web应用开发的支持。例如Servlet,JSP可以用来开发Web应用程序。Socket,RMI可以用来开发分布式应用程序的类库。 6.去除了C++语言中,难以理解、容易混淆的特性。如指针,头文件,多重继承等。
-
Java与C/C++有什么异同
1.Java为解释性语言。而C/C++为编译型语言,源代码经过编译和链接后生成可执行的二进制代码。 2.Java为纯面向对象语言,C++兼具过程和面向过程编程的特点。 3.Java没有指针的概念 4.Java提供了垃圾回收器来实现垃圾的自动回收。C++语言中,需要开发人员去管理对内存的分配(包括申请与释放)。 5.Java不支持运算符重载,没有预处理器,不提供goto语句(但在Java中goto是保留关键字),具有平台无关性。
-
为什么需要public static void main(String[] args)这个方法?
◦public static void main(String[] args)是java程序的入口方法,JVM在运行程序时,会先查找main()方法。通常来说,要执行一个类的方法,需要先实例化一个类的对象,通过这个对象来调用方法。
鉴于此,main()的修饰符是public static ,静态方法,在程序加载时,便可以调用main方 -
Java程序初始化的顺序是怎样的?
◦在Java语言中,当实例化对象时,对象所在类的所有成员变量首先要进行初始化,只有所有类成员变量完成初始化之后,才会调用对象所在类的构造函数创建对象。 ◦执行顺序如下:父类静态变量,父类静态代码块,子类静态变量,子类静态代码块,父类非静态变量,父类非静态代码,父类构造函数,子类非静态变量,子类非静态代码块,子类构造函数。
-
Java中的作用域有哪些?
- 首先说明Java中不存在全局变量或全局函数
- 在Java语言中,变量的类型分三种:成员变量,静态变量,局部变量。
- 成员变量的作用范围与类的实例化对象的作用范围相同。成员变量也有4种作用域,对应的修饰符有public(所有可见),private(当前类可见),protected(当前类,同一个package,子类可见),default(当前类,同一package可见)
- 静态变量,不依赖于特定的实例,而是被所有实例所共享,也就是说,只要一个类被加载,JVM就会给类的静态变量分配存储空间。
- 局部变量的作用域,在它所在的花括号内。
-
- 需要注意的是,public,private,protected,default只能用来修饰成员变量,不能修饰局部变量。private与protected不能用来修饰类,只有public,abstract,fianl能用来修饰类
-
什么是构造函数?
- 构造函数是一直特殊的函数,用来在对象实例化时,初始化对象的成员变量。
- 在Java语言中,构造函数有以下特点
- 构造函数必须与类的名字相同,并且不能有返回值(返回值也不能是void)。
- 每个类可以有多个构造函数。
- 构造函数可以有0个、1个或者1个以上的参数。
- 构造函数总是伴随new操作一起调用,且不能由程序的编写者直接调用,必须要由系统调用。
- 构造函数的主要作用是完成对象的初始化工作
- 构造函数不能被继承, 因此不能被覆盖,但是构造函数能够被重载,可以使用不同的参数个数或者参数类型来定义多个构造函数。
- 当父类和子类都没有构造函数时,编译器会为父类和子类生成一个默认的无参数的构造函数。
- 子类可以通过super关键词来显式地调用父类的构造函数。
-
为什么Java中有些接口没有任何方法?
- 首先说一下接口,在java中由于不支持多重继承,java引入接口这一概念。接口是抽象方法定义的集合(也定义一些常量),是一种特殊的抽象类。接口中的成员的作用域修饰符都是public,接口中的常量值默认使用public static final修饰。
- 在java语言中,有些接口内部没有声明任何方法,这类接口叫做标识接口。标识接口对实现它的类没有什么语义要求,仅仅充当一个标识的作用,用来表明实现它的类属于一个特定类型。Java类库中已存在的标识接口有Cloneable和Serializable等。在使用时经常用instanceof来判断实例对象的类型是否实现了一个给定的标识接口。
-
Java中clone方法有什么作用?
- Java语言取消了指针的概念,但这只是Java语言中没有明确提供指针的概念与用法,而实质上每个new语句返回的都是一个指针的引用。
- 在实际编程中,经常会遇到从某个已有的对象A创建出另外一个与A具有相同状态的对象B,并且修改B不会影响到A的状态。这仅仅通过简单的赋值操作显然无法实现,而Java中提供了clone()方法来满足这个需求。
- Java中所有类都默认继承Object类,而Object类中提供了一个clone()方法,这个方法的作用是返回一个Object对象的复制。这个复制函数返回的是一个新的对象而不是一个引用。
- 使用clone()方法的步骤:
- 实现clone的类首先需要继承Cloneable接口。Cloneable接口实质上是一个标识接口,没有任何接口方法
- 在类中重写Object类中的clone()方法
- 在clone方法中调用super.clone()。
- 把浅复制的引用指向原型对象的新的克隆体。(当类中包含一些对象时,就需要用到深复制)
- 浅复制仅仅复制所考虑的对象,深复制把复制的对象所引用的对象都复制了一遍。
- Prototype(原型)模式中,就需要clone一个对象实例
-
什么是反射机制?
- 反射机制是Java语言中一个非常重要的特性,它允许程序在运行时进行自我检查,也允许对其内部的成员进行操作。
- 反射机制提供的功能主要有:得到一个对象所属的类;获取一个类的所有成员变量和方法;在运行时创建对象;在运行时调用对象的方法。
- 在反射机制中,Class是一个非常重要的类。获取方法有三个:1)Class.forName("类的路径");2)类名.Class;3)实例.getClass()。
-
如何实现类似于C语言中函数指针的功能?
- 回调函数,就是指函数先在某处注册,而它将在稍后某个需要的时候被调用
- 回调函数一般用于截获消息,获取系统信息或处理异步事件。
- 在Java中可以利用接口与类来实现同样的效果。
- 策略模式 也是用到这样的思想。
- 代码:
1 interface IntCompare { 2 public int cmp(int a, int b); 3 } 4 class Cmp1 implements IntCompare { 5 public int cmp(int a, int b) { 6 if (a > b) 7 return 1;// a大于b 8 else if (a < b) 9 return -1; 10 else 11 return 0; 12 } 13 } 14 class Cmp2 implements IntCompare { 15 public int cmp(int a, int b) { 16 if (a > b) 17 return -1; 18 else if (a < b) 19 return 1;// a小于b 20 else 21 return 0; 22 } 23 } 24 public class Test2018415 { 25 public static void insertSort(int[] a, IntCompare cmp) { 26 if (a != null) { 27 for (int i = 1; i < a.length; i++) { 28 int temp = a[i]; 29 int j = i; 30 if (cmp.cmp(a[j - 1], temp) == 1) { 31 while (j >= 1 && cmp.cmp(a[j - 1], temp) == 1) { 32 a[j] = a[j - 1]; 33 j--; 34 } 35 } 36 a[j] = temp; 37 } 38 } 39 } 40 public static void main(String[] args) { 41 int[] array1 = { 7, 3, 19, 40, 4, 7, 1 }; 42 insertSort(array1, new Cmp1()); 43 System.out.println("升序排序:"); 44 for (int i = 0; i < array1.length; i++) { 45 System.out.print(array1[i] + " "); 46 } 47 System.out.println(); 48 int[] array2 = { 7, 3, 19, 40, 4, 7, 1 }; 49 insertSort(array2, new Cmp2()); 50 System.out.println("降序排序:"); 51 for (int i = 0; i < array2.length; i++) { 52 System.out.print(array2[i] + " "); 53 } 54 } 55 }