java基础知识整理

在这里插入图片描述

面向对象(OOP)和面向过程(POP)的理解

二者都是一种思想,面向对象是相对于面向过程而言的。面向过程强调的是功能行为,以函数为最小单位,考虑怎么做。面向对象,将功能封装进对象,强调具备了功能的对象,以类/对象为最小单位,考虑谁来做。

java语言的特点是什么?

  • 面向对象性:两个基本概念:类、对象;三大特性:封装、继承、多态
    1. 继承性:继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。
    2. 封装性:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。
    3. 多态性:多态性是指允许不同类的对象对同一消息作出响应。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。
  • 健壮性:吸收了C/C++语言的优点,但去掉了其影响程序健壮性的部分(如指针、内存的申请与释放等),提供了一个相对安全的内存管理和访问机制
  • 跨平台性:通过Java语言编写的应用程序在不同的系统平台上都可以运行。“Write once , Run Anywhere”

java中的关键字

  • 定义数据类型:class interface enum byte short int long float double char boolean void
  • 定义流程控制:if else switch case default while do for break continue return
  • 定义访问权限:private protected public
  • 定义修饰符:abstract final static synchronized
  • 定义类之间的相关关系:extends implements
  • 定义建立实例及引用实例,判断实例的关键字:new this super instanceof
  • 异常处理的关键字:try catch finally throw throws
  • 用于包的关键字:package import
  • 其他修饰符关键字:native strictfp transient volatile assert

关键字意义

final

  • 当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰。final类中的成员变量可以根据需要设为final,但是要注意final类中的所有成员方法都会被隐式地指定为final方法。
  • 当final修饰的方法表示此方法已经是“最后的、最终的”含义,亦即此方法不能被重写(可以重载多个final修饰的方法)。此处需要注意的一点是:因为重写的前提是子类可以从父类中继承此方法,如果父类中final修饰的方法同时访问控制权限为private,将会导致子类中不能直接继承到此方法,因此,此时可以在子类中定义相同的方法名和参数,此时不再产生重写与final的矛盾,而是在子类中重新定义了新的方法。(注:类的private方法会隐式地被指定为final方法。)
  • 当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化。如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。本质上是一回事,因为引用的值是一个地址,final要求值,即地址的值不发生变化。另外final修饰一个成员变量(属性),必须要显示初始化。这里有两种初始化方式,(1.在申明的时候给其赋值,否则必须在其类的所有构造方法中都要为其赋值)

static

方便在没有创建对象的情况下来进行调用(方法/变量)。

  • static方法一般称作静态方法,由于静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是须依赖具体的对象才能够被调用。
  • static变量也称作静态变量,静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对 象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。 static成员变量的初始化顺序按照定义的顺序进行初始化。
  • static修饰代码块, static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会 执行一次。

abstract

  • 用abstract修饰的类表示抽象类,抽象类位于继承树的抽象层,抽象类不能被实例化。抽象类可以没有抽象方法,但有抽象方法的类一定是抽象类,如果一个子类继承一个抽象类,子类没有实现父类所有的抽象方法,那么子类也要定义为抽象类,否则编译出错。抽象类没有构造方法,也没有抽象静态方法,但是可以有非抽象的构造方法。抽象类不能被实例化,但是可以创建一个引用变量,类型是一个抽象类,并让它引用非抽象类的子类的一个实例,抽象类不能用final修饰符修饰。
  • 用abstract修饰的方法表示抽象方法,抽象方法没有方法体,抽象方法用来描述系统具有什么功能,但不提供具体的实现。
    在这里插入图片描述

interface

  • 定义:接口(interface)是抽象方法和常量值定义的集合。接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。
  • 接口特点:用interface来定义;接口中的所有成员变量都默认是由public static final修饰的;接口中的所有抽象方法都默认是由public abstract修饰的;接口中没有构造器;接口采用多继承机制

native关键字的理解

使用 native 关键字说明这个方法是原生函数,也就是这个方法是用 C/C++等非Java 语言实现的,并且被编译成了 DLL,由 java 去调用。

为什么要用 native 方法

java 使用起来非常方便,然而有些层次的任务用 java 实现起来不容易,或者我们对程序的效率很在意时,问题就来了。例如:有时 java 应用需要与 java 外面的环境交互。这是本地方法存在的主要原因,你可以想想 java 需要与一些底层系统如操作系统或某些硬件交换信息时的情况。本地方法正是这样一种交流机制:它为我们提供了一个非常简洁的接口,而且我们无需去了解 java 应用之外的繁琐的细节。
native 声明的方法,对于调用者,可以当做和其他 Java 方法一样使用,一个 native method 方法可以返回任何 java 类型,包括非基本类型,而且同样可以进行异常控制。native method 的存在并不会对其他类调用这些本地方法产生任何影响,实际上调用这些方法的其他类甚至不知道它所调用的是一个本地方法。JVM 将控制调用本地方法的所有细节。如果一个含有本地方法的类被继承,子类会继承这个本地方法并且可以用 java语言重写这个方法(如果需要的话)。

四种访问权限修饰符

Java权限修饰符public、protected、(缺省)、private置于类的成员定义前,
用来限定对象对该类成员的访问权限。
在这里插入图片描述
**注:**对于class的权限修饰只可以用public和default(缺省)。public类可以在任意地方被访问,default类只可以被同一个包内部的类访问。
在这里插入图片描述

java中的变量

  • 变量的命名规则:由字母数字下划线和$符构成,不能以数字开头

  • 变量的分类

    1. 按照数据类型分类
      按照数据类型分类
    2. 声明的位置的不同分类
      在方法体外,类体内声明的变量称为成员变量
      在方法体内部声明的变量称为局部变量在这里插入图片描述
      3. 变量存储的位置
      在这里插入图片描述
  • 基本数据类型转换

    • 自动类型转换:容量小的类型自动转换为容量大的数据类型。
    • 有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算。
    • boolean类型不能与其它数据类型运算。
    • 当把任何基本数据类型的值和字符串(String)进行连接运算时(+),基本数据类型的值将自动转化为字符串(String)类型。
    • 将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符:(),但可能造成精度降低或溢出,格外要注意。
    • boolean类型不可以转换为其它的数据类型。

JavaBean

JavaBean是一种Java语言写成的可重用组件。javaBean是指符合如下标准的Java类。

  • 类是公共的
  • 有一个无参的公共的构造器
  • 有属性,且有对应的get、set方法

重载(Overload)和重写(Override)

方法的重写Override和重载Overload是Java多态性的不同表现。重写Override是父类与子类之间多态性的一种表现,重载Overload是一个类中多态性的一种表现。

重载(overload)

  • 概念:在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数类型不同即可。
  • 特点:与返回值类型无关,只看参数列表,且参数列表必须不同。(参数个数或参数类型)。调用时,根据方法参数列表的不同来区别。
  • 示例:
    • //返回两个整数的和 int add(int x,int y){return x+y;}
    • //返回三个整数的和 int add(int x,int y,int z){return x+y+z;}
    • //返回两个小数的和 double add(double x,double y){return x+y;}

重写(override)

  • 定义:在子类中可以根据需要对从父类中继承来的方法进行改造,也称为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。
  • 要求:
    1. 子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表
    2. 子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型
    3. 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限
    4. 子类不能重写父类中声明为private权限的方法
    5. 子类方法抛出的异常不能大于父类被重写方法的异常
  • 注意:构造器Constructor不能被继承,因此不能重写Override,但可以被重载Overload。子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时声明为static的(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法。

JDK,JRE和JVM分别是什么以及它们之间的关系?

  • JDK(java Development Kit),是java的开发工具包。JDK是整个Java开发的核心,集成了JRE和开发工具包(通俗的说就是开发用的)
  • JRE(Java Runtime Envuronment),是java运行时环境。主要包含两部分,JVM的标准实现和java的一些基本类库。它相对于JVM来说,多出来的是一部分的java类库。(通俗的说就是运行用的)
  • JVM(Java Virtual Machine),是java虚拟机,它只认识.class这类的文件,它能将class文件中的字节码指令进行识别并调用操作系统向上的API完成动作。JVM是java能够跨平台的核心机制。(通俗的说就是跨平台用的,就是把我们写的代码,转换成class文件用的。)
    三者之间的关系: 简单来讲就是JDK包含JRE,JRE包含JVM(可见下图)
    三者之间的关系

Java两种核心机制

  • Java虚拟机 (Java Virtal Machine)
  • 垃圾收集机制 (Garbage Collection)

GC

GC是什么?

GC是垃圾收集的意思(Gabage Collection)。

为什么要有GC?

内存处理是编程人员容易出现问题的地方,当忘记进行内存回收或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的,Java语言没有提供释放已分配内存的显示操作方法。

垃圾回收器的基本原理是什么?

对于GC来说,当程序员创建对象时,GC就开始监控这个对象的地址、大小以及使用情况。通常,GC采用有向图的方式记录和管理堆(heap)中的所有对象。通过这种方式确定哪些对象是"可达的",哪些对象是"不可达的"。当GC确定一些对象为"不可达"时,GC就有责任回收这些内存空间。

垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?

可以。程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不保证GC一定会执行。

GC机制的关键点

  • 垃圾回收机制只回收JVM堆内存里的对象空间。
  • 对其他物理连接,比如数据库连接、输入流输出流、Socket连接无能为力。
  • 现在的JVM有多种垃圾回收实现算法,表现各异。
  • 垃圾回收发生具有不可预知性,程序无法精确控制垃圾回收机制执行。
  • 可以将对象的引用变量设置为null,暗示垃圾回收机制可以回收该对象。
  • 程序员可以通过System.gc()或者Runtime.getRuntime().gc()来通知系统进行垃圾回收,会有一些效果,但是系统是否进行垃圾回收依然不确定。
  • 垃圾回收机制回收任何对象之前,总会先调用它的finalize方法(如果覆盖该方法,让一个新的引用变量重新引用该对象,则会重新激活对象)。
  • 永远不要主动调用某个对象的finalize方法,应该交给垃圾回收机制调用。

JVM

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值