答:8种基本数据类型包括:byte,short,int,long,float,double,boolean,char
1) byte:字节型,用于存储整数的,占用1个字节,范围-128到127
2) short:短整型,用于存储整数的,占用2个字节,范围-32768到32767
3) int:最常用的整型,用于存储整数的,占用4个字节,范围-231到231-1
4) long:长整型,用于存储较大的整数,占用8个字节,范围-263到263-1
5) float:单精度浮点数,用于存储小数的,占用4个字节,不能表示精确的值
6) double:双精度浮点数,最常用的存储小数的类型,占用8个字节,不能表示精确的值
7 ) boolean:布尔型,存储true或false,占用1个字节
8) char:字符型,采用Unicode字符编码格式,存储单个字符,占用2个字节
答:byte,short,int,char,String,枚举,其余类型都不允许
1)重写:发生在父子类中,方法名相同,参数列表相同
----用于在子类中修改父类中的方法
2)重载:发生在同一类中,方法名相同,参数列表不同
----方法名相同的完全不同的方法
----实例变量和静态变量都属于成员变量
1)实例变量:是属于对象的,在创建对象时存储在内存堆中,创建多少个对象,则实例变量就会在内存堆中存在多少份,需要通过引用变量来访问
2)静态变量:是属于类的,在类被加载时存储在内存方法区中,无论创建多少个对象,静态变量在内存中都只有一份,常常通过类名来访问
—java中无论是基本类型还是引用类型,都是值传递
1)对于基本类型而言,传递的是具体的值的副本
2)对于引用类型而言,传递的是具体的地址值的副本
注意:网站上说Java有引用传递的文章都是错误的!!!
举例:
int a = 5;
int b = a; //将a的值5赋值给b(传递的是值的副本–5)
Student zs = new Student();
Student zss = zs; //将zs的地址值赋值给zss(传递的是地址值的副本–0x1111)
//zss和zs指向了同一个Student对象
public abstract class Text {
private static int a;
public static void main(String[] args) {
modify(a);//a----静态变量a
System.out.println(a);//静态方法访问静态变量a,默认值为0
}
public static void modify(int a){
a++;//a是参数,也是局部变量
System.out.println(a);
}
1)抽象类:
1.1)由abstract修饰
1.2)可以包含变量、常量、构造方法、普通方法、静态方法、抽象方法
1.3)派生类通过extends来继承
1.4)只能继承一个(体现单一继承)
1.5)抽象类中的成员是任何访问权限都可以(默认为默认权限(同包中的))
2)接口:
2.1)由interface定义
2.2)只能包含常量、抽象方法
2.3)实现类通过implements来实现
2.4)可以实现多个(体现多实现)
2.5)接口中的成员的访问权限只能是public(默认为public权限)
short s = 5;
//s = s+5;这句话编译错误,short在运算时默认转为int,前面s是short,类型不一致,需改为 s = (short)(s+5)
System.out.println(s);//10
s +=5;// s = (short)(s+5)
System.out.println(s);//15
byte a = 5; a = (byte)(a+10);
System.out.println(a);//15 a -= 5;
System.out.println(a);//10
问: 内部类有独立的.class文件吗?
答: 有,成员/匿名内部类都有独立的.class文件.
外部类名 $ 内部类名.class
Mama $ Baby .class 内部类
NonTnnerClassDemo $ 1 .class 匿名内部类
NonTnnerClassDemo $ 2 .class 匿名内部类
NonTnnerClassDemo $ 3 .class 匿名内部类
常见面试题:
String s = new String(“hello”);
问:如上语句创建了几个对象?
答:2个
第一个:字面量"hello"
----java会创建一个String对象表示字面量"hello",并将其存入常量池中
第二个:new String()
----new String()时会再创建一个字符串对象,并引用hello字符串的内容
“==”:可以作用于基本类型和引用类型
equals(): 只能作用于引用类型
1)String:由final修饰,所以不能被继承
底层封装的是final的字符数组,所以为不变对象
每次修改String引用变量的值,都是在创建新的对象
适合查看,但不适合频繁修改
2)StringBuilder:底层封装的是字符数组,所做操作就是在该数组之上进行,修改效率高
非线程安全的,并发处理的,性能稍快----一般都用StringBuilder
3)StringBuffer:底层封装的是字符数组,所做操作就是在该数组之上进行,修改效率高
线程安全的,同步处理的,性能稍慢------应用率不高
List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
list.add("four");
list.add("five");
list.add("two");
System.out.println(set);
Set<String> set = new HashSet<>();
set.addAll(list);//把list集合添加到set中
System.out.println(set);//输出set
1) final: 修饰类—类不可以被继承,
修饰方法------方法不可以被重写,
修饰变量-----变量不可以被改变
2)finally:
finally块是异常处理机制的最后一块。
它可以直接跟在try后面或者最后一个catch 后面。
finally块保证:只要程序执行到try语句块中,无论是否出现异常,finally最终都
必定执行。
因此我们会将释放资源这类操作放在这里确保执行。
3) finalize是一个方法,被定义在Object中。
该方法会被GC调用。当一个对象没有任何引用后就会被GC释放资源,在释放前的最后一个操作就是GC调用其finalize方法,调用后该对象被释放。
public class FinallyDemo3 {
public static void main(String[] args) {
System.out.println(
test("0")+","+test(null)+","+test("")
); //没有finally块输出的结果是 0,1,2
}
public static int test(String str){
try {
return str.charAt(0)-'0';
} catch (NullPointerException e) {
return 1;
} catch (Exception e){
return 2;
} finally {
return 3;
}
}
}
输出的结果是3,3,3---------
第一次调用方法 ,return的结果是1,再调用finally,return返回结果3,原来的值被覆盖了.所以输出3,后面一样,以此类推----
class Aoo{
private Aoo(){
}
}
class Test{
public static void main(String[] args){
Aoo o = new Aoo(); //Aoo()报错
//new对象时候自动调用Aoo中的构造方法,但是Aoo的构造方法权限是私有的,权限不够无法访问
}
}
public class ooDay09Evensong {
public static void main(String[] args) {
//1)超类静态块 2)超类语句块 3)超类构造方法
Aoo o1 = new Aoo();//new了一个Aoo对象
/1)超类静态块 2)派生类静态块
/3)超类语句块 4)超类构造方法
/5)派生类语句块 6)派生类构造方法
Boo o2 = new Boo();//new了一个Boo对象,
//在加载派生类之前先加载超类,所以超类静态块先走
Aoo o3 = new Boo();//向上造型的执行过程,同上
}
}
class Aoo{
static{
System.out.println("超类静态块");
}
{
System.out.println("超类语句块");
}
Aoo(){
System.out.println("超类构造方法");
}
}
class Boo extends Aoo{
static{
System.out.println("派生类静态块");
}
{
System.out.println("派生类语句块");
}
Boo(){
System.out.println("派生类构造方法");
}
}
1)是一种功能性注释,用于描述某个东西的功能的
2)一般用在类上、方法上、常量上
3)用于类上时可以加参数,常见的有:
3.1)@author用于标记作者(必写)
3.2)@see用于标记参见哪个类
3.3)@since用于标记始于哪个版本
/**表示窗口的运行状态 */
public static final int RUNNING = 0;
/**
*用于计算两个加数的和
*@param num1 第一加数(参数)
*@param num2 第二加数(参数)
*@return 返回两个加数的和
*/
punlic int puls(int num1,int num2){
int num = num1+num2;
return num;
}
1) 定义位置
成员变量:定义在类中的方法, 属于类
局部变量: 定义在方法中的变量,属于方法
2) 初始值:
成员变量: 有默认是初始值,在加载类的时候就会给成员变量赋初始值
局部变量:没有初始值, 必须初始化才可以使用
3)生命周期
成员变量:属于类,随着对象的创建而创建,随着对象的消失而消失-----GC回收
局部变量: 属于方法,随着方法的调用而创建
4)作用域
成员变量:属于类,类中的每个方法都可以使用
局部变量:属于方法,只能在某个方法中使用
5)优先级不同
在同一个类中, 当局部变量和成员变量同名时, 局部变量的优先级比成员变量高
注意: 在方法的参数列表中的参数也是局部变量.
WHERE : 先执行, 过滤记录
HAVEING : 后执行,过滤分组,仅在GROUP BY后