Java基础 复习

  • java未指定关键字则默认为friendly
  • 继承关键字 extends
  • 除了final,static,private和构造方法是前期绑定外,其他的方法全部为动态绑定
  • 由于垃圾清理器,java存在不连贯的因素

保存位置

  • 堆栈
    • 特别快,特别有效,创建程序时,Java编译器必须准确知道堆栈中内存保存的所有数据的“长度”及“存在时间”。这是由于它必须生成相应的代码,以便向上和向下移动指针。
    • 编译器不需要知道要从堆里分配多少存储空间,也不必知道存储的数据要再堆里停留多长的时间。<font color=blue>在堆里分配存储空间会花费更多时间</font>

数值类型

  • 数值全都是有符号的
  • 主数据类型也拥有自己的“封装器Wrapper”类
  • BigInteger和BigDecimal可用于高精度的计算,大致可划分为Wrapper类型,但都没有对应的“主类型”。对int和float做的事情对它们也一样可以做,但是必须使用方法调用而不能使用运算符。

数组

  • 在创建数组时实际上创建的是一个句柄数组,且每个句柄都会自动化初始化为一个特殊值,并带有自己的关键字null

定义一个类

定义一个类时,数据成员若是指向对象的一个句柄则必须用“构建器”初始化句柄,若是主类型则可以直接在类定义位置直接初始化。

编码格式

  • 类名每个字母开头都重要大写,单词紧靠在一起,方法、字段、对象句柄名称则都开头小写,其他单词大写开头

赋值符号

<font color=red>若为主类型之间的相互赋值则是直接复制值,A=B,B的值改变后对A不会有影响,但如果是对象之间的赋值,实质上是句柄的赋值,A=B,若B的值改变则A的值也会改变,因为实际上是句柄指向的对象的值改变了。</font>

  • ==和!=对对象来说比较的是句柄

转型

  • 数值计算时,只要它们比"int"小,就会都转为int。通常表达式中最大的数据类型决定了表达式最终结果大小的那个类型。

所有数据类型在所有机器上的大小都是相通的。

  • <font color=red>Java不允许将数字作为一个boolean值使用</font>

  • <font color=red>for里面可以定义多个变量,但是它们的类型必须相同</font>

标签

label1:
{//外循环
{//...内循环
break;
//...
continue;
//...
continue label1;//3
//...
break label1;//4
}
}
/**
 *3是同时中断内外部循环,跳转到label1处从外循环继续循环;4  是同时中断内外部循环,跳转到label1处直接跳过循环往下。
 *这个对while也同样适用
*/
  • switch语句的选择因子必须是int或char这样的整数值
  • 局部变量不会被自动初始化,但是类变量的基本类型会有默认初始值。
  • static field 初始化
    • object第一次被创建
    • 直接使用class中的static method或直接访问static member

函数重载

  • 如果Java基础类有一个方法名被“过载”过很多次,在衍生类里对那个方法名的重新定义就不会隐藏任何基础类的版本。所以无论这一方法在这一级还是在一个基础类中定义,过载都会生效;

final修饰符

  • final会将值直接变为一个常数;但对于对象句柄,final会将句柄变为一个常数,然而对象本身是可以修改的。

    • 好处
      • 为方法上锁,防止任何即成类改变它的本来含义。
      • 提高执行效率,讲一个方法设为final后,编译器就可以把对那个方法的所有调用都置入“嵌入”调用里。
      • 类内所有private方法都自动成为final。
  • super和this调用构造函数,都必须写在第一行,否则会报错

初始化顺序

  1. 基类静态代码块,基类静态成员字段(并列优先级,按代码中出现先后顺序执行)(只有第一次加载类时执行)
  2. 派生类静态代码块,派生类静态成员字段(并列优先级,按代码中出现先后顺序执行)(只有第一次加载类时执行)
  3. 基类普通代码块,基类普通成员字段(并列优先级,按代码中出现的先后顺序执行)
  4. 基类构造函数
  5. 派生类普通代码块,派生类普通成员字段(并列优先级,按代码中出现的先后顺序执行)
  6. 派生类构造函数
  • java中绑定的所有方法都采用后期绑定的方式,除非一个方法已被申明为final

接口

  • 接口可看作一个纯抽象类,允许规定一个类的基本形式:方法名、自变量列表以及返回类型,但不规定方法主体。接口也包含了基本数据类型的数据成员,但它们都默认为static和final
  • 接口的所有成员变量都是public

内部类

为生成一个内部类的对象,必须利用外部类的一个对象来生成一个内部类的对象

Parcel 11.Contents c=p.new Contents();
  • 但如果是生成一个static内部类,就不需要指向外部类对象的一个句柄。
  • 只继承外部类的话是不能覆盖内部类的,除非内部类也明确进行了继承,则内部类的方法也都会被覆盖

数组

  • 创建一个数组对象时,它的大小是固定的,而且不可在那个数组对象的“存在时间”内发生变化。

  • 数组能够容纳的是一种类型已知的对象,能够容纳基本数据类型,但一旦创建好以后,大小就不能改变了。

  • vector容纳对象的句柄,所以不能容纳基本数据类型,将一个对象句柄从集合中取出来的时候,必须对结果进行造型处理。

finally

  • 若调用了continue和break,finally语句也会得以执行

克隆

  • vector的clone()方法可以制作出一个副本而不会改变原对象

散列

  • 将键保存在某处,以便查询能够很快找到。存储一组元素最快的数据结构是数组,所以用它来表示键的信息,数据并不保存键本身。而是通过键对象生成一个数字,将其作为数组的下标,这个数字就是散列码。

对象序列化

  • java的对象序列化讲那些实现了Serializable接口的对象转换为一个字节序列,并能够在以后将这个字节序列完全恢复为原来的对象。实现轻量持久性,“持久性”意味着一个对象的生存周期并不取决于程序是否正在执行,它可以生存于程序的调用之间
  • 若我们正在操作一个序列化的对象,可以用transient关键字逐个字段的关闭序列化

注解

  • 注解的元素在使用时表现为名-值对的形式

反射

  • 获取Class实例的方式
    • 1.通过一个class的静态变量class获取:Class cls = String.class
    • 2.如果有一个实例变量,可以通过该实例变量提供的getClass()方法获取:String s = "Hello"; Class cls = s.getClass();
    • 3.如果知道一个class的完整类名,可以通过静态方法Class.forName()获取:Class cls = Class.forName("java.lang.String");
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容