简答题

1.什么是方法的重载,重载对方法的返回值和访问修饰符有什么要求

方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数.
重载对方法的返回值和访问修饰符没有要求.

2.将a,b两个数进行交换位置

第一种方式:使用中间变量交换(实际开发用)
	int temp = a; 
	a = b;
	b = temp; 
第二种方式:异或(面试用)
	a = a^b;
	b = a^b;//b = a^b^b
	a = a^b;//a = a^a^b
第三种方式:加减法(a+b可能会超过int的范围) 
	a = a+b;
	b = a-b;
	a = a-b;
第四种方式:一句话实现
	b = a+b-(a=b);

3.拥有静态成员的内部类一定是静态内部类吗,如果不是请举例说明

拥有静态成员的内部类一定是静态内部类
Java内部类:
	实例内部类
		(1) 实例内部类的实例化方式要依靠外部类的实例来创建
			A.C c = new A().new C();
			相当于 
			A a = new A(); A.C c = a.new C();
		(2) 实例内部类中不能够定义静态成员
		(3) 如果实例内部类C中和外部类A中有同名的参数,则
			就近原则 	this.ai 代表C的 	A.this.ai 代表A的
		(4) 实例内部类中可以访问到外部类的所有成员
		(5) 每一个实例内部类的实例都只对应一个外部类的实例,一个外部类的实例可以对应多个内部类的实例
	静态内部类
		(1) 静态内部类中可以直接访问外部类的静态成员,如果要访问外部类的实例成员,需要通过外部类的实例去访问
		(2) 静态内部类的实例化方式
			A.B a = new A.B();
		(3) 静态内部类中可以定义静态成员,也可以定义实例成员
		(4) 可以通过类名直接调用静态内部类中的静态成员
	局部内部类
		(1) 局部内部类不能够使用权限修饰符(public、private、protected)以及static
		(2) 局部内部类中不可以定义静态成员
		(3) 局部内部类中可以访问到外部类的所有成员,可以访问到外部类的final修饰的变量
		(4) 局部内部类的作用范围在当前方法内,如果要使用必须声明在类定义之下,外部类无法创建局部内部类的实例
	匿名内部类
		(1) 匿名内部类的使用方式,new 接口/抽象类(){ 实现其中未实现的方法 }
		(2) 匿名内部类是唯一一个没有构造器的类
		(3) 匿名内部类不可以拥有静态成员
		(4) 可以访问外部类的所有成员
		(5) 一般用作放在方法的参数中,只使用一次的那种
访问特点
	内部类可以直接访问外部类的成员,包括私有成员.
	外部类要访问内部类成员,必须要建立内部类的对象.
创建内部类对象格式
	外部类名.内部类名 对象名 = new 外部类型().new 内部类型();
内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号
	比如 Person$Man.class

4.抽象方法是否可以被static关键字修饰,请说明原因

定义抽象方法的目的是重写此方法,但如果定义成静态方法就不能被重写;
java中抽象类中的抽象方法不可以使用static 构成静态抽象方法,抽象类是不能实例化的,即不能被分配内存;而static修饰的方法在类实例化之前就已经别分配了内存,这样一来矛盾就出现了:抽象类不能被分配内存,而static方法必须被分配内存。所以抽象类中不能有静态的抽象方法。

5.在java中什么是泛型的上限和下限,请使用List接口声明局部变量的方式来说明该问题

extends 是泛型的上限,super 是泛型的下限
向下限定:	
	List<? extends Object> list = new ArrayList<>();
	泛型只能为Object或者Object的子类
向上限定:
	List<? super String> list = new ArrayList<>();
	泛型只能为String或者String的父类

6.抽象类中是否允许构造器的重载,接口是否也允许构造器的重载,接口中是否允许存在静态方法

抽象类中不允许构造器的重载
接口中没有构造器,所以不存在构造器的重载
Java8对接口做了进一步的增强,接口里可以声明静态方法,并且可以实现

7.请对下面的数组进行扩容,要求是原来的2倍
int[] arr = {3,4,6,8};

int[] arr1 = Arrays.copyOf(arr, arr.length*2);//方法一
arr = arr1;
int[] arr2 = new int[arr.length*2];//方法二
System.arraycopy(arr, 0, arr2, 0, arr.length);
arr = arr2;

8.java中常见的类加载器有哪些,它们分别的作用是什么

引导(Bootstrap)类加载器
	作用:负责加载核心Java库,存储在<JAVA_HOME>/jre/lib目录中。
	由原生代码(如C语言)编写,不继承自java.lang.ClassLoader。
扩展(Extensions)类加载器
	作用:用来在<JAVA_HOME>/jre/lib/ext,或java.ext.dirs中指明的目录中加载Java的扩展库。
		 Java虚拟机的实现会提供一个扩展库目录。
		 该类加载器在此目录里面查找并加载Java类。
	该类由sun.misc.Launcher$ExtClassLoader实现。
Apps类加载器(也称系统类加载器)
	作用:根据Java应用程序的类路径(java.class.path或CLASSPATH环境变量)来加载Java类。
		 一般来说,Java 应用的类都是由它来完成加载的。
		 可以通过ClassLoader.getSystemClassLoader()来获取它。
	该类由sun.misc.Launcher$AppClassLoader实现。

9.假如T1线程和T2线程出现了死锁的状况,那么请说明该状态下,线程和锁的持有情况

有两个锁,T1线程锁住第一个,T2线程锁住了第二个,同时T1试图锁第二个,失败,因为T2已经锁住了,T1只能等待.就在这时T2试图锁第一个,结果失败,因为T1已经锁住了,T2只好等待

10.==与equals的区别是什么

(1) ==是关系运算符,equals()是方法,结果都返回布尔值;
(2) Object的==和equals()比较的是都是地址,作用相同.
==作用:
	(1) 基本类型,比较值是否相等
	(2) 引用类型,比较内存地址值是否相等
	(3) 不能比较没有父子关系的两个对象
equals()方法的作用:
	(1) JDK中的类一般已经重写了equals(),比较的是内容
	(2) 自定义类如果没有重写equals(),将调用父类(默认Object类)的equals()方法,Object的equals()比较使用了this==obj
	(3) 可以按照需求逻辑,重写对象的equals()方法(重写equals()方法,一般须重写hashCode()方法)

11.请写出获取一个类类型的Class对象的几种方式?基本数据类型是否可以获取其Class对象,如果可以,请举例说明

1)知道类的全限类名,com.briup.day06.Student
	Class.forName(全限类名);
2)只知道类的类名,Student
	Student.class;
3)知道有个对象的名字,stu1
	stu1.getClass();
基本数据类型可以获取其Class对象(原始Java类型(boolean,byte,char,short,int,long,float和double),和关键字void也表示为类对象)
	例:System.out.println(int.class);//结果为 int

12.如何退出多层嵌套循环

方式一:标签
	A:for(){
		for(){
			break A;
		}
	}
方式二:return直接退出整个方法
	for(){
		for(){
			return;
		}
	}

13.子父类关系中,创建子类对象就会调用父类的构造方法,请问调用父类构造方法一定会创建父类对象吗,请举例说明

调用父类构造方法不一定会创建父类对象
例:	子类继承一个抽象类,抽象类是不能创建对象的

14.A类如果实现B接口就必须实现里面所有的抽象方法,请给出一种方案,A类想要实现B接口,又不想实现所有的抽象方法

(1) 写一个中间类C去实现B接口,并且空实现接口里面所有的方法
	A 类 继承 C类,当想要重写某个方法时直接重写即可
(2) 写一个抽象类,把A类定义为抽象类,也可以满足只实现部分抽象方法

15.创建对象一定会调用构造方法吗,如果不是请举例说明

创建对象不一定会调用构造方法
Java中创建对象的方式:
	(1) 用new语句创建对象;
	(2) 运用反射,调用 java.lang.Class 或 java.lang.reflect.Constructor 类的 newInstance() 方法;
	(3) 调用对象的 clone() 方法;
	(4) 运用反序列化手段,调用 java.io.ObjectInputStream 对象的 readObject() 方法.
(1)(2)会调用构造函数
(3)(4)不会调用构造函数