题目来源java面试宝典,只针对知识点进行总结
第一类:i++问题
1.局部变量不影响全局变量的值。
2.int x,y; 默认的x和y的值是0;
3 int j=0;
for(int i=0;i<100;i++){
j=j++; //j=0;然后一直循环j还是等于0
} 所以输出的j等于0
4 a&&b 当a为真的时候执行b,如果a为假,则不执行b
第二类:类型转换问题:
1.Short mushort=99S; Short 中S是大写的所以是基本类型short的包装类 对后边的大99S无法识别,应该直接数值。
2.float z=1.0; 默认浮点数是double类型,所以此处需要float z=1.0f ; 或者 double z=1.0;
3.数组的长度是包含length属性,length()是字符串的方法,返回字符串的长度。如下代码:
int[] a={1,2,3};
System.out.println(a.length);
int b="adfa".length();
System.out.println(b);
java数据类型:
┏数值型━┳━整数型:byte short int long ┏基本数据类型━━┫ ┗━浮点型:float double ┃ ┣字符型:char 数据类型╋ ┗布尔型:boolean ┃ ┏类(class) ┗引用数据类型━━╋接口(interface) ┗数组(array)类型之间的低级到高级:(byte short char)--int--long--float--double
对于(byte short char)三种类型 级别相同,想换转换的话需要使用强制类型。
4.关于a=a+b;a+=b;的问题:
a=a+b;放回的类型是a和b中类型最高类型
a+=b;》a=(a Type)a+b;返回a的类型;
当a,b类型一致的时候两者无差别
当a,b类型不一致的时候两者是有差别的
5.考点一: 8进制数以0开头,十六进制以0X开头
考点二:int a=018;会报编译错误,而 int i=(int)056L;则不报错;056L是长整型,(int)是强制类型转换。所以正常。
第三类:程序结构
1.java main函数:标准版:public static void main(String[] args){}
(1).main方法必须定义成public ,默认代表protect。所以不合法
(2).args参数:使程序使用者在命令行状态下,可以向main函数传递参数。
(3).不加static关键词编译可以通过,但是运行时会报错:如下
错误: main 方法不是类 com.demo.exam.Test 中的static, 请将 main 方法定义为:
public static void main(String[] args)
第四类:运算法问题
1.boolean b=true?false:true==true?false:true;
考察两类问题:第一:运算法优先级。第二:三元运算符;
三元运算符的级别很低,低于== 所以先进行==运算
2. int a=5;
System.out.println("Value is "+((a<5)?10.9:9));
java会给据运算法的精度类型进行自动类型转换。 所以9自动变成9.0;
所以输出9.0;
3
char c='x';
int i=10;
System.out.println(false?i:c);
System.out.println(false?10:c);
第一个表达式:一个是int,一个char, 所以类型转换。 char变换为int类型
第二个表达式:一个是常量10 ,一个是char(T)。如果常量可以被T表示,输出为T类型。
提示:java高质量代码151建议:三元运算符最好数据类型是一致的。
4. int m,n,j;
j=m=n=5;
if((m!=5)&(n++==6)){
System.out.println("b."+n);
}
System.out.println(j++ == 6);
(1)其中n++==6是false, 并不是n++以后n=6,然后再n==6;应该是n==6;然后n++
(2)类似j++ +=6; 等价于j=j+6;然后j++;(以前看到过这个题,但是下边这段java代码编译报错):
(k++)+=6; 理解主要是思想还是先进行左右两端都是一次运算后,变量才加1;
(3) int k=6; k+=(k++);
System.out.println(k); 输出为12;参考j=j++;j的值是不变的
第五类:传递和引用
1.(1)知识点:每一个new语句返回的都是一个指针的引用,使用java时不需要关心如何操作这个指针。
(2)不管java参数类型是什么,一律值传递参数的副本。 如果java是传值,那么传递的是java的引用。如果传递的是引用,那么传递的是引用的副本。
(3)java变量分为:1.基本类型变量,传递的是副本的值。2,对于一切对象型变量,java传递的是引用的副本,(副本的引用可以修改变量的内容)。
(4)与c++不同之处,c++传递的是真实引用,而不是引用副本。
(5)对于基本类型,传值就是把自己复制一份传递,即使副本变了,自己也不变。
关于对象和基本类型引用参考如下例子:
package com.demo.exam;
public class TestPointer {
public static void test(int i){
i++;
System.out.println(i);
}
public static void testString(StringBuffer str){
str.append(",world");
}
public static void testStr(String str){
//str是string引用的一个副本,他们的值一样,但是现在新建了一个world对象
//str这个引用指向这个新的对象,并不会影响string。
//本来都是打开仓库a的要死,现在让str打开b仓库,并不会影响string打开a。
str="world";
}
public static void main(String[] args) {
// TODO Auto-generated method stub
//基本类型传递的是值得副本,修改副本不影响本身的值。
/* int i=12;
System.out.println("12 "+i);
test(i);
System.out.println("afda"+i);
//对于对象变量,传递的是对象引用的副本,引用副本可以找到这个对象然后对这个对象进行修改。也就修改了对象
StringBuffer buffer=new StringBuffer("hello");
testString(buffer);
System.out.println(buffer); */
//str是string引用的一个副本,他们的值一样,但是现在新建了一个world对象
//str这个引用指向这个新的对象,并不会影响string。
//本来都是打开仓库a的要死,现在让str打开b仓库,并不会影响string打开a。
String string="hello";
testStr(string);
System.out.println(string);
}
}
2.静态变量和私有变量:
(1)定义在类 里的成员变量会被赋予一个默认的值。布尔型的默认初值是false。
(tips:
若基本数据类型作为类成员的时候,即使没有进行初始化。java也会给定默认的初始值。默认是如下所示:
boolean false
char '/uoooo'(null)
byte (byte)0
short (short)0
int 0
long 0L
float 0.0f
double 0.0d
) 当变量作为作为类成员使用时,java才确保给定其初始值,防止程序运行时错误。
public class TestArr {
static boolean t;
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a=new int[10];
for(int i=0;i<a.length;i++){
System.out.println(a[i]); //输出全为0
}
String[] str=new String[10];
for(int j=0;j<str.length;j++){
System.out.println(str[j]);//输出全为null
}
System.out.println("boolean "+t);
}
}
2.java中的静态方法不可以访问非静态变量。(报错main函数,因为main函数是static所以不能使用非静态变量),静态方法在在类初始化的时候就存在了,但是私有变量(非静态变量的时候还没有初始化,不能使用)还没有具体的值,是不能被调用的。所以会出错,是编译错误。(构造函数可以使用非静态变量)报如下错误:
第六类:内存管理
1.垃圾回收标准:
(1)给对象赋予了空值null,以后对象再没有被调用过
(2)给对象赋予了新值,即重新分配了内存空间。
java垃圾回收与其他语言的不用:其他的语言需要显示的分配内存、释放内存,程序在需要时分配内存,不需要的时候释放内存。(这样子容易引起内存泄露)。java不需要程序员显示的分配内存和释放内存。java在创建的时候会自动分配内存,并当对象引用不存在的时候释放这块内存。(无须显示的请求垃圾收集器)
java 内存的管理:内存管理就是对象的分配和释放问题,通过new为每个对象申请内存空间,对象在堆中,变量再栈中。对象的释放由GC决定和执行。。内存的分配有程序完成,内存的释放由GC完成。释放对象的根本原则:该对象不再被引用。
java内存泄露:内存泄露就是存在一些被分配的对象,这些对象有两个特征:(1)对象是可达的,就是有别的对象引用它。(2)对象是无用的。内存泄露的主要原因:保留下来却永远不再使用的对象引用。
1. 程序String str = “hello,everybody”; System.out.println(str.substring(5,4));的运行结果是:______ subString(beginIndex,endIndex);一个开始一个结束,4小于5此时会报错。
2.try()里有一个return语句。那么紧跟在这个try后的finally{}里的code会不会被执行?什么时候被执行,在return前还是后?
会执行,并且在return之前执行。因为finally中的代码是肯定会执行的,finally的作用就是在返回之前需要关闭一些链接。
例如数据库的链接在返回之前都是需要关闭的。
9.自己写JavaBean,判断内同是否相同,有时候需要重写equals方法如下:
一个重写equals 就是判断内容是否相等
第一步:equals(Object o)
先看一下 o是不是等于null
第二步:o是不是这个类的一个实例
第三部:比较数据是否相等。
例如:
1. public boolean equals(Object obj) {
2. if (obj == this) { //可以直接判断内存地址是否相等,相等则相等。
3. return true;
4. }
5. if (obj == null || obj.getClass() != this.getClass()) {
6. return false; // 是否为空,或者 是否是这个类
7. }
8.
9. Person guest = (Person) obj; //判断具体的数值是否相等。
10. return id == guest.id
11. && (firstName == guest.firstName
12. || (firstName != null && firstName.equals(guest.getFirstName())))
13. && (lastName == guest.lastName
14. || (lastName != null && lastName .equals(guest.getLastName())));
15. }
(未完待续)