问题记录
问题 一:一个.java
文件里面可以有多个class
,但是最多只能有一个“public class
”,为什么?
答:因为.java
文件在经过JVM编译时,这个public class
将作为一个单一的公共接口。若存在多个public class
,编译器将会报错;若不存在public class
,编译器会生成多个. class
文件。简而言之,public class
是提供给编译器的一个标识,告诉编译器程序的入口在哪里,以便于编译器可以处理存在多个类的java文件,所以只能有一个。
问题 二:Java的基本数据类型是?
答:Java的基本数据类型一共有八种,分别为四种整数类型(byte、short、int、long)
、两种浮点数类型(float、double)
、一种字符类型(char)
、一种布尔类型(boolean)
;根据这八种基本数据类型又对应了Java中内置的八种包装类,分别为Byte、Short、Integer、Long、Float、Double、Character、Boolean
。注意,这八种包装类都是Object
类型。
问题 三:StringBuffer(String s)
的实体容量?
答:StringBuffer(String s)
在创建时可以指定给对象的实体的初始容量为参数字符串s的长度额外再增加16个字符。
问题 四:什么叫Socket?怎样建立socket连接?
答:Socket又称为套接字,它是计算机之间进行通信的一种约定或一种方式。通过 socket 这种约定,一台计算机可以接收其他计算机的数据,也可以向其他计算机发送数据。在C/S结构中建立socket连接,要分别在客户端和服务器上创建socket对象,客户端socket用来向服务器发送连接请求,服务器端ServerSocket用来和进行请求的客户端进行连接。在Java中建立socket连接很简单,没有C/C++中复杂,大致的步骤就是建立socket对象进行客户端和服务器端的连接通信,之后根据需求创建流对象可以是输入输出流或视频或图像流对象,进行简单的IO交互,最后关闭socket对象和流对象即可。注意这里可以使用不同的类来创建是基于TCP或UDP协议的网络程序。
问题 五:接口和抽象类的区别?
答:接口是对动作的抽象,表示的是这个对象能做什么动作,而抽象类是对根源的抽象,表示的是这个对象能做什么。它们都不能直接被实例化,若要实例化抽象类变量必须指向实现所有抽象方法的子类对象,而接口变量必须指向实现所有接口方法的类对象。抽象类要被子类继承,而接口要被类实现。接口中只能做方法的声明,抽象类中可以做方法的声明,也可以做方法的实现。接口中定义的变量只能是公共的静态的常量,抽象类中的变量是普通变量。抽象类里的抽象方法必须全部被子类所实现,如果子类不能全部实现父类抽象方法,那么该子类只能是抽象类。同样实现接口的时候,如不能全部实现接口方法,那么该类也只能为抽象类。抽象方法只能声明,不能实现,抽象类里可以没有抽象方法。接口是设计的结果 ,抽象类是重构的结果。如果一个类里有抽象方法,那么这个类只能是抽象类。抽象方法要被实现,所以不能是静态的,也不能是私有的。接口可继承接口,并可多继承接口,但类只能单根继承。这也是Java中实现多重继承的方法。抽象类和接口都是用来抽象具体对象的,但是接口的抽象级别最高。
问题 六:抽象类的构造函数存在的意义?
答:抽象类中的构造方法其实是给实现该抽象类的子类对象进行初始化的。因为在面向对象编程语言中,初始化一个类,无论该类是不是抽象类,都会先调用其父类的构造方法,进行初始化父类。在java中可以使用super关键字在子类的构造方法中,调用父类的有参构造方法。简而言之,抽象类是一个特殊的类,只要是类都有构造函数,只不过这个构造函数生效的时间不一样。
问题 七:包装类有何意义?
答:包装类是将基本类型包装成Object引用类型,总共有八类(Boolean、Byte、Short、Character、Integer、Long、Float、Double),它的特点是会自动装箱和自动拆箱。因为在面向对象开发中,有时基本类型会参与到开发中,但是在Java中基本类型是以值的形式保存在内存中,而不是以引用类型,所以不能参与到面向对象开发,这时就需要使用包装类对基本类型进行装箱。包装类有五大特点,①包装类提供了一些常数,例如:Integer.MAX_VALUE
(整数的最大值)、Double.NaN
(非数字)、Double.POSITIVE_INFINITY
(正无穷)。②提供了从字符串转换或转换成字符串的方法(valueOf(String) toString()
)。③通过xxxValue()方法可以得到所包装的值。④对象中所包装的值是不可改变的,要改变对象中的值就只有重新生成新的对象。⑤toString()、equals()等方法进行了覆盖
问题 八:final关键字?
答:在Java中,final关键字可以用来修饰类、方法和变量(包括成员变量和局部变量)。final关键字与static关键字进行组合使用时,会将变量变成常量。当final修饰类时,表明这个类不能被继承,final修饰的类中的所有成员方法都会被隐式地指定为final方法,该类中的成员变量可以根据需要设为final。使用final修饰方法的原因主要有两点,第一点是把方法锁定,以防任何继承类修改它的含义;第二点是效率。(注意:类的private方法会隐式地被指定为final方法)使用final修饰变量时,对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能再更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
问题 九:C/S结构、B/S结构的优缺点,它们有什么特点?
答:C/S结构是客户端+服务器+DB
的结构模式,它的特点是数据库只负责数据库的管理、应用服务器只负责业务逻辑、客户端只负责界面操作。优点是适合大型应用,缺点是需要单独安装客户端,客户端还需独立开发,定义协议,比较复杂。B/S结构是浏览器+服务器+DB
的结构模式,它的特点是数据库只负责数据库的管理、Web服务器只负责业务逻辑、浏览器负责界面操作。它的优点是不用装客户端了,只要有浏览器既可以,缺点是浏览器的一些局限性。
问题 十:重载和重写的区别?
答:方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数或类型。重载是多态性的一种表现。Java中的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法。重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想做一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。
常用方法补充
1、数组元素复制
数组元素复制可以使用Java.lang.System类的arrayCopy()方法,方法如下:
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
参数解释:src:源数组;srcPos:源数组下标;dest:目的数组;destPos:目的数组下标;length:需要复制几个数组。
方法作用:复制源数组中从下标srcPos开始的length个元素到目的数组,从下标destPos的位置开始存储。
注意:数组复制的常用方法有四种:
- for循环复制,效率最低
- System.arraycopy() 效率最高
- Arrays.copyOf() 效率次于第二种方法
- Object.clone() 效率次于第二种和第三种
2、数组的排序和数组的查找
在Java中的数组排序,除去我们自己定义的方法之外,可以使用Java中提供给我们的sort
方法,方法示例如下:
int array[]={
2,5,-9,33,22,11,56,-3};
Arrays.sort(array);
//排序结果:-9,-3,2,5,11,22,33,56
对于数组元素的查找,可以使用binarySearch()
方法来查找数组中的元素,方法示例如下:
int array[]={
2,5,-9,33,22,11,56,-3};
int index = Arrays.binarySearch