目录
五、什么是Java程序的主类?应用程序和小程序的主类有何不同?
十一、String、StringBuffer和StringBuilder的区别是什么?为什么String是不可变的?
十八、创建一个对象用什么运算符?对象实体与对象引用有什么不同?
十九、一个类的构造方法的作用是什么?若一个类没有声明构造方法,该程序能正确执行吗?为什么?
二十三、在调用子类构造方法之前会先调用父类没有参数的构造方法,其目的是?
二十六、简述线程、程序、进程的基本概念,以及它们之间的关系是什么?
一、面向对象和面向过程的区别
- 面向过程:面向过程性能比面向对象高。因为类调用时需要实例化,开销比较大,比较耗费资源,所以当性能是最重要考量因素的时候,比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发。但是,面向过程没有面向对象易维护、易复用、易扩展。
- 面向对象:面向对象易维护、易复用、易扩展。因为面向对象有封装、继承、多态的特性,所以可以设计出低耦合的系统,使得系统更加灵活,更加易于维护。但是,面向对象性能比面向过程低。
- c和c++就是很好的例子,两种语言执行效率差距其实并不大,但是两种语言的设计思想就不同。
- 面向过程也需要分配内存,计算内存偏移量,Java性能差的主要原因并不是因为它是面向对象语言,而是Java是半编译语言,最终执行代码并不是直接被CPU执行的二进制机械码。而面向过程语言大多都是直接编译成机械码在电脑上执行,并且其他一些面向过程的脚本语言性能也并不一定比Java好。
二、Java语言有哪些特点?
1、面向对象(封装、继承、多态);
2、平台无关性,一次编译、多处运行(Java虚拟机实现平台无关性);
3、可靠性、安全性;
4、支持多线程;
5、支持网络编程;
6、编译与解释并存。
三、关于JVM、JDK、JRE详细通俗的解答
1、JVM
Java虚拟机(JVM)是运行Java字节码的虚拟机。JVM有针对不同系统的特定实现,目的是使用相同的字节码,它们都会给出相同的结果。
(1)什么是字节码?采用字节码的好处是什么?
在Java中,JVM可以理解的代码叫做字节码(即扩展名为.class的文件),它不面向任何特定的处理器,只面向虚拟机。Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可以指的特性。所以Java程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java程序无需重新编译便可在多种不同操作系统的计算机上运行。
(2)Java程序从源代码到运行一般有下面三步:
(3)总结
Java虚拟机是运行Java字节码的虚拟机。JVM有针对不同系统的特定实现,目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的JVM实现是Java语言“一次编译,多次运行”的关键所在。
2、JDK、JRE
JDK(Java Development Kit),是功能齐全的Java SDK。它拥有JRE所拥有的一切,还有编译器(javac)和工具(如javadoc和jdb)。它能够创建和编译程序。
JRE 是Java运行时环境,它时运行已编译Java程序所需的所有内容的集合,包括Java虚拟机、Java类库、Java命令和其他的一些基础构件。但是,它不能用于创建新程序,只能运行。
如果你只是为了运行一下Java程序的话,那么你只需要安装JRE就可以了。如果你需要进行一些Java编程方面的工作,那么你就需要安装JDK了。但是这不是绝对的,有时,即使不打算再计算机上进行开发Java,仍然需要安装JDK;例如,你要使用JSP部署Web应用程序,那么从技术上讲,你只是在应用程序服务器中运行Java程序,那么为什么还需要JDK呢,因为应用程序服务器会将JSP转换为JavaServlet,并且需要使用JDK来编译servlet。
四、Java 和 C++ 的区别
1、都是面向对象的语言,都支持封装、继承、多态;
2、Java不提供指针来直接访问内存,程序内存更加安全;
3、Java的类是单继承的,C++支持多重继承;虽然Java的类不可以多继承,但是接口可以多继承。
4、Java有自动内存管理机制,不需要程序员手动释放内存;
5、在C语言中,字符串或字符数组最后都会有一个额外的字符“\o”来表示结束。但是Java语言中没有结束这个概念。
五、什么是Java程序的主类?应用程序和小程序的主类有何不同?
一个程序中可以有多个类,但是只能有一个主类。在Java应用程序中,这个主类是指包含main()方法的类。而在Java小程序中,这个主类是一个继承自系统类JApplet或者Applet的子类。应用程序的主类不一定要求是public类,但小程序的主类要求必须是public类。主类是Java程序执行的入口点。
六、Java应用程序与小程序之间有哪些差别?
简单说,应用程序是从主线程启动(也就是main()方法)。applet小程序没有main()方法,主要是嵌在浏览器页面上运行(调用init()或者run()来启动),嵌入浏览器这点跟flash的小游戏类似。
七、字符型常量和字符串常量的区别?
1、形式上:字符常量是单引号引起的一个字符;字符串常量是双引号引起的若干字符;
2、含义上:字符常量相当于一个整型值(ASCII值),可以参加表达式运算;字符串常量代表一个地址值;
3、占内存大小:字符常量只占2个字节;字符串常量占若干字节(char在Java中占两个字节)。
八、构造器Constructor是否可被override?
Constructor不可被override(重写),但是可以overload(重载),所以你可以看到一个类中有多个构造函数的情况。
九、重载和重写的取别?
1、重载
发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同、方法返回值和访问修饰符可以不同。
2、重写
重写是子类对父类的允许访问的方法的实现过程进行重新编写,发生在子类中,方法名、参数列表必须相同返回值范围小于等于父类,抛出的异常小于等于父类,访问修饰符范围大于等于父类。另外,如果父类方法访问修饰符为private,则子类就不能重写该方法。也就是说,方法提供的行为改变,而方法的外貌并没有改变。
十、Java面向对象编程三大特性:封装、继承、多态
1 封装
封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法;如果一个类中没有提供给外界访问的方法,那么这个类也没有什么意义了。
2 继承
继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但是不能选择性的继承父类。通过使用继承我们能够非常方便地复用以前地代码。
继承关键点:
1、子类拥有父类对象所有地属性和方法(包括私有属性和私有方法),但是父类中地私有属性和方法子类是无法访问的,只是拥有。
2、子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
3、子类可以用自己的方式实现父类的方法。
3 多态
所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是那个类中实现的方法,必须在由程序运行期间才能决定。
在Java中有两种方式可以实现多态:继承(多个子类对同一个方法的重写)和接口(实现接口并覆盖接口中同一方法)。
十一、String、StringBuffer和StringBuilder的区别是什么?为什么String是不可变的?
1、可变性
简单来说,String类中使用final关键字修饰字符数组来保存字符串,即private final char value[],所以String对象是不可变的;(Java 9 之后,String类的实现改用byte数组来存储字符串,即private final byte[] value)。
而StringBuffer与StringBuilder都是继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组来保存字符串char[] value,但是并没有用final关键字修饰,所以这两种对象都是可变的;StringBuffer与StringBuilder的构造方法都是调用AbstractStringBuilder父类的构造方法实现的。
2、线程安全性
String中的对象是不可变的,也就是可以理解为常量,线程安全;
AbstractStringBuilder是StringBuffer与StringBuilder的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法,
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的;
StringBuilder并没有对方法加同步锁,所以是非线程安全的。
3、性能
每次对String类型进行改变的时候,都会生成一个新的String对象,然后讲指针指向新的String对象;
StringBuffer每次都会对StringBuffer对象本身操作,而不是生成新的对象并改变引用;
相同情况下,使用StringBuilder相比使用StringBufferr仅能获得10%-15%的性能提升,但却要冒多线程不安全的风险。
4、对于三者使用的总结
(1)操作少量的数据,适用String;
(2)单线程操作字符串缓冲区下操作大量数据,适用StringBuilder;
(3)多线程操作字符串缓冲区下操作大量数据,适用StringBuffer。
十二、自动装箱与拆箱
1、装箱
将基本类型用他们对应的引用类型包装起来。
2、拆箱
将包装类型转换为基本数据类型。
深入剖析Java中的装箱和拆箱 - Matrix海子 - 博客园 (cnblogs.com)
十三、在一个静态方法中调用一个非静态成员为什么是非法的?
由于静态方法可以不通过对象进行调用,因此在静态方法中不能调用其他非静态变量,也不可以访问非静态变量成员。