Java复习最后一弹~~~

本文涵盖了Java的基础知识,包括类对象、构造方法、成员变量、抽象类、接口、继承和异常处理。强调了成员变量初始化、方法重载与重写、静态成员的使用规则,以及抽象方法和接口的特点。同时,还探讨了泛型、内存分配、方法使用等细节,并通过实例解析了常见的编程陷阱和错误理解。
摘要由CSDN通过智能技术生成

一:类对象


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.

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值