Java基础知识点汇总

1、JDK与JRE

JDK

我们把Java编程语言、Java API类库和Java虚拟机三部分统称为JDK(Java Development Kit),JDK包括:JRE,Java基本类库,Java开发工具如编辑器、调试器等。JDK是用于支持Java程序开发的最小环境。

JRE

我们把Java API类库中的Java SE API 子集和Java虚拟机两部分统称为JRE(Java Runtime Environment),JRE是支持Java程序运行的标准环境。

二者区别与联系

JDK范围涵盖JRE,JRE是JDK的子集。如果仅仅是运行Java程序,用户计算机仅需配置JRE;如果用户想要自己开发Java程序,那么则需要安装配置JDK。

图片

2、JVM

机器与编译程序之间一层抽象的虚拟机器,在任何平台上都提供给编译程序一个共同的接口,编译程序只需要面向虚拟机,由解释器将虚拟机代码转换为特定系统的机器码执行。

3、Java与C++的区别

  1. Java提供了对内存的自动垃圾回收,程序员无需在程序中进行分配、释放内存的操作;

  2. Java去除了指针,用诸如引用的方法来代替,避免了赋值语句与逻辑运算语句混淆;

  3. Java没有类的多重继承,但有接口的多重继承。

4、声明变量

  1. 指定在内存中分配空间的大小;

  2. 规定这个变量所能接受的运算。

5、Java中的数据类型

  • 基本数据类型

    • 数值型

      • 整数类型(byte 8位,short 16位,int 32位,long 64位)

      • 浮点类型(float 32位,double 64位)

    • 字符型(char 16位)

    • 布尔型(boolean 1位)

  • 引用数据类型

    • 类(class)

    • 接口(interface)

    • 数组(array)

6、Unicode编码

Java中默认采用的编码方式是Unicode编码,是一种十六进制编码,可以表示世界上任意一种文字信息。所以Java中的单个char可以保存中文字符(2字节),而在C/C++中,中文字符只能当作字符串处理。

7、短路逻辑运算

&&、|| ,先对左边的语句进行判断,符合运算符要求后再判断右边语句,否则直接退出运算。

8、null值

基本数据类型有默认值,无法将null赋值给基本数据类型变量。

9、封装、继承与多态

封装

封装是一种信息隐蔽技术,使数据和加工该数据的方法封装为一个整体,以实现独立性很强的模块,使用户只能看到对象的外特性(对象能接收哪些消息,具有哪些处理能力),而对象的内特性(保存内部状态的私有数据和实现加工能力的算法)对用户是隐蔽的。封装的目的在于把对象的设计者与对象的使用者分开,使用者不必知晓其行为实现的细节,只需使用设计者提供的消息来访问对象。
良好的封装可以提高代码的模块化程度,防止对象之间的不良的相互影响,使程序达到高内聚(许多功能尽量在类内部独立完成,不让外部干预),低耦合(提供给外部尽量少的方法调用)的终极目标。

继承

子类共享其父类数据和方法的机制,可以对父类进行扩展,是我们非常方便地复用以前的代码。

多态

对象根据所接收的消息而做出动作,不同的对象接收相同的消息会做出不同的动作。
在Java中,分为方法的多态性与对象的多态性。

方法的多态性

重载与重写

重载是指两个方法具有相同的方法名,但是入参的个数或类型或顺序不同,那么传入参数时会调用相应的方法;
重写是指子类继承父类时,拥有与父类方法的入参及返回值类型完全相同的方法,但子类的该方法接收消息时会执行子类的方法;

对象的多态性

对象的多态性主要体现在父子类对象之间的相互转型。

10、栈内存与堆内存

在Java中,栈是由编译器自动分配和释放的一块内存区域,主要用于存放一些基本数据类型的变量,指令代码,常量及对象句柄(对象的引用地址)。

栈内存的操作方式类似于数据结构中的栈,优势在于它的存取速度较快,仅次于寄存器,栈中的数据还可以共享。缺点表现在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

堆是一个程序运行动态分配的内存区域,在Java中,构建对象所需要的内存从堆中分配,放弃分配方式类似于链表。堆内存在使用完毕后,由垃圾回收器隐式回收。这一点上与C++不同,C++中堆内存的分配和回收都是显式的,由用户负责,如果用户申请了堆内存而在使用后忘记释放,则会产生“内存溢出”问题–可用内存存在,而其他用户无法使用。堆的优势在于动态分配内存大小,按需分配,其生存期也不必事先告诉编译器。在使用完毕后,Java的垃圾收集器会自动收走这些不再使用的内存块。其缺点为,由于要在运行时动态分配,相比于栈内存,存取速度较慢。

由于栈内存较小,如果不慎耗尽,则产生堆栈溢出 Stack Overflow问题。

堆内存使用不当则会产生内存碎片。回收堆内存时可能产生一些小块但不连续的内存,从而导致用户申请一块较大的堆内存时,虽然可用内存总和够大,但由于不连续导致申请失败。

11、final关键字的使用

  1. 使用final修饰的类无法被继承;

  2. 使用final修饰的ff无法被子类重写;

  3. 使用final修饰的变量无法被修改,即为常量。

12、使用final关键字的好处

  1. 使用final可以提升性能,JVM和Java应用都会缓存final变量;

  2. final变量可以安全地在多线程环境下共享,不需要额外的同步开销;

  3. 使用final关键字,JVM会对方法、变量及类进行优化;

  4. 可以创建不可变类(如String)。

13、抽象类

  1. 抽象类和抽象方法都必须用abstract关键字修饰;

  2. 抽象类不能实例化,不能直接用new关键字去产生对象;

  3. 抽象类定义抽象方法时只需声明,不需实现;

  4. 含有抽象方法的类必须被声明为抽象类,抽象类的子类必须重写抽象类中的所有抽象方法才能够实例化,否则这个子类仍然是抽象类。

  5. 抽象类中可以有构造方法,但只能在子类中调用,子类实例化对象时首先默认调用父类的构造方法,再调用子类的构造方法;

  6. 抽象类不能被final修饰;

  7. 外部抽象类不能使用static关键字修饰,但内部抽象类可以被static关键字修饰,使用static关键字修饰的内部抽象类表示一个外部类。

14、接口

  1. 接口中的数据成员必须初始化,且均为常量,常见的是全局变量;

  2. 接口中不能像抽象类一样定义普通方法,所有方法必须全为抽象方法;

  3. 接口中允许定义default方法;

  4. 接口必须有子类,子类可以同时实现多个接口;

  5. 接口的子类(如果不是抽象类)必须重写接口中的全部抽象方法;

  6. 接口与一般类一样,本身也具有数据成员(final可省略)与方法(abstrat可省略)

15、static关键字的使用

  1. 使用static关键字修饰属性:静态属性,类的公共属性,可直接用类名访问;

  2. 使用static关键字修饰方法:静态方法,可由类名直接调用;
    注意:静态方法与非静态方法都可以使用static属性,但静态方法不能调用非静态属性!

  3. static 主方法:Java虚拟机需要调用类的main()方法,所以该方法的访问权限必须是public,又因Java虚拟机在执行main()方法时不必创建对象,因此该方法必须是static的。该方法接受一个String类型的数组参数,该数组中保存了执行Java命令时传递给所运行的类的参数。

16、内部类

  1. 提供了更好的封装,把内部类隐藏在外部类之内,不允许同一个包中的其他类访问内部类;

  2. 内部类成员可以直接访问外部类的私有数据,但外部类不能访问内部类的实现细节,如成员变量;

  3. 匿名内部类适合用于创建那些仅需要创建一次的类;

  4. 使用static关键字修饰的内部类属于外部类本身,也就是外部类;

17、匿名对象

匿名对象使用一次后,就会被Java的垃圾回收器回收。

18、System类

Java不支持全局方法和全局变量,Java设计者将一些系统相关的重要方法和变量收集到了一个统一的类中,这就是System类。

System类中所有的成员都是静态的。

exit(int status)方法,提前终止JVM的运行;
currentTimeMillis方法,返回自1970年1月1日0时0分0秒起至今以ms为单位的时间,这是一个long类型的大数值;
getProperties方法获得当前虚拟机的环境属性。

19、RunTime类

程序运行时,在每一个JVM进程之中都会存在唯一一个Runtime类的实例化对象。这是一个明显的单例设计模式,将构造方法私有化了。在类内部存在一个static定义的方法,用于取得本类的实例化对象。
public static Runtime getRuntime();
取得Runtime类的实例化对象后,可以获得一些内存信息:

  • 最大可用内存数:public long maxMemory();

  • 总共可用内存数:public long totalMemory();

  • 空闲内存数:public long freeMemory();

如果程序之中出现过多垃圾,则会影响性能,此时可以清除垃圾:

  • public void gc()。

20、正则表达式

  • public boolean matches(String regex) 将字符串与正则表达式匹配验证;

  • public String replaceAll(String regex, String replacement) 按正则全部替换;

  • public String replaceFirst(String regex, String replacement) 按正则替换首个;

  • public String[] split(String regex) 按指定正则拆分;

  • public String[] split(String regex, int limit) 按指定正则拆分为指定长度的字符串数组;

21、String类

  1. 在Java中,String对象既可以显式创建也可以隐式创建;

  2. String类对象的两种实例化方式:

String s = "abc";String s = new String("abc");

  1. 也可以用串联方式生成,如:String s = "new" + "string";这种情况只生成了一个对象,因为编译器在编译期就能够得到s的值为"newstring",不需要等到程序运行期间。

  2. String内容的比较
    "=="比较两个对象是否引用同一实例,例:

String s1 = "Hello"; String s2 = "Hello"; Boolean result = (s1 == s2); // true String s3 = new String("Hello"); Boolean result = (s1 == s3); // false

  1. String是类,s1、s2和s3是对象,对象名保存在栈内存中,"Hello"保存在堆内存中;

  2. 任何情况下使用"new"关键字一定会开辟一个新的堆内存空间;

  3. s1与s2栈内存不同,但指向相同堆内存;

  4. 栈内存像int型数据,里面保存的是数值,每一个栈内存只能保存一块堆内存的物理地址数值;

  5. 字符串常量往往是String类的匿名对象;
    10.字符串一旦声明将不可改变,改变的只是字符串的引用,并且会产生大量字符串垃圾,因此应尽量避免不断修改字符串内容。

22、反射机制

  1. 根据对象找到类

Class<?> cls = date.getClass(); 
Class<?> cls = java.util.Date.class; 
Class<?> cls = Class.forName("java.util.Date");
  1. 采用反射机制的工厂模式,无需使用new关键字即可访问java对象的属性、方法、构造方法等,可以降低耦合,反射最重要的用途就是开发各种通用框架。

Book book = Factory.getInstance("Computer"); 
book = (Book) Class.forName(className).newInstance();

23、JDK中常见的包

  1. java.lang中包含一些Java语言的核心类,包括String、Math、Integer、System和Thread等,提供常用功能。还有一个子包java.lang.reflect,用于反射机制;

  2. java.awt包含构成抽象窗口工具集的多个类,用于构建和管理图形用户界面(GUI);

  3. java.applet包含applet运行所需要的一些类;

  4. http://java.net包含执行与网络相关的操作的类;

  5. http://java.io包含能提供多种输入/输出功能的类;

  6. java.util包含一些实用工具类,如定义系统特性,与日期日历相关的方法。

24、处理错误的方法的特点

  1. 无需打乱程序的结构,如果没有任何错误产生,程序的运行不受任何影响;

  2. 不依靠方法的返回值来报告错误是否产生;

  3. 采用集中的方式来处理错误,能够根据错误种类的不同进行对应的错误处理操作;

25、Java常见异常

  1. 算数异常(Arithmetic Exception):当运算时出现除以0这样的运算时就会出现;

  2. 空指针异常(Null Pointer Exception):没有给对象开辟空间却使用该对象;

  3. 文件未找到异常(FileNotFound Exception);

  4. 数组下标越界异常(ArrayIndexOutOfBounds Exception);

  5. 内存不足异常(OutOfMemory Exception)。

  6. 修改不能修改的类集时:UnsupportedOperationException;

  7. 一个对象与另一个对象不兼容时:ClassCastException;

26、Java异常处理

Java通过面向对象的方式来处理异常。在一个方法的运行过程中,如果发生了异常,则这个方法生成代表该异常的一个对象,并把它交给运行时系统,运行时系统寻找相应的代码来处理这一异常。我们把生成异常对象并把它提交给运行时系统的过程称为异常的抛出。运行时系统在方法的调用栈中查找,从生成异常的方法开始进行回溯,直到找到包含相应异常处理的方法为止,这一过程称为异常的捕获

27、throws关键字

使用throws关键字声明的方法表示此方法不处理异常,而由系统自动将所捕获的异常信息“抛给”上级调用方法。

28、throw关键字

throw关键字可以直接抛出异常,抛出时直接抛出异常类的实例化对象即可。throw出现在方法体中,一旦它抛出一个异常,则程序会在throw语句后立即终止,后面的语句没有机会执行,然后在包含它的所有try块中(可能在上层调用方法中)从里向外寻找含有与其异常类型匹配的catch块,然后加以处理。

29、Java的类集框架

Java的类集框架可以使程序处理对象的方法标准化,类集接口是构造类集框架的基础,使用迭代方法访问类集可以使对类集的操作更高效;
在计算机世界里,处理繁琐问题的常用方法就是将其封装,只向外提供可调用的方法视图。Java类集框架就是对这一方法的一种官方实现一套动态数组的操作类。本质上,Java类集框架就是Java对数据结构的一个大体上的封装。

30、单值保存的最大父接口-Collection

Collection是构造类集框架的基础,是单值数据操作的最大父接口,它声明了所有类集都将拥有的核心方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值