Java基础知识总结(一)

《Java基础知识总结》系列是对自己学习Java历程中知识的一个总结,也是为自己找工作前知识的回顾,为找工作奠定基础。

  1、Identifiers:标识符

   ①Names of class,method and variable:用于类名、方法名、变量名

  ②Begin with character,"_" or "$":标识符不能以数字开头

  ③Case sensitive:大小写敏感(区分大小写)

  ④No length limitation:长度无限制

  ⑤标识符不能是Java关键字,汉字也可以做标识符,但是不建议使用(使用汉字涉及到编码问题,跨平台时回出现问题)。

  ⑥String是Java的一个类,类名是标识符,所以String可以做标识符。

  ⑦There is no sizeof operator.Java中没有sizeof运算符,所以sizeof可以作为标识符

  ⑧关键字、保留字(const、goto、true、false、null)不能用作标识符。

 1 public class Identifiers {
 2     public static void main(String[] args) {
 3         String $abc="abc1";
 4         String _abc="abc2";
 5         //编译错误,标识符不能以数字开头
 6         //String 8abc="abc3";
 7         String 中国="China";
 8         String String="wanghao";
 9         int Integer=22;
10         //Java中没有sizeof运算符,所以sizeof可以作为标识符
11         String sizeof="sizeof";
12         System.out.println(String);//wanghao
13         System.out.println(Integer);//22
14     }
15 }

  2、Keywords:关键字

  The goto and const keyword are not used in the Java programming.

  const 保留关键字(留儿不用)。const是从C++继承而来的,但是Java并不使用const这个关键字,由于JVM是由C++编写的,因此,虽然Java并不使用const这个关键字,但却要保留下来。和const一样goto也是保留关键字!

  关键字全部用小写表示(53个)

  Strictly speaking,the literals true,false,and null are not keywords but literals;however,the distinction is academic.

true,false,and null是保留字但不是关键字,只是3个值,不能用来做关键字。

  

  3、Primitive data types:基本数据类型

  Java强数据类型只能先声明后使用。

  boolean    Boolean literals indicating true or false

  char       Stores one 16-bit unicode character

    char 同时具备字符和整数的特征。 

  byte       8-bit integer

  short      16-bit integer

  int        32-bit integer

  long       64-bit integer

    Integer Data Types-byte,short,int and long

  float       32-bit floating-point number

  double     64-bit floating-point number

  在范围内的常数可以自动转换类型,但是变量就不一定了。

  小————》大  自动转换

  大————》小  强制类型转化

  Byte相当于截取了最后8位,前面的全部舍去

 1 public class Demo {
 2     public static void main(String[] args) {
 3         int i1 = 5;  //语句1   Right
 4
 5         byte b1=5;   //语句2   Right
 6         byte b2=3;   //语句3   Right
 7         //byte b3=128;  //语句4  Wrong   128超出了byte的范围
 8         byte b3=(byte)128;  //语句5   Right
 9         //byte的取值范围:(-128,127)
10         byte b4=127;
11         byte b5=-128;
12         //byte b6=-129;  //-129超出了byte的范围
13
14         long l1=5;    //语句6    Right
15         long l2=5L;   //语句7    Right
16         //b1=i1;      //语句8  Wrong   i1不能转换成b1
17         b1=(byte)i1;  //语句9
18         l1=i1;        //语句10  Right
19         //i1=123L;    //语句11   Wrong
20         i1=(int)123L;  //语句12
21
22         //b1=b1+b2;   //语句13   Wrong  b1+b2变成int
23         b1=(byte)(b1+b2);  //语句14
24      }
25 }

  程序分析:

  ① 整形数据默(byte,short,int and long)认类型是int型,因此语句1正确

  ② 占用位数小的类型(简称“小类型”)向占用位数多的类型(简称“大类型”)可以自动转换,相反,大类型到小类型则要通过强制类型转换。

      如:语句6是由int---->long(自动转换)。

    语句11是由long---->int(不能进行转换,提示“可能损失精度”的错误),必须通过强制类型转换,改正后为语句12。

  ③ 语句2和语句3是由int---->byte(自动转换),这又是怎么回事呢?

    int可自动转换为byte和short而无需强制类型转换,这是因为byte和short表示的范围较小,所有小于int的整型运算,先转换为int类型,再参与运算。例如:15和20都在byte范围内但是15*20却超出了byte的表示范围,则要存放在int类型变量里面。

  ④ 既然int可以自动转换为byte和short而不需强制类型转换,那么为什么语句8会出错,需要改成语句9这样的强制类型转换呢?

     语句8表面上是int---->byte但是i1是一个int型的变量,它表示(-65535----65535)范围的整数,不能确定它的 值,因此需要强制类型转换。语句4中128超出了byte的表示范围,因此不能赋值给byte变量b3需要进行强制类型转换,如语句5。

  ⑤ 强制类型转换的实质是什么呢?

    例如语句5执行的结果是:-128,这是为什么呢?

      这正是强制类型转换后的结果。int类型是32-bit,128的二进制表示形式为:00000000,00000000,00000000,10000000。Byte类型是8-bit,要把int类型强制转换成byte类型,则只截取其后8-bit,把前24-bit去除掉。因此byte b3=(byte)128;执行后的结果的二进制表示形式为:10000000,对应的整数即为-128。

  ⑥ 所有小于Int的整型运算,先转成int 再运算,因此语句13出现错误,需要进行强制类型转换,如语句14。

 1 public class Float {
 2     public static void main(String[] args) {
 3         double d1=123.0;
 4         double d2=123.0F;
 5         //编译错误    Default data type is double
 6         //float f1=123.0;
 7         //需要强制类型转换
 8         float f1=(float)123.0;
 9
10         //int和long可以自动转换为float和double
11         float f2=123;
12         float f3=123L;
13         double d3=123;
14         double d4=123L;
15     }
16 }

  Float Point Data Type-float and double

  ① Default data type is double

  ② A float data is 32-bit long

  ③ A double data is 64-bit long

  ④ A float data ends with ‘f‘ or ‘F‘

  ⑤ A double data can end with ‘d‘ or ‘D‘

     在计算机领域对于float和double只能表示他们的近似值。因为小数可以无限,但是计算机表示的精度是有限的。

  ⑥ int和long可以自动转换为float和double

  Java变量类型:

  ① 基本类型:boolean,byte,char,shot,int,long,float,double

  ② 引用类型:所有类、接口、数组、枚举、标注

  

  Recommended Naming Rules

  ① Class names begin with uppercase character

  ② Interface names begin with uppercase character

  ③ Method names begin with lowercase character

  ④ Variable names begin with lowercase character

  ⑤ Constant variable names are in uppercase character,不同单词间用“_” 隔开,例如:USER_NAME。

  ⑥ Package names are in lowercase character

  规范我们可以违背,但是我们提倡遵守,养成一种良好的习惯!

  4、Operators  

  Assignment operators

  =   +=   -=   %=   *=   /=    <<=     >>=     >>>=    &=    ^=      |=

1 public class ByteDemo {
2     public static void main(String[] args) {
3         byte b1=2;
4         byte b2=3;
5         b1=(byte)(b1+b2);  // 语句1   加法,转int
6         b1+=b2;            //语句2    赋值,不转int
7     }
8 }

  b1+=b2;是否和语句b1=b1+b2完全等价?

    答案是否定的,上面程序中的语句1和语句2给出了证明。语句1中byte类型参数与运算时要先转换为int型,因此要进行强制类型转换。而语句2中,自动进行类型转换。(我的理解:我们可以把“b11+=b2;”看做是对“b1=(byte)(b1+b2);”的优化!)

  Comparison operators

  >    >=     <     <=     instanceof

  Equality operators

  = =        !=

  Arithmetic operators

  +       -       *       /        %

  Shift operators

  >>   <<    >>>

  Bitwise operators

  &     |      ^(按位异或)   ~(按位取反)

  Logic operators

  &&  (逻辑与) &      ||  (逻辑或)  |      !(逻辑非)

  &&和&都是逻辑与,它们之间的区别:&&是短路逻辑与,有短路的效果,效率更高。

  ||和|都是逻辑或,它们之间的区别:||是短路逻辑或,有短路的效果,效率更高。

  Conditional  operators

  ? :

  Other operators

  ++    --

 1 public class Test5 {
 2     public static void main(String [] args){
 3         int i=2;
 4         System.out.println(i++);   //2
 5         System.out.println(i);      //3
 6         int a=i++ + ++i;    //3+5=8
 7         System.out.println(a);
 8         System.out.println(i);  //5
 9         for(int j=0;j<1000;j++){
10             i=i++;
11         }
12         System.out.println(i);   //5
13     }
14 }

  程序分析:

  为什么经过1000次循环后,i=i++;的结果仍然是5?

  (老师讲解)++的运算符优先级高于=(赋值)运算符,i++的运算结果为5,进入寄存器,这时寄存器中存放的值为5。然后i的值变为6,继续执行赋值语句,赋值时,把寄存器中的值赋5值给i,因此i的值是5和6之间来回切换的!

  (我的理解)++的运算符优先级高于=(赋值)运算符,因此这个表达式的执行顺序如下:①运算i++这个表达式的结果为5 。----> ②i的值自加1(i++先参与运算,再自加1),即i的值变为6。----> ③将i++这个表达式的值,即第①部的结果赋值给变量i。("="表达式是将右边表达式的值赋值与左边的变量,因此是将5赋于i,而不是将6赋于i)。整个循环过程i的值在5和6之间来回切换。

时间: 2024-08-25 22:31:13

Java基础知识总结(一)的相关文章

java基础知识回顾之java Thread类学习(八)--java多线程通信等待唤醒机制经典应用(生产者消费者)

 *java多线程--等待唤醒机制:经典的体现"生产者和消费者模型 *对于此模型,应该明确以下几点: *1.生产者仅仅在仓库未满的时候生产,仓库满了则停止生产. *2.消费者仅仅在有产品的时候才能消费,仓空则等待. *3.当消费者发现仓储没有产品可消费的时候,会唤醒等待生产者生产. *4.生产者在生产出可以消费的产品的时候,应该通知等待的消费者去消费. 下面先介绍个简单的生产者消费者例子:本例只适用于两个线程,一个线程生产,一个线程负责消费. 生产一个资源,就得消费一个资源. 代码如下: pub

java基础知识回顾之java Thread类学习(七)--java多线程通信等待唤醒机制(wait和notify,notifyAll)

1.wait和notify,notifyAll: wait和notify,notifyAll是Object类方法,因为等待和唤醒必须是同一个锁,不可以对不同锁中的线程进行唤醒,而锁可以是任意对象,所以可以被任意对象调用的方法,定义在Object基类中. wait()方法:对此对象调用wait方法导致本线程放弃对象锁,让线程处于冻结状态,进入等待线程的线程池当中.wait是指已经进入同步锁的线程,让自己暂时让出同步锁,以便使其他正在等待此锁的线程可以进入同步锁并运行,只有其它线程调用notify方

java基础知识回顾之java Thread类学习(六)--java多线程同步函数用的锁

1.验证同步函数使用的锁----普通方法使用的锁 思路:创建两个线程,同时操作同一个资源,还是用卖票的例子来验证.创建好两个线程t1,t2,t1线程走同步代码块操作tickets,t2,线程走同步函数封装的代码操作tickets,同步代码块中的锁我们可以指定.假设我们事先不知道同步函数用的是什么锁:如果在同步代码块中指定的某个锁(测试)和同步函数用的锁相同,就不会出现线程安全问题,如果锁不相同,就会发生线程安全问题. 看下面的代码:t1线程用的同步锁是obj,t2线程在操作同步函数的资源,假设不

第1天:了解Java基础知识

Java的优势 1. 简单 不像C或者C++语言,Java中省去了对指针的操作.但是,Java中并没有省去指针,代替指针的是一种新的变量--引用,引用也是保存一个对象的内存地址. 2.方便 Java虚拟机自带垃圾回收器,能够自动回收内存资源.而C和C++语言,需要开发人员手动进行内存资源回收. 3.安全 不支持指针操作 4.平台无关性 Java语言是跨平台的,一次编译,到处运行. 而且,不同平台,C语言中数据类型所占的位数是不同的,而Java语言中,数据类型所占的位数是固定的. 5.面向对象 J

JAVA基础知识-java文化基础和运行环境

JAVA基础知识 1,java是95年sun公司推出的开发语言,发展很快,09年被oracle公司收购.至今分为SE.ME.EE三个发展方向和软件版本. 2,运行java的环境主要是通过JVM(java virtual machine)实现的.首先编写.java结尾的源文件,通过编译器编译成.class结尾的字节码文件,然后通过解释器实现在不同平台上一致运行的效果. 3,jvm,jre和jdk的区别:jvm,java虚拟机:jre,java运行环境,jdk:java开发工具包. 4,jdk的下载

java基础知识回顾之javaIO类--管道流PipedOutputStream和PipedIutputStream

管道流(线程通信流):管道流的主要作用是可以进行两个线程间的通讯,分为管道输出流(PipedOutputStream).管道输入流(PipedInputStream),如果想要进行管道输出,则必须要把输出流连在输入流之上.如图所示: 1.管道输入流应该连接到管道输出流 ,输入流和输出流可以直接连接       2.使用多线程操作,结合线程进行操作.通常由某个线程从管道输入流中(PipedInputStream)对象读取.          并由其他线程将其写入到相应的端到输出流中.不能使用单线程

Java基础知识——类装载器与反射机制

类装载器ClassLoader 类装载器就是寻找类的字节码文件,并构造出类在JVM内部表示的对象组件. 类装载器把一个类装入JVM中,要经过三步: 1.装载:查找和导入Class文件: 2.链接:执行校验.准备和解析(解析是可以选择的): 3.初始化:对类的静态变量.静态代码块执行初始化工作: 类装载工作由ClassLoader及其子类负责.JVM在运行时会产生三个ClassLoader:根装载器.ExtClassLoader(扩展类装载器)和AppClassLoader(系统类装载器). 根装

JAVA基础知识整理

一.首先先明白get与post的基本定义和区别: 这是两种在客户端和服务器端进行请求-响应的方法. 1get:从指定的资源请求数据. 2post:向指定的资源提交要处理的数据. get基本上用于从服务器取回数据,注意:get方法可能返回缓存数据. post可以从服务器上获取数据,不过,post方法不会缓存数据,并且常用语连同请求一起发送数据. 二. Jquery $.get()方法. $.get()方法通过Http Get发起请求,从服务器上请求数据. 语法:&.get(URL,callback

java基础知识回顾之java Thread类学习(五)--java多线程安全问题(锁)同步的前提

这里举个例子讲解,同步synchronized在什么地方加,以及同步的前提: * 1.必须要有两个以上的线程,才需要同步. * 2.必须是多个线程使用同一个锁. * 3.必须保证同步中只能有一个线程在运行,锁加在哪一块代码 那么我们要思考的地方有:1.知道我们写的哪些是多线程代码 2.明确共享数据 3.明确多线程运行的代码中哪些语句是操作共享数据的.. 4.要确保使用同一个锁. 下面的代码:需求:两个存户分别往银行存钱,每次村100块,分三次存完. class bank{ private int

java基础知识回顾之---java String final类普通方法

辞职了,最近一段时间在找工作,把在大二的时候学习java基础知识回顾下,拿出来跟大家分享,如果有问题,欢迎大家的指正. /*     * 按照面向对象的思想对字符串进行功能分类.     *      *      * 1,获取:     * 1.1 获取字符串中字符的个数(长度).     *         int length();     * 1.2 取字符串中的某一个字符,其中的参数index指的是字符串中序数.字符串的序数从0开始到length()-1 .     *