• Java 初学者


    在有C++和C#基础之下开始学习Java,主要记录了一些和C++C#不同的或不知到的点

    • 栈对象必须初始化,否则会报错。(其他的则有默认值)
    • byte占用8位,char占用16位
    • 接口默认为public,接口中的变量默认位public static final
    • 如果子类和基类在同一包中,则子类可以访问基类protected成员(也就是说:被声明为 protected 的变量、方法和构造器能被同一个包中的任何其他类访问)
    • 继承访问规则:public-public            protected-protected/public
    • final 修饰的类不能够被继承,修饰的方法不能被继承类重新定义,修饰的变量为常量,是不可修改的。
    • transient关键子,该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型。???
      public transient int limit = 55;   // 不会持久化
      public int b; // 持久化
    • volatile 易变的变量,每次都会强制从内存中读取

      运算符

    • >>>:按位右移补充0
    • instanceof:判断一个实例是否是某个类型(如果是该类型或该类型的超类则返回true)

      循环控制语句

    • 增强for循环,限制位数组或者有迭代器的类
      public static String[] names = {"acsd", "bcasdf", "cfgad"};
      public static void main(String[] args) {
          for(String s:names) {
              System.out.println(s);
          }
      }
    • switch语句在逻辑上需要break。否则会在第一次匹配到后,继续输出后面所有不匹配的选项,直到break或者结束。
    • switch条件必须时常量,支持整型、字符串或者枚举:Cannot switch on a value of type float. Only convertible int values, strings or enum variables are permitted

      Java Number

    • Java 语言为每一种内置数据类型提供了对应的包装类,(Integer、Long、Byte、Double、Float、Short)都是抽象类 Number 的子类。
    • 一个缓存问题?当数字的值占用内存小于一个byte时,会指向同一个引用
      Integer iNum1 = 128;
      Integer iNum2 = 128;
      System.out.println(iNum1.equals(iNum2));//true
      System.out.println(iNum1 == iNum2);//true

      Java中的字符串优化 stringbuffer 和 stringbuilder

    • stringbuilder 相对有速度上的优势,但不是线程安全的

      Java数组

    • 数组是连续的,非对齐。
    • arrays类提供了很多对数组操作的方法(赋值-fill,升序-sort,通过 binarySearch 方法能对排序好的数组进行二分查找法操作)

      Java函数

    • 可变参数
      public static void testFcn4(double...ds) {
          for(double it : ds) {
              System.out.println(it);
          }
      }
    • Java函数 finalize  以下为一般形式
      protected void finalize()
      {
         // 在这里终结代码
      }
    • synchronized 关键字声明的方法同一时间只能被一个线程访问。synchronized 修饰符可以应用于四个访问修饰符。
    • 序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量。该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型。 

      Java 面向对象

    • Java无多继承,继承使用extends关键字
    • 可以继承多个接口interface,使用关键字implements,多个接口之间使用逗号隔开
    • super为父类引用,this为当前引用
    • final关键子:修饰类,则该类不能被继承;修饰函数,则函数不能被修改(Cannot override the final method from Parent);final修饰变量,则变量不可修改
    • final关键字:一个类为final类,则她的函数都会是final,但是实例变量不是final
    • 重写:default修饰的方法,子类和父类同包时才可以重写;(这类似C#的internal,java没有命名空间,而是使用包——个人理解)
    • 重写:重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。也就是说“强制性异常”不能抛出更多!
    • 重载:可以更改返回类型,但不能作为重载的区别;还可以更改访问修饰符
    • abstract:抽象函数不能有实现(Abstract methods do not specify a body),抽象类下的非抽象函数则必须有实体。
    • 接口中的变量会被引式指定为静态公有

      Java泛型

    • 类型通配符 ?和通配符的上下限(? super XClass  表示 可以使用的类 必须是xclass的父类,extends则表是必须是子类)
          public static void main(String[] args){
              TestFcn1(new ArrayList<AClass>());
              TestFcn2(new ArrayList<CClass>());
              //TestFcn2(new ArrayList<AClass>());//in MainClass cannot be applied
          }
          /*
          * ? super XClass 类型必须是XClass的父类
          * ? extends XClass 类型必须是XClass的子类
          * */
          public static void TestFcn1(List<? super BClass> numList){ }
          public static void TestFcn2(List<? extends BClass> numList){ }

      Java序列化

    • 序列化就是把一个对象转换成字节码,字节码保存了对象的信息
    • 反序列化就是把字节码转换成对象
    • 使用关键子transient可以在序列化时不对数据不保存
    • 一个类能被序列化,前提条件是:实现了java.io.Serializable并且该类的所有属性都可以被序列化(如果一个属性不需要被序列化 则用transient关键子修饰)
    • 序列化和反序列化包含在类ObjectInputStream 和 ObjectOutputStream   objectread/write

      做一个飞机大战,主要理解继承、封装和堕多态等面向对象的思想,顺便打打基础!

  • 相关阅读:
    Maven插件
    Maven 构建生命周期
    Maven POM
    JMeter录制登录测试
    IntelliJ IDEA官方下载地址
    Eplise快捷键
    Eclipse-maven相关配置
    vs2019添加引用出错:对COM组件的调用返回了错误HRESULT E_FAIL
    Java学习--多线程(1)
    SQL Server查询重复数据
  • 原文地址:https://www.cnblogs.com/bbdr/p/9886604.html
Copyright © 2020-2023  润新知