再谈java基础

java基础总结

  • java概述
    • java是什么
    • JDK、JRE和JVM三者的关系
    • 一个java程序的执行过程
  • java基础语法
    • 数据类型
    • java的堆和栈
    • 运算符
    • 注释
    • 流程控制语句
    • 访问修饰符
    • 关键字
    • 其他

java概述

java是什么

  1. java是一种面向对象的编程语言
    java语法具有简单易学,强类型机制,面向对象(封装、继承和多态),平台无关性(jvm跨平台),多线程并发,支持网络编程和安全健壮等特点。
  2. java是一种平台
    java虚拟机JVM实行跨平台,JVM一处执行,处处执行的特点是java编程语言的核心所在。
    不同的平台或者操作系统,只要安装了相应的虚拟机,或者说安装了不同的虚拟机,实现了相同的接口,java程序解释执行的字节码文件(不面向任何机器或平台,只面向虚拟机)就能在各个平台上相互交互,所以说,JVM是java实现跨平台的核心所在。只要java程序已经编译成字节码文件,这些字节码文件可以直接与平台底层交互的,因此在不同的平台就无需再次编译,可以直接运行,从而达到了java语言“一处执行,处处执行”的特点。

JDK、JRE和JVM三者的关系

  1. JDK
    JDK(Java Development Kit),即Java开发工具包,是Java开发环境,是java的核心所在。JDK=JRE+Java开发工具(编译器、反编译器、调试器等)。JDK是面向java开发者的。
  2. JRE
    JRE(Java Runtime Environment),即Java运行环境,支持Java程序运行的标准环境,包含JVM标准实现及Java基础和核心类库。JRE是面向使用java程序的用户的。
  3. JVM
    JVM(Java Virtual Machine),即Java虚拟机,是Java语言实现跨平台的核心。java虚拟机JVM实行跨平台,JVM一处执行,处处执行的特点是java编程语言的核心所在。JVM在不同平台之间相当于“翻译官”的存在。
  4. 三者关系
    再谈java基础_第1张图片
    JDK包含JRE,原因在于java开发者本身开发的程序也要执行,而要执行必须在JRE上执行,值得注意的是JRE有java.exe但没有javac.exe,无法编译Java程序,但可以运行Java程序。JRE包含JVM,因为JRE是java的运行环境,而要运行java程序,必须有负责解释执行字节码的工具或者容器,这就是JVM。JVM又不能单独执行class文件,解释class的时候JVM需要调用解释所需要的类库lib,这些类库包含在JRE中。

一个java程序的执行过程

  • 编译阶段:
    –javac java源文件的路径
  • 运行阶段:
    –打开DOS命令窗口
    –输入: java A
    –java.exe命令会启动java虚拟机(JVM), JVM会启动类加载器Classl oader
    –ClassLoader会去硬盘.上搜索A.class文件,找到该文件会将该文件装载到JVM当 中
    –JVM将A.class字节码文件解释成二进制1010101001这样的数据
    –然后操作系统执行二进制和底层硬件平台进行交互

java基础语法

数据类型

java是强语言机制类型,基本数据类型遵循最小作用域原则。基本数据类型的基础底层是整数类型(二进制补码形式的表示),小数类型、字符类型和布尔类型本质上就是数值类型;由字符类型衍生出String类型,进而衍生出数组、类和接口等引用类型。
分类

  • 基本数据类型
    • 字符类型(char)
    • 数值类型
      • 整数类型(byte、short、int、long)
      • 小数(近似)类型(float、double)
    • 布尔类型(boolean)
  • 引用数据类型
    • 类(class)
    • 接口(interface)
    • 数组([])
  • String类

java 基本类型数据表如下:
再谈java基础_第2张图片
switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 char上,是否能作用在 String 上

java中switch(expr )中的expr 目前只支持boolean类型表达式的限制:自jdk1.5之后支持long以下的数值(整数)类型,jdk1.7之后支持单字符和枚举类型,字符和枚举本质上也是数值类型。1.8之后支持字符串(等值比较)

Math.round(10.5) 等于多少?Math.round(-10.5)等于多少?Math.floor(10.5) 等于多少?Math.ceil(10.5) 等于多少?

Math.round(10.5)的返回值是 11,Math.round(-10.5)的返回值是-10。四舍五入的原理是在参数上加 0.5 然后进行下取整,或者是参数减0.4进行向上取整。Math.floor(10.5)的返回值是 10,向下取整(舍1);Math.ceil(10.5)的返回值是 12,向上取整(进1)。

long a = 5;是否正确?float f = 5.6;是否正确?

long a = 5; 正确,属于自动类型转换(小到大)。
float f = 5.6; 不正确,需要强制类型转换(大到小)。强制类型转换会存在丢失精度的问题,但也不能溢出类型小的范围。
注意:
byte b = 5; 属于强制类型转换(大到小),但是不会报错,这是系统自动帮你自动转换的。
int a = 5; byte b = a; 错误。我们可以把int类型的常量直接赋值给byte、short类型的变量,但不能把int类型的变量直接赋值给byte、short类型的变量。
强制类型转换成功的条件是 :被强制类型转换的实例必须是强制类型转换类型的类或者其派生类。

byte s1 = 1; s1 = s1 + 1;有错吗?byte s1 = 1; byte s2 = 2; s1 = s1 + s2;有错吗?byte s1 = 1; s1 += 1;有错吗?

byte s1 = 1; s1 = s1 + 1; 错误。1是int类型的,s1 + 1是int类型(算术运算符的结果类型为参与算术运算的变量或常量的最大类型所决定,这个最大类型最小为int类型,如果低于int类型,系统会自动转换为int类型)int类型不能直接赋值给byte类型的变量。同理,byte s1 = 1; byte s2 = 2; s1 = s1 + s2; 错误。
而 byte s1 = 1; s1 += 1;可以正确编译,因为 s1+= 1;相当于 s1 = (byte (s1 + 1);其中有隐含的强制类型转换。

java的堆和栈

变量

变量是值可以变的储存空间,变量一般初始化为无效值。
数组是一组(固定数量)类型相同的连续的储存空间的表示。
对象是一类具有相同属性和行为的事物抽象描述。

堆和栈结论

基本数据类型、局部变量、String类型的直接赋值和引用类型的引用都是存放在栈内存中的,用完就消失。如下图所示,栈内存特点是数据一执行完毕,变量会立即释放,节约内存空间;并且必须初始化变量的值。
再谈java基础_第3张图片
引用类型new创建的实例化对象、String类型的构造方法new出来的对象及数组,是存放在堆内存中的,用完之后靠垃圾回收机制不定期自动消除。如下图所示,堆内存中所有的实体都有内存地址值,系统会自动初始化变量的值;当堆内存中的实体不再被指向时,JVM启动垃圾回收机制,自动清除。而从JDK1.7开始,当堆内存中的实体不再被指向时,JVM会将地址贴上一个闲置或者垃圾标签,进行缓存处理,在一段时间内没有被再次使用,JVM才会启动垃圾回收机制进行清除该地址的空间。
再谈java基础_第4张图片
java中的绑定机制,是和地址有关系的,是java值传递现象的根本所在。简单的说,就是绑定栈的就是静态绑定机制,执行完值不变化;绑定堆的就是动态绑定机制,执行完值变化。

运算符

&&与&的区别

&&运算符是短路与运算,&运算符是按位与运算。短路的意思就是当左侧的表达式能确定最终结果时,右侧表达式不执行 ,而按位与就是左右两侧的表达式不论结果都要执行。

用最有效率的方法计算 10 乘以 0.5
10 >>1(右移 1 位相当于除以 2 的 1 次方,右移 31位相当于乘以 2 的 31次方)。
位运算符和逻辑运算符的使用如下:
再谈java基础_第5张图片

注释

在实际开发中: 总比例:源码注释 = 1:3

  1. 注释的两个功能
    (1) 解释提示: 规范,也是一种素养
    (2) 暂时不用,后期可能要用的代码,被注释的代码不会被编译和执行
  2. 注释的分类
    (1) 单行注释
    idea快捷键:	ctrl+/
    //xxxxx		
    
    (2) 多行注释
    idea快捷键:		ctrl+shift+/
    /*
    xxx
    …							
    xxx
    */
    
    (3)文档注释
    idea快捷键:		/*+enter
     /*
    *xxx
    *…							
    *xxx
    */
    
  3. 缩进:提升代码的层次感,提高代码的可读性。idea快捷键:ctrl+i。

流程控制语句

break、continue、return的区别

  1. break :结束循环语句和switch语句;
  2. continue:结束本次循环,进入下次循环,只能使用 在循环语句中;
  3. return:执行功能为结束方法和跳出方法体。

标号退出语句退出多重循环

在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环。例如:

public static void main(String[] args) {
	    ok:
	    for (int i = 0; i < 10; i++) {
	        for (int j = 0; j < 10; j++) {
	            System.out.println("i=" + i + ",j=" + j);
	            if (j == 5) {
	                break ok;
	            }
	        }
	    }
	}

访问修饰符

定义

Java中,可以使用访问修饰符对类、变量、方法和构造方法的访问权限进行限制或者说保护,本身就是java封装的体现。Java 支持 4 种不同的访问权限。

分类
private : 在同一类内可见。使用对象:变量、方法、内部类。 注意:不能修饰类(外部类)。
default (即缺省,什么也不写,不使用任何关键字): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
protected : 对同一包内的类和所有子类可见。使用对象:变量、方法、内部类。 注意:不能修饰类(外部类)。基类的 protected 成员属性是包内可见的,并且对子类可见;
public : 对所有类可见。使用对象:类、接口、变量、方法。

访问修饰符图示
再谈java基础_第6张图片
protected额外说明:若子类与基类不在同一包中,那么在子类中,子类实例可以访问其从基类继承而来的protected方法,而不能访问基类实例的protected方法。属性可见(子类,孙子类都可以),方法看来源于哪里,就是哪里所在的包以及子类(只有直系子类)。

关键字

final关键字的用法

final 修饰符,用来修饰类、方法和变量:

  • final修饰的类不能够被继承;
  • final修饰的方法不能被重写;
  • final修饰的变量为常量,是不可修改的(地址不变,基本类型值不变,引用类型的引用不变,引用类型的值可以改变)。

final finally finalize区别

  • final可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、修饰变量表示该变量是一个常量不能被重新赋值。
  • finally一般作用在try-catch代码块中,在处理异常的时候,通常我们将一定要执行的代码方法finally代码块中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。值得注意的是finally正常运行只有系统强制退出exit(-1)时才会退出不执行,其他情况最后必须执行finally语句的。
  • finalize是一个方法,属于Object类的一个方法,而Object类是所有类的父类,该方法一般由垃圾回收器来调用,当我们调用System.gc() 方法的时候,由垃圾回收器调用finalize(),回收垃圾,一个对象是否可回收的最后判断。

this关键字的用法

  • this 特指当前对象(哪个对象调用了带有this关键字的方法,this就是这个对象)。
  • 方法形参与成员名字重名时,用this来区分:
  • 可以出现在非静态方法或代码块中。
  • this(参数列表) 可以实现当前类中在一个构造方法中调用其他同参的构造方法。

super关键字的用法

  • super特指父类对象(哪个对象调用了带有super关键字的方法,super就是这个对象的直接父类,而且是唯一父类对象)。
  • 子类中的成员变量或方法与父类中的成员变量或方法同名时,用super进行区分。
  • 可以出现在非静态方法或代码块中。
  • super(参数列表) 可以实现当前类中在一个构造方法中调用父类的构造方法。

this和super的区别

  • this代表当前对象名(在程序中易产生二义性之处,应使用this来指明当前对象;如果函数的形参与类中的成员数据同名,这时需用this来指明成员变量名);super代表父类对象,引用当前对象的直接父类中的成员(用来访问直接父类中被隐藏的父类中成员数据或函数,基类与派生类中有相同成员定义时如:super.变量名super.成员函数据名(实参)。
  • this是当前对象,this(参数列表)在当前类构造方法调用其他重载构造;super是父类对象,super(参数列表)在子类构造中调用父类的构造;super()或者this()同时出现,super()或者this()必须放在第一句,这就说明两者不能同时存在构造方法里,但是在普通方法里可以出现。
  • this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
  • 子类的所有构造方法内部,第一行会(隐式)自动先调用父类的无参构造函数super(),除非自定义super(参数),否则父类的无参构造必须写,要不然子类的无参构造无法使用,因为父类的无参构造不存在。

static关键字

  1. static存在的主要意义
    static的主要意义是在于创建独立于具体对象的域变量或者方法。以致于即使没有创建对象,也能使用属性和调用方法

    static关键字还有一个比较关键的作用就是用来形成静态代码块以优化程序性能。static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。

    为什么说static块可以用来优化程序性能,是因为它的特性:只会在类加载的时候执行一次。因此,很多时候会将一些只需要进行一次的初始化操作都放在static代码块中进行。

  2. static的独特之处
    (1)被static修饰的变量或者方法是独立于该类的任何对象,也就是说,这些变量和方法不属于任何一个实例对象,而是被类的实例对象所共享。
    (2)在该类被第一次加载的时候,就会去加载被static修饰的部分,而且只在类第一次使用时加载并进行初始化,注意这是第一次用就要初始化,后面根据需要是可以再次赋值的。
    (3)static变量值在类加载的时候分配空间,以后创建类对象的时候不会重新分配。赋值的话,是可以任意赋值的!
    (4)被static修饰的变量或者方法是优先于对象存在的,也就是说当一个类加载完毕之后,即便没有创建对象,也可以去访问。

  3. static使用常被认为共享数据
    (1)被static修饰的属性和方法被称之为类属性与类方法,无须对象,通过类名就可以访问
    (2)但是static违背了OOP,JVM启动时装载字节码文件工程中创建所有静态内容,当JVM关闭时static内容才会消耗
    (3)何时使用:使用频次高,且当前工程中许多类需要用
    (4)静态方法只能访问静态属性和静态方法

  4. static应用场景
    因为static是被类的实例对象所共享,因此如果某个成员变量是被所有对象所共享的,那么这个成员变量就应该定义为静态变量。
    因此比较常见的static应用场景有:修饰成员变量 、修饰成员方法 、静态代码块 、修饰类【只能修饰内部类也就是静态内部类】 、静态导包。

  5. static注意事项
    静态只能访问静态。非静态既可以访问非静态的,也可以访问静的。

其他

  • abstract 修饰符,用来创建抽象类和抽象方法。由abstract修饰的方法,只做方法的声明,不能方法的实现。抽象方法不能被声明成 final 和 static。
  • synchronized 和 volatile 修饰符,主要用于线程的编程。synchronized 关键字声明的方法同一时间只能被一个线程访问
    序列化的对象包含被 transient 修饰的实例变量时,java 虚拟机(JVM)跳过该特定的变量。该修饰符包含在定义变量的语句中,用来预处理类和变量的数据类型。

你可能感兴趣的:(java基础,java,jvm,jdk,javase)