• Java复习最后一弹~~~


    一:类对象


    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.

     

  • 相关阅读:
    第十三天Tensorflow数据读取和复杂模型的构建
    UE4 顶点网格动画播放后渲染模糊问题
    mysql详解之redolog的关键——幂等性
    我的vue的学习之旅
    Avalonia常用小控件Menu
    计算机服务器中了勒索病毒怎么解决,勒索病毒解密步骤数据恢复
    Jetpack Compose学习(8)——State及remeber
    Pytorch之Embedding与Linear的爱恨纠葛
    nginx网站服务
    JVS开发套件产品定位
  • 原文地址:https://blog.csdn.net/m0_63501066/article/details/127779221