Java易忽略知识点总结

版权声明:作者已开启版权声明,如转载请注明转载地址。 https://blog.csdn.net/qq_34829447/article/details/82784333

博主即将步入公司,公司给定了相关文档让工作前读完,本节将针对http://www.weixueyuan.net/的Java教程查缺补漏,总结相关易忽略的知识点,跟大家分享~

一.Java概述

1.类和对象的基本概念

  • 面向对象编程(Object Oriented Programming, OOP)

2.Java类库及其结构组织

  • Java类库中的包

    • 以 java.* 开头的是Java的核心包,所有程序都会使用这些包中的类;
    • 以 javax.* 开头的是扩展包,x 是 extension 的意思,也就是扩展。虽然 javax.* 是对 java.* 的优化和扩展,但是由于 javax.* 使用的越来越多,很多程序都依赖于 javax.,所以 javax. 也是核心的一部分了,也随JDK一起发布。
    • 以 org.* 开头的是各个机构或组织发布的包,因为这些组织很有影响力,它们的代码质量很高,所以也将它们开发的部分常用的类随JDK一起发布。
    • 在包的命名方面,为了防止重名,有一个惯例:大家都以自己域名的倒写形式作为开头来为自己开发的包命名,例如百度发布的包会以 com.baidu.* 开头,w3c组织发布的包会以 org.w3c.* 开头,微学苑发布的包会以 net.weixueyuan.* 开头……
    • 组织机构的域名后缀一般为 org,公司的域名后缀一般为 com,可以认为 org.* 开头的包为非盈利组织机构发布的包,它们一般是开源的,可以免费使用在自己的产品中,不用考虑侵权问题,而以 com.* 开头的包往往由盈利性的公司发布,可能会有版权问题,使用时要注意。
  • Java常用的包的介绍

包名 说明
java.lang 该包提供了Java编程的基础类,例如 Object、Math、String、StringBuffer、System、Thread等,不使用该包就很难编写Java代码了。
java.util 该包提供了包含集合框架、遗留的集合类、事件模型、日期和时间实施、国际化和各种实用工具类(字符串标记生成器、随机数生成器和位数组)。
java.io 该包通过文件系统、数据流和序列化提供系统的输入与输出。
java.net 该包提供实现网络应用与开发的类。
java.sql 该包提供了使用Java语言访问并处理存储在数据源(通常是一个关系型数据库)中的数据API。
java.awt 这两个包提供了GUI设计与开发的类。java.awt包提供了创建界面和绘制图形图像的所有类,而javax.swing包提供了一组“轻量级”的组件,尽量让这些组件在所有平台上的工作方式相同。
javax.swing 这两个包提供了GUI设计与开发的类。java.awt包提供了创建界面和绘制图形图像的所有类,而javax.swing包提供了一组“轻量级”的组件,尽量让这些组件在所有平台上的工作方式相同。
java.text 提供了与自然语言无关的方式来处理文本、日期、数字和消息的类和接口。

3.Java import及Java类的搜索路径

  • import注意

    • import 只能导入包所包含的类,而不能导入包。
    • 为方便起见,我们一般不导入单独的类,而是导入包下所有的类,例如 import java.util.*;。
  • Java 编译器默认为所有的 Java 程序导入了 JDK 的 java.lang 包中所有的类(import java.lang.*;),其中定义了一些常用类,如 System、String、Object、Math 等,因此我们可以直接使用这些类而不必显式导入。但是使用其他类必须先导入。

  • Java类的搜索路径

    • Java程序运行时要导入相应的类,也就是加载 .class 文件的过程。

    • 假设有如下的 import 语句:该语句表明要导入 p1 包中的 Test 类

      import p1.Test;
      
    • 安装JDK时,我们已经设置了环境变量 CLASSPATH 来指明类库的路径,它的值为.;%JAVA_HOME%\lib,而 JAVA_HOME 又为 D:\Program Files\jdk1.7.0_71,所以 CLASSPATH 等价于.;D:\Program Files\jdk1.7.0_71\lib

    • Java 运行环境将依次到下面的路径寻找并载入字节码文件 Test.class:

      • .p1\Test.class("."表示当前路径)
      • D:\Program Files\jdk1.7.0_71\lib\p1\Test.class
    • 如果在第一个路径下找到了所需的类文件,则停止搜索,否则继续搜索后面的路径,如果在所有的路径下都未能找到所需的类文件,则编译或运行出错。

    • 你可以在CLASSPATH变量中增加搜索路径,例如.;%JAVA_HOME%\lib;C:\javalib,那么你就可以将类文件放在C:\javalib目录下,Java运行环境一样会找到。

二.Java基础语法

1.Java数据类型转换

  • 数据类型的转换,分为自动转换和强制转换。自动转换是程序在执行过程中“悄然”进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换;强制类型转换则必须在代码中声明,转换顺序不受限制。

2.Java数组的定义和使用

  • 类型 变量名 = new 类型[长度];是静态数组。静态数组一旦被声明,它的容量就固定了,不容改变。所以在声明数组时,一定要考虑数组的最大容量,防止容量不够的现象。
  • 如果想在运行程序时改变容量,就需要用到数组列表(ArrayList,也称动态数组)或向量(Vector)。
  • 正是由于静态数组容量固定的缺点,实际开发中使用频率不高,被 ArrayList 或 Vector 代替,因为实际开发中经常需要向数组中添加或删除元素,而它的容量不好预估。

3.Java的Stirng字符串

  • 使用简化语法String str= "xxxx";的是,按照标准的面向对象的语法,在内存使用上存在比较大的浪费。例如String str = new String(“abc”);实际上创建了两个String对象,一个是”abc”对象,存储在常量空间中,一个是使用new关键字为对象str申请的空间。

4.StringBuffer与StringBuilder

  • StringBuffer 默认分配16字节长度的缓冲区,当字符串超过该大小时,会自动增加缓冲区长度,而不是生成新的对象。

  • StringBuffer类中的方法主要偏重于对于字符串的操作,例如追加、插入和删除等,这个也是StringBuffer类和String类的主要区别。实际开发中,如果需要对一个字符串进行频繁的修改,建议使用 StringBuffer。

  • StringBuilder类和StringBuffer类功能基本相似,方法也差不多,主要区别在于StringBuffer类的方法是多线程安全的,而StringBuilder不是线程安全的,相比而言,StringBuilder类会略微快一点。

  • StringBuffer、StringBuilder、String中都实现了CharSequence接口。

    • CharSequence是一个定义字符串操作的接口,它只包括length()、charAt(int index)、subSequence(int start, int end) 这几个API。

    • StringBuffer、StringBuilder、String对CharSequence接口的实现过程不一样,如下图所示:

      String直接实现了CharSequence接口;StringBuilder 和 StringBuffer都是可变的字符序列,它们都继承于AbstractStringBuilder,实现了CharSequence接口。

    在这里插入图片描述

  • 使用环境

    • 操作少量的数据使用 String;
    • 单线程操作大量数据使用 StringBuilder;
    • 多线程操作大量数据使用 StringBuffer。

三.Java类与对象

1.Java访问修饰符(访问控制符)

  • 访问控制和继承
    • 父类中声明为public的方法在子类中也必须为public。
    • 父类中声明为protected的方法在子类中要么声明为protected,要么声明为public。不能声明为private。
    • 父类中默认修饰符声明的方法,能够在子类中声明为private。
    • 父类中声明为private的方法,不能够被继承。
  • 使用访问控制符
    • 当需要让自己编写的类被所有的其他类访问时,就可以将类的访问控制符声明为 public。
    • 当需要让自己的类只能被自己的包中的类访问时,就可以省略访问控制符。
    • 当需要控制一个类中的成员数据时,可以将这个类中的成员数据访问控制符设置为 public、protected,或者省略。

2.Java this关键字详解

  • this 只有在类实例化后才有意义。
  • this()在构造方法中调用另一个构造方法,调用动作必须置于最起始的位置。
  • 不能在构造方法以外的任何方法内调用构造方法。
  • 在一个构造方法内只能调用一个构造方法。

3,Java方法重载

  • 方法的重载的规则
    • 方法名称必须相同。
    • 参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)。
    • 方法的返回类型可以相同也可以不相同。
    • 仅仅返回类型不同不足以成为方法的重载。
  • 说明
    • 参数列表不同包括:个数不同、类型不同和顺序不同。
    • 仅仅参数变量名称不同是不可以的。
    • 跟成员方法一样,构造方法也可以重载。
    • 声明为final的方法不能被重载。
    • 声明为static的方法不能被重载,但是能够被再次声明。

四.Java继承和多态

1.Java的super关键字

  • super 与 this 的区别:super 不是一个对象的引用,不能将 super 赋值给另一个对象变量,它只是一个指示编译器调用父类方法的特殊关键字。

2.Java继承中方法的覆盖和重载

  • 方法覆盖的原则:
    • 覆盖方法的返回类型、方法名称、参数列表必须与原方法的相同。
    • 覆盖方法不能比原方法访问性差(即访问权限不允许缩小)。
    • 覆盖方法不能比原方法抛出更多的异常。
    • 被覆盖的方法不能是final类型,因为final修饰的方法是无法覆盖的。
    • 被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
    • 被覆盖的方法不能为static。如果父类中的方法为静态的,而子类中的方法不是静态的,但是两个方法除了这一点外其他都满足覆盖条件,那么会发生编译错误;反之亦然。即使父类和子类中的方法都是静态的,并且满足覆盖条件,但是仍然不会发生覆盖,因为静态方法是在编译的时候把静态方法和类的引用类型进行匹配。
  • 覆盖和重载的不同:
    • 方法覆盖要求参数列表必须一致,而方法重载要求参数列表必须不一致。
    • 方法覆盖要求返回类型必须一致,方法重载对此没有要求。
    • 方法覆盖只能用于子类覆盖父类的方法,方法重载用于同一个类中的所有方法(包括从父类中继承而来的方法)。
    • 方法覆盖对方法的访问权限和抛出的异常有特殊的要求,而方法重载在这方面没有任何限制。
    • 父类的一个方法只能被子类覆盖一次,而一个方法可以在所有的类中可以被重载多次。

3.静态static

  • 关于静态变量和静态方法的总结:
    • 一个类的静态方法只能访问静态变量;
    • 一个类的静态方法不能够直接调用非静态方法;
    • 如访问控制权限允许,静态变量和静态方法也可以通过对象来访问,但是不被推荐;
    • 静态方法中不存在当前对象,因而不能使用 this,当然也不能使用 super;
    • 静态方法不能被非静态方法覆盖;
    • 构造方法不允许声明为 static 的;
    • 局部变量不能使用static修饰。

4.final关键字

  • final 修饰的类不能被继承。
  • final 修饰的方法不能被子类重写。
  • final 修饰的变量(成员变量或局部变量)即成为常量,只能赋值一次。
  • final 修饰的成员变量必须在声明的同时赋值,如果在声明的时候没有赋值,那么只有一次赋值的机会,而且只能在构造方法中显式赋值,然后才能使用。
  • final 修饰的局部变量可以只声明不赋值,然后再进行一次性的赋值。

5.hashCode的规定

  • 在同一个应用程序执行期间,对同一个对象调用 hashCode(),必须返回相同的整数结果——前提是 equals() 所比较的信息都不曾被改动过。至于同一个应用程序在不同执行期所得的调用结果,无需一致。
  • 如果两个对象被 equals() 方法视为相等,那么对这两个对象调用 hashCode() 必须获得相同的整数结果。
  • 如果两个对象被 equals() 方法视为不相等,那么对这两个对象调用 hashCode() 不必产生不同的整数结果。
  • 简单地说:如果两个对象相同,那么它们的 hashCode 值一定要相同;如果两个对象的 hashCode 值相同,它们并不一定相同。在 Java 规范里面规定,一般是覆盖 equals() 方法应该连带覆盖 hashCode() 方法。

猜你喜欢

转载自blog.csdn.net/qq_34829447/article/details/82784333
今日推荐