一:类对象
1.成员变量运算 一定要放在方法里
成员变量不能放到方法里
2. this:哪个对象调用就是哪个对象的引用类型 只能在"成员方法"中使用
3.构造方法(constructor)的作用就是对对象中的成员进行初始化
4.为什么成员变量不需要初始化? 对象被申请好时 就已经 初始化所分配的空间
5.静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
实例代码块只有在创建对象时才会执行
6.重载: 1. 方法名必须相同
2. 参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序一定不同)
3. 与返回值类型是否相同无关
重写:返回值和形参都不能改变(修饰符 返回值类型 方法名(参数列表) 要完全一致)
父类被static、private修饰的方法、构造方法都不能被重写
7.
public class Test {
public int aMethod(){
static int i = 0;
i++;
return i;
}
public static void main(String args[]){
Test test = new Test();
test.aMethod();
int j = test.aMethod();
System.out.println(j);
}
}
编译失败,因为在普通方法,定义静态成员变量 --- 当然在静态方法里定义静态成员变量,也不行
二: 抽象类
1.abstract不能修饰字段
2.抽象方法不加大括号
3.abstract与final不能共存
4.最终类->密封类final->只能被实例化
5.抽象方法不能是 private 的
6.抽象方法不能被final和static修饰,因为抽象方法要被子类重写
三: 接口
1.interface 修饰接口 用public 修饰
2.里面是 抽象方法( 接口中每一个方法都是public的抽象方法)
3.里面只包含 方法定义和常量值
4.接口中不能有静态代码块和构造方法
5.类所实现接口的修饰符不能为---final
四: 继承:
1.继承类问题,一定要看,子类帮助父类构造没有(父类含有带参数的构造方法)
class Base{
public Base(String s){
System.out.print("B");
}
}
public class Derived extends Base{
public Derived (String s) {
System.out.print("D");
}
public static void main(String[] args){
new Derived("C");
}
}
五: 异常:
if(i>10)throw new Exception("something’swrong!");
throw用来明确地抛出一个异常情况
throws可以用来声明一个成员方法可能抛出的各种非运行异常的情况
catch很多,但只会抛出一个异常
非检查型异常: NullPointerException, ClassCastException, IndexOutOfBoundException
检查型异常: FileNotFoundException
会先打印finally里的语句,在返回打印main函数中的
比较杂的一些芝士:
1.有关泛型:
虚拟机中没有泛型,只有普通类和普通方法
所有泛型类的类型参数在编译时都会被擦除
创建泛型对象时请指明类型,让编译器尽早的做参数检查
2.有关分配内存与存储位置:
数组是在堆上分配内存的
new出来的对象都在堆上分配内存
类的实例存放在堆中的,全局变量堆,局部变量栈(不分final修饰)
3.一些方法
i)
Math.round(float) 四舍五入(以 int/long 输出)---.abs绝对值
ii)
hasNext() 是Iterator迭代器的一个方法
iii)
compareTo比较字符串大小-是个好方法
iv)
BigDecimal
v)
x.toUpperCase x本身大小写不变
vi)
HashSet继承自AbstractSet 注意接口是用来实现的(比如 LinkedList继承List是错误的)
vii)
ArraryList list = new ArrayList(20); list扩充几次?-0次他只是new了一个数组---(ps:默认10个,再加以1.5倍扩容)
viii)
Java语言几种数组复制方法的效率比: System.arraycopy>Object.clone>Arrarys.copyOf>for
viiii)
== :判断两个对象是不是同一个对象 同一性问题
equals:判断两个对象是不是相等的对象 相等性问题
i)
装箱、拆箱操作发生在: 引用类型与值类型之间
JAVA语言用 包装类 来把基本类型数据封装为对象
ii)
SimpleDateFormat是线程不安全的
iii)
后置++,后++
iv)
程序的编译错误,运行错误
v)
结构型模式中最体现扩展性的模式是---装饰模式
vi)
java的字符类型采用的是Unicode编码方案, 每个Unicode码占-16个bit
vii)
Java用-Object类把基本数据类型数据封装为对象
一些我错过的习题~
1.
String str1="hello";
String str2="he"+ new String("llo");
System.out.println(str1==str2) ---flase
2.
public class SystemUtil{
public static boolean isAdmin(String userId){
return userId.toLowerCase()=="admin"; //userId.toLowerCase()是new了一个新的小写的 //"admin"本身在常量池
}
public static void main(String[] args){
System.out.println(isAdmin("Admin"));
}
}--false
本题考查==的含义,对于两个引用变量,只有他们指向同一个引用时,==才会返回true。
如果题目中isAdmin方法返回值更改为`return userId.toLowerCase().equals("admin");`,输出结果将变为true
3.
public class Test {
public int aMethod(){
static int i = 0;
i++;
return i;
}
public static void main(String args[]){
Test test = new Test();
test.aMethod();
int j = test.aMethod();
System.out.println(j);
}
}--编译失败 static 在方法里 还不是静态方法
static 不能定义局部变量,一定是成员变量,方法里(无论静态还是普通),都不能有变量
4.
class Base{
public Base(String s){
System.out.print("B");
}
}
public class Derived extends Base{
public Derived (String s) { //没有帮父类构造方法,调用super
System.out.print("D");
}
public static void main(String[] args){
new Derived("C");
}
}
5.
int i=0;
Integer j = new Integer(0);
System.out.println(i==j);
System.out.println(j.equals(i));
--true,true
6.
byte b1=1,b2=2,b3,b6;
final byte b4=4,b5=6;
b6=b4+b5; //+运算符 byte->int 但是b4,b5 是final修饰的 所以不会
b3=(b1+b2); // b1+b2 ->int so 编译出错
System.out.println(b3+b6);
--- 语句:b3=b1+b2编译出错---
7.
public class Test2{
public void add(Byte b){
b = b++;
}
public void test(){
Byte a = 127;
Byte b = 127;
add(++a);
System.out.print(a + " ");
add(b);
System.out.print(b + "");
}
}
-128 127
//包装类的值是final修饰不可变的,无论是++b还是b++都创建了一个新对象,那么作为参数传递时,形参和实参不会指向一个地址。也就是说,即使add() 方法中不是 b = b++;这样没有意义的代码,传入参数的值也不会改变。
//byte类型取值范围为-128~127,在a变量进行++a运算时,会导致a变为-128,这是因为整数在内存中使用的是补码的形式表示,最高位是符号位,0表示正
数,1表示负数,加一导致补码进位,符号位变为1.