Java基础易错部分(完结)

学习需要沉淀!耐心看此文的踩坑总结,相信你会学到更多的Java知识。本文将持续更新。最新更新时间2019/09/21 16:49

目录直通车

一、关于Java平台

二、Java语言概论

1、Java独立于平台的原因

三、基本数据类型

1、合法定义变量名

2、整数的定义

3、单精度数的定义

4、Boolean值转为某类型的问题

5、某类型转为int类型的问题

6、整型常量的字长问题

四、运算符与表达式

1、运算符的优先级

2、Java位运算符

移位运算符规律

3、i++与++i的区别

4、&和&&的区别

五、流程控制

1、switch(expression) 语句

2、跳转语句

六、继承、多态、高级类特性和数组

1、继承

七、线程

1、补脑内容

2、线程易错内容整理


一、关于Java平台

SUN公司将Java划分为三个技术平台:JavaEE、JavaME、JavaSE。

简述

①SE最基本的版本,做桌面开发;

②EE企业级开发,指WEB B/S结构开发;

③ME针对手机嵌入式程序的开发。

详述

①JavaEE:这个版本以前被称为J2EE.企业版本帮助开发和部署可移植、健壮、可伸缩切安全的服务端Java应用。Java EE是在JavaSE的基础上构建的他提供Web 服务、组建模型、管理和通信API.可以用来实现企业级的面向服务体系结构(service-oriented architecture,SOA)和web2.0应用程序。

②JavaME:Java ME为在移动设备和嵌入式设备(比如手机、PDA、电视机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。Java ME包括灵活的用户界面、健壮的安全模式、许多内置的网络协议以及对于动态下载的连网和离线应用程序的丰富支持。基于Java ME规范的应用程序只需要编写一次,就可以用于许多设备,而且可以利用每个设备的本级功能。

③JavaSE:JavaSE以前称为J2SE.它允许开发和部署在桌面、服务器、嵌入式环境和实施环境中使用的Java应用程序。JavaSE 包括支持Java Web服务开发的类,并为Java Platform,Enterprise Edition(Java EE)提供基础。

二、Java语言概论

1、Java独立于平台的原因

Java 语言的执行模式是半编译和半解释型,Java 编写好的程序首先由编译器转换为标准字节代码作为中间码,然后由 Java 虚拟机去解释执行,Java 虚拟机把字节代码程序与各操作系统和硬件分开,从而使 Java 程序独立于平台。

这里再普及一个你可能不知道的 javac.exe 与 java.exe 的编译过程:

源文件(xx.java)----------Javac.exe----------->  二进制字节码(xx.class)  -----------Java.exe------------>  JVM

三、基本数据类型

1、合法定义变量名

标识符的命名规则是:

①以字母、下划线(_)、美元符号($)作为首字符首字符后面可以跟字母、下划线、美元符和数字;

②不限字符个数,但为便于阅读和记忆,不宜太长;

③变量名的首字符不能为“#”数字

2、整数的定义

①整数有三种表示方法,分别为八进制(int a=012;)、十进制(int a = 186;)和十六进制(如int d=0x123;)。

②八进制数以0开始,十六进制数以0x开始。

3、单精度数的定义

①单精度应该是浮点型,如float a = 0.2f;

②如浮点型数据(如 5.2 )后没有任何字母,计算机默认为双精度浮点型。

4、Boolean值转为某类型的问题

①布尔类型只有两个值:true(真)或 false(假)。

②不能将 boolean 类型的数值转换为其他基本数据类型。

使用时要注意:布尔型数据不可以和数字进行相互转换,布尔型数据一般用于逻辑判别,除局部变量之外,布尔型数据默认为 false。

5、某类型转为int类型的问题

字符常量是用单引号括起来的一个字符,如 'a'。用双引号括起来的是字符串,如 "ABC"。字符型数据类型能向 int 数据类型自动转换,而字符串不可以。

6、整型常量的字长问题

整型常量在计算机中默认占32位(一个byte(字节)等于8bit(位)),分 byte、short、int 和 long 4类,占多少位数与操作系统无关

①byte        8 bit

②short     16 bit      2byte

③int          32 bit     4byte

④long       64 bit     8byte

四、运算符与表达式

1、运算符的优先级

单目:单目运算符+ –(负数) ++ -- 等
乘除:算数单目运算符* / % + - 
为:位移单目运算符  <<   >> 
关系:关系单目运算符>  <   >=    <=    ==     != 
逻辑:逻辑单目运算符&& || & | ^ 
三目:三目单目运算符A > B ? X : Y 

2、Java位运算符

Java 位运算符包括:“~” 按位非(NOT),“&” 按位与(AND),“|” 按位或(OR),“^” 按位异或(XOR),“>>” 算数右移,“>>>” 逻辑右移,“<<” 算数左移,“<<<” 逻辑左移。“!”是“非”位运算符。

移位运算符规律

算术左移运算符

如计算 System.out.println(a <<  b);的运算结果,结果为:方法① a 乘上 2的b次方

方法②a的二进制中向左移动b位,并且在低位补零。此处我以a=2,b=2为例演示计算过程,2 的二进制是00000010,向左移动2 位,就变成了00001000,即8。

算术右移运算符

如计算 System.out.println(a >> b);的运算结果,结果为:方法① a 除以2的b次方

方法②a的二进制中向右移动b位,低位舍弃,高位补入原来高位的值右移一位相当于除2取商。此处若a=89,b=2,则89除以2,商是44。所以89>>1的结果是44。

注意:另外提一点,在正数情况下,算术右移(>> )和逻辑右移(>>>)算法一致,但负数不同。原因如下:

>>  :算术右移运算符,也称带符号右移。用最高位填充移位后左侧的空位。

>>>:逻辑右移运算符,也称无符号右移。只对位进行操作,用0填充左侧的空位。

以上总结的规律给你来个程序调试一下就能得出结论了:

public static void ShiftTest(){
     
        int a = 8;
        int b = 2;
        int leftResult;
        int rightResult;
        
        System.out.println("a="+a+",b="+b);
        leftResult = a << b;
        System.out.println(a+" * "+" 2`b");
        System.out.println("leftResult="+leftResult);
        
        rightResult = a >> b;
        System.out.println("rightResult="+rightResult);
  
    }

3、i++与++i的区别

先看下面一个题结果为下面的A还是B:

A. 4.0,40.0

B. 3.0,40.0

        float i = 3.0f;
        int n = 10;
        System.out.print(i++);
        System.out.println(","+n*i++);

此处选择B,原因为:i++是先赋值再加1,输出为3之后才加的1,所以在第二轮的计算中,i=4。

4、&和&&的区别

举个栗子吧,如   if(str != null && !"".equals(str)),当 str != null 的时候,接下来才会去执行: !"".equals(str),就相当于一个电路短路的问题。但是,if(str != null & !"".equals(str))  不管: str != null 的结果如何(即true,false),程序都会执行: !"".equal(str)。

运算法则

对于:&  -- >  只要左右两边有一个为false,则为false;只有全部都为true的时候,结果为true

对于:&& -- > 只要符号左边为false,则结果为false;当左边为true,同时右边也为true,则结果为true

五、流程控制

(最新更新时间:2019-09-04 19:33)

1、switch(expression) 语句

在 switch(expression) 语句中,表达式 expression 只能返回 int、byte、 short 和 char 类型的值!不能有double类型等。

2、跳转语句

这里主要讲一个坑:break也是跳转语句。跳转语句包含:break、return、continue。

六、继承、多态、高级类特性和数组

1、继承

(1)继承带来的最大的好处是类的可重用性,减少代码的冗余;另一个作用是规范子类的行为。 继承是面向对象的一个重要特性,对一个类的继承是指在现有类(父类)的基础上构建一个新类(子类),子类重用(继承)了父类的方法和属性,同时还可以向新类中增添新的方法的状态。所以,在子类中可以进行的操作是添加方法。但是不能减少或更换父类的方法。在对父类的方法进行重写的时候,方法的返回值、返回值类型、参数个数、相应的参数类型都要一一对应。

(2)在覆盖一个方法时,子类方法不能低于父类方法的可见性。即如果父类方法是 public,则其子类方法一定要声明为 public。

(3)java.lang.String 和 java.lang.StringBuffer 这两类都被定义为 final, final最终类指明该类不能有子类,即不可以被继承。

七、线程

1、补脑内容

(不愿看或已了解该内容可跳过此段)

(1)进程

进程是操作系统结构的基础;是 一 次程序的执行;是 一 个程序及其数据在处理机上顺序执行时所发生的活动。一 个程序进入内存运行,即变成 一 个进程,进程是处于运行过程中的程序,并且具有 一 定独立功能。描述进程的有句话非常经典的话:进程是系统进行资源分配和调度的 一 个独立单位。

(2)并发性(concurrency)和并行性(parallel)区别

并行指的是同 一 时刻,多个指令在多台处理器上同时运行。并发指的是同 一 时刻只能有 一 条指令执行,但多个进程指令被快速轮换执行,看起来就好像多个指令同时执行。

(3)线程

线程是进程中的—个实体,线程是程序执行流的最小单元,一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。
由于线程之间的相互制约,致使线程在运行中呈现出间断性每个程序都至少有—个线程,若程序是单线程的,则就是该程序本身。

(4)多线程

线程是程序中—个单—的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。
线程是JVM级别的,与JVM共存亡,所以关闭应用时要么停止线程要么关闭JVM。

(5)Java 中创建线程

Java 语言中提供两种创建线程的方法, 一种是通过继承 Thread 类创建线程,另一种是通过实现 Runnable 接口来创建线程。

2、线程易错内容整理

(1)在 Java.API 中支持线程的类或接口的有:java. lang.Thread、java. lang.Runnable、java. lang.ThreadGroup

(2)Java中的线程体是由线程类的 run() 方法定义,该方法定义线程的具体行为。Java语言中提供两种创建线程的方法,一种是通过继承 Thread 类创建线程,另一种是通过实现 Runnable 接口来创建线程,如果线程是使用独立的 Runnable 运行对象构造的,则调用该 Runnable 对象的 run() 方法。stop() 方法可以强行终止线程;sleep() 方法使一个线程暂停运行一段固定的时间,使比其优先级低的线程运行;resume() 方法是回复运行挂起的线程; start() 方法是开始运行当前线程。

(3)线程终止。举个例子吧,如何安全终止线程 t ?

中断线程比较安全的做法是引入共享变量,所以使用标志 flag,通过设置 flag 通知线程 t 结束是最好的办法。stop()方法是强制当前线程停止运行,并抛出 ThreadDead 错误。suspend()方法是临时挂起当前线程。yield()方法是使当前执行线程暂时停止执行而让其他线程运行。 Thread.stop,Thread.suspend,Thread.resume 和 Runtime.runfinalizers(),Exit 这些终止线程运行的方法已经被废弃,使用它们是极端不安全的。

(4)线程返回所持有的对象的锁。

对象的锁在如下几种情况下由持有线程返还:①当 synchronized()语句块执行完后;②当在 synchronized()语句块中出现异常 (exception) 时;③当持有锁的线程调用该对象的 wait()方法时。而调用线程的suspend()方法只是使线程暂时停止执行,可以使用其他线程调用 resume()方法恢复执行。

(5)线程的生命周期。

线程的生命周期主要分为如下几个状态:新建状态、可运行状态、运行状态、阻塞状态、终止状态。线程一旦创建,就开始了它的生命周期。线程的生命周期主要分为:①新建状态 (new),线程创建后处于该状态;②可运行状态 (Runnable),新建的线程调用 start()方法,将使线程的状态从 New 转换为 Runnable;③运行状态 (Running),运行状态使线程占有 CPU 并实际运行的状态;④阻塞状态 (Blocked),导致该状态的原因很多;⑤终止状态 (Dead),线程执行结束的状态,没有任何方法可改变它的状态。

八、Applet 程序设计

1、Applet 与 Application

Applet 是 Java 类,运行过程比 Application 更复杂,Applet 不能由 JDK 中的解释器 java 直接运行,要在浏览器或 appletviewer 中运行; Applet 的主类一定要定义为 java.applet.Applet 类或 JApplet 类的子类; Applet 与 Application 的主要区别在执行方式上,Application 以 mian()方法为入口点运行,applet不需要main()函数也能执行,比如说构造函数就已经把窗体绘制完成了。但两者都是通过” Javac”命令编译。

为了使 Applet 在浏览器中运行,所以需要在 HTML 文件智能嵌入相应的 Applet 类。

2、Applet 生命周期

Applet 生命周期包括 Applet 的创建(包含初始化)、运行与消亡。Applet 类提供了在生命周期不同阶段响应主要事件的4种方法,这4种方法的调用次序如下图所示:

Java基础易错部分(完结)_第1张图片

 

九、其它

1、二分查找算法

适用于排好序的数组

定义三个变量: min , max ,则 mid=(min+max)/2,
如果 value == arr[mid],中间值即为查找的值,return mid;
如果 value < arr[mid], 要找的值小于中间的值,则再往数组的小端找, max=mid-1;
如果 value > arr[mid], 要找的值大于中间的值,则再往数组的大端找, min=mid+1;
e、g:(13, 18,24,35,47,50,62,83,90,115,134) 查找到90需要比较做少次?
首先将 90 与表中间的元素 50 进行比较,由于 90 > 50,所以在后半部分查找;
第二次比较的元素是后半部分的中间元素90相等。所以共查询2次。

 

推荐阅读:Java初级面试题集锦

 

你可能感兴趣的:(Java)