02Java的基本语法

1、常量与变量

程序执行中值不会变化的为常量,会变化的为变量。如定义一个常量PI,表示圆周率,圆周率不会改变;定义一个变量stuNo,表示学号,学号则会根据学生的改变而相应的改变。

2、Java中的标识符

标识符是用来给类,变量、常量进行取名字的符号。定义标识符具有一定的规则,规则如下:

  大小写敏感;

  支持字母数字下划线及$;

  数字不能放在首位,即不能做首字符;

  长度无限制;

  不能是Java关键字;

  支持中文,但不建议;

  所有类的类名已经是标识符(String)。

同时,对标识符也具有一定的命名规范,针对不同的Java标识符,其规范不尽相同:

类名,接口名:每个单词的首字母应该大写,尤其第一个单词的首字母应该大写。(驼峰规则)。如class HelloWorld,Interface Animal

方法、属性、变量::第一个单词首字母应小写,其他单词首字母大写。如String empNo;void setName(String name);

常量:全部用大写字母表示。如果由几个单词组成,则由下画线连接。public final int  PI;public final int HEAD_COUNT;

包: 全部用小写字母。如:package cn.onlylove.domain


标识符示例

3、Java中的关键字

3个保留字:true,false,null

50个关键字。

4、Java中的注释

良好的编程规范中,注释必须写上,以便其他人阅读、引用和维护。

单行注释  //...

多行注释  /* ....*/,多行注释不支持嵌套。

文档注释  /** ... */

可以通过使用JDK的javadoc工具从原文件中将文档注释抽取出来,从而形成帮助文档。如JDK的API文档。

5、Java中的注释

Java是一种强类型语言,意思是说在程序的开发过程中,如果要使用某个变量,必须先对该变量进行声明。Java中对变量的声明,需要使用相应的数据类型,Java中数据类型分为2种:基本数据类型与引用数据类型。

首先看一下Java中的引用类型。所有的类,所有的接口,所有的数组,枚举,标注。都是引用类型。

基本数据类型总计8种,按照存储的是字符、整数、浮点数、布尔值分为4类。如下图所示:

Java基本数据类型

-->布尔型boolean

java中boolean只有true和false两个值,代表真和假。定义方法如下:

boolean isExist=true;

对一个变量进行第一次赋值的操作叫作对变量的初始化。

boolean的作用:

1、作为条件判断

2、只有两种状态的时候作为条件的区分。

-->字符型char

字符类型用来存储单个字符,占用16位2个字节的内存空间,因为char类型占用16位,因而其至多可以定义2的16次方个字符, 同时因为其也是占用两个字节,因此也可以将单个中文汉字定义为char类型。对char类型的变量进行初始化时需要在其值的两边用单引号括起来,定义方法如下:

char a=’a’;//正确

char a=’你’;

char a=’ab’;//错误

也可以将0-65535范围内的整数定义为char变量,JVM将根据ASCII码转换为对应的字符。

char a=97;//如果输出,将输出字符a

-->整数型

了解整数类型之前,先需要了解计算机中的各类数字进制表现形式:

二进制:只有1和0两个值

八进制:0开头。由0-7表示。

十进制:正常显示,即日常使用的数字类型。不能以0开头(0除外)。

十六进制:0x或者0X开头。0-9由数字表示,10-15由a-f表示。

进制间的转换:

学会各类进制与十进制之间的转换,则各种之间也就明了了。

二进制与十进制的转换。

二进制111则表示为1*22+1*21+1*20=4+2+1=7(2的平方,2的1次方,2的0次方)

八进制与十进制的转换。

八进制01011=1*83+0*82+1*81+1*80=512+0+8+1=521(8的立方,8的平方,8的1次方,8的0次方)

八进制031=3*81+1*80=25(8的1次方,8的0次方)

十六进制与十进制的转换

十六进制0X25=2*161+5*160=32+5=37(16的1次方,16的0次方)

十六进制0Xb01e=b(11)*163+0*162+1*161+e(14)*160=45056+0+16+14=45086

重点只要会二进制与十进制互转即可。

网上有个段子,说是一个程序员522那天送花给女朋友,被拒绝了。通过心算后得出

522=5*16平方+2*16的1次方+2*16的0次方=1280+32+2=1314得出522是程序员的情人节。之后把花扔了,觉得女方配不上这么聪明的男人。

整数型数据类型根据所占内存大小不同分为byte,short,int,long。(在内存中的二进制表示时所有的第一位均做符号位 1负0正)。在代码中,整数型的默认类型是int,浮点型默认类型是double。

负数的二进制表示法:

原码,反码,补码。

-5如何表示?

5的二进制为:0000 0000 0000 0000 0000 0000 0000 0101,此为原码。

其反码为:1111 1111 1111 1111 1111 1111 1111 1010,此为反码。

补码为反码+1:1111 1111 1111 1111 1111 1111 1111 1011。这就是-5。

负数的表示即为对应的补码。

byte 8位;表示2的8次方个数:负2的7次方到正2的7次方减1

short 16位;  同上

int 32位 ;同上

long  64位;  同上

由于相应的数据类型只能取相应范围内的数值,因此,在定义变量并初始化时,若变量取值超出其相应范围,则会发生报错或者发生相应的强制类型转换。看如下代码


byte b=12;

byteb2=129;//false(超过范围)byte最大为127

char c1='a';

String s="a";

int i1=c1;//char 既能当字符也能当数字。

inti2=s;//false

String不能当数字用,因为它是一个引用,是个地址。

int i3=20;

b=i3;//false 变量和常量的区别。不能保证i3在byte范围内,因为i3可能会有改变,20永远是20,i3不一定。


--> 浮点型

float 32位

double 64位。

二者都是近似值。

单精度

float f=1.0//错误,默认为double

双精度。

二者的取值范围和精度是不同的 float的精度是6位有效数字,取值范围是10的-38次方到10的38次方,float占用4字节空间 double的精度是15位有效数字,取值范围是10的-308次方到10的308次方,double占用8字节空间。

--> 基本数据类型强制类型转换

double d1=1.0;

double d2=0.54;

float f;

f=(float)(d1-d2);

用于解决上面的问题。但仍然不要超过各类型的范围。上面成功的是自动类型转换。

所谓自动类型转换:

1、整数之间,小范围向大范围自动转换。

2、整数向浮点自动转。

3、范围以内的常数自动转。

问题:如下将输出什么?

byte b=(byte)128;

System.out.println(b);

答案:-127,为什么?

大类型转小类型时将截断

Java中数字默认为Int类型,占32位。因此,在内存中128是如下表示:

0000 0000 0000 0000 0000 0000 1000 0000

在将128转换为byte类型时,只占8位。在内存中为

1000 0000 即为-127。

强制类型转换时,只截取当前位数内的字符进行截取。

6、运算符

-->赋值运算:=可以引申出来+=,-=,*=等等,。


int a = 5;

int b = 2;

double d = 5;

double d2= 5.1;

int i=10;

i+=3*5;//i=25,先计算右边,再与左边进行赋值运算

byte b1 = 2;

byte b2 = 3;

b1 += b2;// 赋值语句

b1 = (byte) (b1 + b2);// java把关于byte

short的运算都转成int以后再进行运算


练习:用Scanner输入一个秒级数字,将其转换成X小时X分X秒


     Scanner sc=newScanner(System.in);

      int time=sc.nextInt();

      int h=time/3600;

      int m=time%3600/60;

      int s=time%3600%60;

      System.out.println(h+"小时"+m+"分"+s+"秒");

      sc.close();


-->算术运算符:+ = * / %


System.out.println(a+b);//7

System.out.println(b-d);//-3.0

System.out.println(a * b);//10

System.out.println(d / b);//2.5

System.out.println(d2 % b);//1.09999

System.out.println(d % b);//1.0


-->比较运算符:> >= < <= == !=。


     int a=10;

      int b=20;

      System.out.println("a="+a+",b="+b+",那么:");

      System.out.println("a>b:"+(a>b));//false

      System.out.println("a=b:"+(a==b));//false

      System.out.println("a

      System.out.println("a!=b:"+(a!=b));//true


-->逻辑运算符:

短路运算:(且&&  或||),非短路运算:(且& 或 |)

短路运算中,当前面的一个表达式可以决定结果时,后面的语句将不再执行,非短路运算会继续判断后面的。因而短路运算其效率高于非短路运算。


      int a=10;

      int b=20;

      boolean flag1=((a=5)>12)&&((b=3)>9);

     System.out.println("flag1:"+flag1);//false

      System.out.println(a);//5

      System.out.println(b);//20,表明&&后面未执行


     int a=10;

      int b=20;

      boolean flag1=((a=5)>12)&((b=3)>9);

      System.out.println("flag1:"+flag1);//false

      System.out.println(a);//5

      System.out.println(b);//3,表明&后面的也执行了


-->位运算:& | ^

&(AND)|(OR) ^(XOR异或) ~(补码)按位取反=加1再取反(全1的补码是-1)。只要掌握好负数的内在占位情况就好计算。


int a=5&-4;//将5与-4进行与运算。

      System.out.println(a);//4

      //内存中格式为:

      //5是      0000 00000000 0000 0000 0000 0000 0101

      //-4是   1111 1111 11111111 1111 1111 1111 1100

      //&结果  0000 0000 0000 0000 0000 0000 0000 0100



-->移位运算:

>>右移:全部向右移动,移到右段的低位被舍弃,最高位则移入原来最高位的值。右移N位相当于除以2n。

>>>无符号右移:同上,只是最高位变成0.因此负数的移位与>>有区别,正数与>>无区别。

<<左移:全部向左移动,右侧低位补0。

移位运算一般而言都是int类型(默认类型),因此,当移位位数超过32位时,取对32的求余即可。Java中默认理解为超过32位的移位无意义。


     System.out.println(7 >> 2);

      //00000111-->00000001  相当于7/(2*2)=1

      System.out.println(7 >> 34);

      // java移位时,先将移位数%32,此处34%32=2。由相当于7>>2

      System.out.println(7 >> -30);

      // 负数次数时,先加上32倍数,转成正数以后才移位

      System.out.println(-7 >> 2);// -2

      //负数的高位仍然是1

      //1111 1111 1111 1111 1111 1111 1111 1001

      //右移2位变成 1111 1111 1111 1111 1111 1111 1111 1110为-2

      System.out.println(-7 >>> 2);

      //无符号右移,最高位补为0

      //右移2位,最高位补为0   0011 1111 1111 1111 1111 1111 1111 1110为1073741822


-->自增、自减运算 ++ --

++ 变量自增

--变量自减

i++相当于i=i;i+1;

++i相当于i=i+1;


     int i = 2;

      System.out.println(i++);//2

      System.out.println(i);//3

      int b = i++ + ++i;//3+5

      System.out.println(b);//8

      for(int j=0;j<10;j++){

          i = i++;//i++;i=5;

      }

      System.out.println(i);//5


-->三目运算 ?:


int a = 3;

double b = 5.0;

//可以转换类型的就转换成同一类型

System.out.println((a>b)?b:a);//3.0

//不可以转换类型的就保持原有类型

System.out.println((a>b)?"ok":a);//3,早期版本可能不支持如此写法。


-->运算符的优先级:

=最低,其余根据需要添加相应的括号()即可。()最高。

7、控制语句

If(){}else{}

If(){}else if(){}

If(){……if(){}……}


int a = 3;

      int b = 5;

      if(a>b){//分支{}如果只有一个语句{}可以省略,但不建议。

         System.out.println("a大");

      }else if(a

         System.out.println("b大");

      }else{

         System.out.println("a b相等");

      }


三重以上的选择时,建议使用switch进行判断。

switch(变量){//变量类型固定:byte,short,char,int,enum,String.其中enum须在jdk5.0及以上,Sting需要jdk1.7以上。

case:break; //每一个case后面跟一个有限值,后面再跟语句,最后跟一个break;用break跳出语句。

default: //其它值,不在case中的任何一个。

}//有限的值(case)加上一个default;default如果放在最后,就不要加break;如果放在其它位置,则要加break;case后的值必须是常量。

//最后一个分支可以不加 break;除此之外其它的都要加break;


Scannersc = new Scanner(System.in);

      System.out.println("请输入您的分数");

      int y = sc.nextInt();

      switch (y) {

      case 5:

        System.out.println("优");

        break;

      case 4:

        System.out.println("良");

        break;

      case 3:

        System.out.println("及格");

        break;

      case 2: // System.out.println("不及格"); break;

      case 1:

        System.out.println("重修");

        break;

      default:

        System.out.println("输入错误");

        break;

      }

      sc.close();


8、循环语句

程序执行到控制语句时,会有多个选择,选择哪一个取决于选择条件,选择完成后只会执行某一个条件下的语句,但循环是不一样的。

循环:反复做同一件事情的时候,如,打印1-10000;找出1-10000里面所有的奇数。

for/while/do while其中for/while是等价的。do while不同。

-->for

for( ; ; ){}小括号内是三段论,第一段循环变量(用于控制循环次数的变量)的声明和初始化。第二段放条件,第三段放循环变量的变化。大括号内书写循环体(反复执行的语句);


for (int i = 1; i <= 10; i++) {

        System.out.println("i=" + i);

      }


死循环:按中止按钮或者在控制台中按ctrl+c,或者ctrl+d结束循环。for(;;)

循环次数不定的循环:for(;;){循环语句; if(条件){break;}}。break可以跳出循环:


Scannersc=new Scanner(System.in);

      for(;;){

      Stringstr=sc.next();

       if(str.equals("bye")) break;

      System.out.println("你说:"+str);

      }

      //break后到这里,已经跳出循环。

      sc.close();


练习

1、 用两种方式输出1-100内的奇数。

2、 做一个猜数据的小游戏,生成1-100的随机数,然后猜,用键盘输入int,提示输入的数字是更大还是更小,如果猜对就输出猜对了,并输出猜了几次并退出程式。

3、 打印一个图形,如下所示:

*

**

***

****

*****

4、 打印一个图形,第一行一个*,第二行3个*,第三行5个星,打印几行由系统输入决定。

5、 打印1-100里面的所有质数,所谓质数,即只可以被1和其本身整除的数字。

6、 打印九九乘法表。

7、 有36人,36块砖,男人每人能搬4块,女人每人搬3块,小孩2人搬一块,要求一次把所有的砖搬走。三类人都需要的前提下,问几个男人,几个女人,几个小孩?


Random rand=new Random();

   int num=rand.nextInt(100)+1;

   Scannersc=new Scanner(System.in);

   int count=0;

   for(;;) {

      count++;//每进入一次循环,则统计一遍次数.

      System.out.println("请输入一个数字:");

      int guess=sc.nextInt();

      //通过比较,判断所猜数字是否与系统数字一致

      if(guess

         System.out.println("小了");

      }else if(guess>num) {

         System.out.println("大了");

      }else {

         System.out.println("恭喜你,猜对了!总共猜了"+count+"次!");

         if(count<5) {

            System.out.println("你可以去买彩票了!");

         }

         break;//猜对后,结束循环退出程序.

      }

   }

      sc.close();


-->break与continue的区别

break结束当前循环,continue结束当前这个变量所在的循环,继续下一变量的判断。


as: for (int i = 1; i <= 9; i++) {

            for (int j = 1; j <= i; j++) {

                if (i * j % 12 == 0) {

                  continue;//i*j=12的倍数时,不打印,继续下一循环。

                }

                if (i * j % 28 == 0) {

                   break;//i*j=28的位数时,退出当前里面的这个for循环

                }

                if (i * j % 32 == 0) {

                   break as;//退出整个循环

                }

                System.out.print(j + "*" + i + "=" + (i * j) + "  ");

            }

            System.out.println();//一个小循环,则换一行

         }

   }


-->while

while(条件){循环语句;循环变量变化;}


int i = 0;

      //打印100以内的奇数

      while (i < 101) {

         if (i % 2 != 0)

            System.out.print(i + " ");

         i++;

      }


while死循环:while(true){循环语句;}

次数不确定的while循环:while(true){循环语句;if(条件) break;}

do…while:do {循环体;循环变量变化;}while(true);此种循环循环体至少执行一次,无论条件是否满足。


int i = 1;

      do {

         System.out.println(i);

         i++;

      }while (i < 0);


      System.out.println("*********");


      for (int j = 1; j < 0; j++) {

         System.out.println(j);

      }


练习:

1、 给定一个整数,将其反向输出,如给定1234,则输出4321.

2、 打出空心菱形。

3、 打印空形矩形。

4、 打印空心三角形。

5、 打一条内三角形。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • Java经典问题算法大全 /*【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子...
    赵宇_阿特奇阅读 1,852评论 0 2
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔...
    叶总韩阅读 5,129评论 0 41
  • 1 关键字 1.1 关键字的概述 Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或...
    哈哈哎呦喂阅读 646评论 0 0
  • 宝宝又要吃奶?又双要吃奶?又双叒要吃奶? 宝宝咋醒了?又双醒了?又双叒醒了? 宝宝你能好好吃么?扯啊扯的,妈妈很疼...
    娃咋养阅读 978评论 0 0
  • 在JavaScript中 使用 0-9 这些数字表示 number 使用 “ ” 或者 ' ' 引号括起来的表示 ...
    loster阅读 176评论 0 0