Java基础知识—基础概念
- 基础概念
- 1.1 Java语言有哪些优点?
- 1.2 Java和C/C++的异同点?
- 1.3为什么需要public static void main(String[] args)这个方法?
- 1.4如何实现在main()方法执行前输出"Hello World!"
- 1.5 Java程序初始化顺序
- 1.6 Java中的作用域
- 1.7一个Java文件中是否可以定义多个类?
- 1.8构造函数
- 1.9为什么Java中有些接口没有任何方法?
- 1.10 Java中clone方法的作用
- 1.11反射机制
- 1.12 package有什么作用
- 1.13 如何实现类似于C语言中函数指针的功能?
基础概念
1.1 Java语言有哪些优点?
- java是纯面向对象的语言;
- 平台无关性;由于Java是解释型语言,编译器会把Java代码编译成字节码,然后再JVM中解释执行,可以跨平台执行,具备较好的移植性;
- Java提供了许多内置类库,简化了程序设计的操作,例如,Java语言对于多线程的支持,垃圾回收器等等;
- 提供了对于Web应用开发的支持;
- 具有较好的安全性和健壮性,例如:数组边界检测和Bytecode校验,此外java的强类型机制、垃圾回收器、异常处理和安全检查机制提供了良好的健壮性;
- 比C++更加严谨简洁;
1.2 Java和C/C++的异同点?
二者都采用了面向对象的思想(封装、继承、多态),二者都有很好的可用性;
不同点:
- Java是解释型语言,经过编译器翻译成字节码,由JVM解释执行;Java执行速度比C++慢,但是能够跨平台执行,C/C++不行;
- Java纯面向对象,所有代码必须在类中实现,基本数据类型除外;Java中不存在全局变量或全局函数;
- Java语言中没有指针概念;
- Java语言不支持多继承,通过实现多个接口,因为接口具有多态性,从而达到多继承的目的;
- Java语言中提供了垃圾回收器来实现垃圾的自动回收,java语言中没有析构函数,当垃圾回收器将要释放无用对象的内存时,会首先调用该对象的finalize()方法;
- Java具备平台无关性,每种数据类型都分配固定长度,不支持运算符重载,提供了对于内建稳定的内建支持;
1.3为什么需要public static void main(String[] args)这个方法?
public static void main(String[ ] args)是Java程序的入口方法,首先要查找main()方法;
public 是权限修饰符,static是静态方法,返回值为void
- public和static没有先后顺序
- main方法可以定义为final;
- 可以用synchronized来修饰main方法;
- 每个类中都可以定义main()方法,但是只有与文件名相同的用public修饰的类中的main()方法才能作为整个程序的入口方法;
1.4如何实现在main()方法执行前输出"Hello World!"
Java语言中,静态块在类被加载的时候就会被调用,因此可以在main()方法执行前,利用静态块实现输出"Hello World"功能
public class Test{
static{
System.out.println("Hello World1");
}
public static void main(String[ ] args){
System.out.println("Hello World2");
}
}
1.5 Java程序初始化顺序
Java中实例化对象时,要初始化类中的成员变量,遵循三个原则(优先级递减):
- 静态对象优先于非静态对象(可以初始化多次)
- 父类优先于子类进行初始化;
- 按照成员变量定义顺序进行初始化;
1.6 Java中的作用域
Java中,作用域是有花括号的位置决定,决定了定义变量的可见性和生命周期;
- 成员变量:类被实例化时,成员变量就会在内存中分配空间并进行初始化;
- 静态变量(staic修饰):被所有实例共享,只要被一个类加载,JVM就会给类的静态变量分配存储空间;
- 局部变量:作用域和可见性为它所在的花括号中;
当超类的实例方法或类方法是private时,是不能被子类调用的;
1.7一个Java文件中是否可以定义多个类?
一个Java文件中可以定义多个类,但是最多只有一个类被public修饰,并且这个类名和
文件名必须相同;采用javac编译.java文件的时候,会给每个类生成一个对应的.classs文件;
1.8构造函数
构造函数是用来在对象实例化时初始化对象的成员变量,在Java语言中,构造函数具有以下特点:
- 构造函数与类名相同,不能有返回值,也不能为void;
- 每个类可以有多个构造函数;
- 构造函数可以有0个、1个或者1个以上的参数;
- 构造函数总是伴随着new操作一起调用,不能由程序编写者直接调用;
- 主要作用是完成对象初始化;
- 子类可以通过super关键字来显式调用父类的构造函数;
- 当父类和子类都没有定义构造函数时,编译器会为父类生成一个默认的无参数的构造函数,给子类也生成一个默认的无参数的构造函数;
1.9为什么Java中有些接口没有任何方法?
接口是为了克服Java单继承的缺点,是抽象方法定义的集合,接口中成员作用域的修饰符都是public,常量默认使用是public static final修饰
Java中有些接口内部没有声明任何方法,这类接口被称为标识接口,例如Cloneable和Serializable等,使用时经常使用instanceof来判断对象的类型是否实现了一个给定的标识接口。
1.10 Java中clone方法的作用
Object提供了一个clone方法,返回一个Object对象的复制,复制函数返回的是一个新的对象而不是一个引用,使用clone()方法的步骤:
- 实现clone的类首先需要继承Cloneable接口,Cloneable接口实际上是一个标识接口;
- 在类中重写Object类中的clone()方法;
- 在clone中调用super.clone(),无论clone的类继承结构是什么,super.clone()都会直接或间接调用java.lang.Object中的clone()方法;
- 把浅复制的引用指向原型对象的克隆体;
浅复制和深复制有什么区别?
浅复制(Shallow Clone):浅复制仅仅复制所考虑的对象,而不是复制它所引用的对象;
深复制(Deep Clone):深复制把复制对象所引用的对象都复制了一遍
1.11反射机制
允许程序在运行时进行自我检查,同时允许对内部成员进行操作;
主要功能: 得到一个对象所属的类;获取一个类的所有成员变量和方法;在运行时创建对象;在运行时调用对象的方法;
如何获取一个class类?
- class.forName;
- 类名.class
- 实例.getClass();
Java创建对象的方式?
- 通过new语句实例化一个对象;
- 通过反射机制创建对象;
- 通过clone()方法创建一个对象;
- 通过反序列化的方式创建一个对象;
1.12 package有什么作用
package类似于Linux文件系统,从根开始有目录,文件,在目录中嵌套目录;
作用:
- 提供多层命名空间,解决命名冲突;
- 按功能进行分配,使项目的组织更加清晰;
1.13 如何实现类似于C语言中函数指针的功能?
Java中没有指针的概念,利用接口和类来实现。先定义一个接口,在接口中声明要调用的方法,接着实现这个接口,最后把这个实现类的一个对象作为参数传递给调用程序,调用程序通过这个参数来调用指定的函数,从而实现回调函数的功能。