(一)java基础语法自学(知识模块较完整)

1.标识符:java对各种变量、方法和类等要素命名时使用的序列成为标识符。

凡是自己可以起名字的地方都叫标识符,都遵守标识符的规则。

标识符的命名规则:(这些不用记,注意一下就行)

1)标识符由字母、下划线“_",美元符"$"或数字组成。

2)标识符应以字母,下划线,美元符开头。

3)java标识符大小写敏感(指带小写含义不同,A是A,a就是a,两者不能代替),长度无限制。

4)应见名知意且不能与java语言的关键字重名。

合法的标识符不合法标识符
HelloWorldHell Word
CarCar*
_969.6
$yh_00#67

2.关键字:java中一些赋予特定的含义,用作专门用途的字符串成为关键字(大多数编辑器会将关键字用特殊方式标出)。

java中所有的关键字都是小写英文,goto和const虽然未使用,但也作为Java 的保留字。

abstract

assert

boolean

break

byte

case

catch

char

class

const
continuedefaultdodoubleelse
enumextendsfinalfinallyfloat
forgotoifimplementsimport
instanceofintinterfacelongnative
newpackageprivateprotectedpublic
returnstrictfpshortstaticsuper
switchsynchronizedthisthrowthrows
transienttryvoidvolatilewhile
truefalsenull 

3.java的常量:java的常量值用字符串表示,区分为不同的数据类型。

如:

整型常量(整数)123

实型常量(实数,带小数点的)3.14

字符常量(在计算机里也是一个数字来表示的,如ascII码)'a'

逻辑常量true、false

字符串常量“abc”

注意:1)区分字符常量和字符串常量。

          2)“常量”这个名词还会用在另外其他语境中表示值不可变的变量,如final修饰的。

4.java变量:java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。

(1)java程序中每一个变量都属于特定的类型,在使用前必须对其声明,

声明格式为:type varName[=value][{varName}[=value]](这种东西不用记,记住例子就可以了)

例如:

int i=100;

double a,b,c=0.123;

String str=“abc”;

从本质上讲,变量其实是内存中的一小块区域,使用变量来访问这块区域,因此,每一个变量使用前必须要先申请(声明),再赋值,才能使用。

程序的执行过程:heap主要作用就是动态分配内存。

(2)java的变量分类

1)按声明位置划分

局部变量:方法或语句块内部定义的变量。

成员变量:方法外部、类的内部定义的变量

注意:类外面(与类对应的大括号外面)不能有变量的声明。

例子1:

//类外不能声明变量
public class HelloWorld{
	//成员变量(注意没有像c++一样有什么全局变量),作用域在这整个类中
	int a=200;
	//args,方法参数也属于局部变量
	public static void main(String[] args) {
		//局部变量,作用域在main方法里,出了main后的大括号就没人认识它了
		int i=100;
		System.out.println("HelloWord");
	}
}

2)按所属的数据类型划分。

基本数据类型变量

引用数据类型变量

(1)boolean类型适用于逻辑运算,一般用于程序流程控制。boolean类型数据只允许取值true或false,不可以0或非0的整数代替true和false,这点与C语言不同。

//用法举例
boolean flag;
flag=true;
if(flag){
    //do something
}

(2)char型数据用来表示通常意义上“字符”。

字符常量为用单引号括起来的单个字符,例如:

char e='a'; 

char e='中';

java字符采用Unicode编码,每个字符占两个字节(1个字节占8位,数据在计算机底层存储,用0101表示,每一个0,1都叫一个位(byte)),因而可用十六进制编码形式表示。例如:

char c1='\u0061';(在内存中应是01100001,\u指的是后面4位数是十六进制的Unicode编码)

注:Unicode编码是全球语言统一编码。

java语言中还允许使用转义字符‘\’来将其后的字符转变为其它的含义,例如:

char c2='\n';

补充:二进制、十进制、十六进制之间的转换

例子

1101——1*1+0*2+1*4+1*8

13——1+4+8 ——1101

1101——D     (1,2,3,4,5,6,7,8,9,A(10),B(11),C(12),D(13),E(14),F(15))

(3)整数类型(java里面所有的数都是带符号的)

java各整数类型有固定的表数范围和字段长度,其不受具体操作系统(windows,linux,mac...)的影响,以保证java程序的可移植性。

java语言整型常量的三种表示形式:

1)十进制整数,如:12,-31,0

2)八进制整数,要求以0开头,如:012(因0开头,010就不确定是什么进制表示的了,为了避免混淆不建议用八进制)

3)十六进制数,要求Ox或OX开头,如:OX12

注意:不管是什么进制在计算机中都是以二进制表示,所以不管是十进制,八进制,十六进制来表示,只要是表示的同一个数它在计算机中的存储都是一样的。

java语言的整型常量默认为int型,声明long型常量可以加l或L(我建议加L好区分)

类型占用存储空间表数范围
byte1字节-128~127(-2^7~2^7-1)
short2字节-2^15~2^15-1
int4字节-2^31~2^31-1
long8字节-2^63~2^63-1

(4)浮点类型:java浮点类型有固定的表数范围和字段长度,不受平台影响。

java浮点型常量有两种表示形式

1.十进制数形式,例如:3.14    41.0   .314

2.科学计数法形式,如3.14e2   3.14E2   100E-2

java浮点型常量默认为double,如果声明一个常量为float,则需在数字后面加f或F,如:

double d=123.4; float f=12.3f;//不加f则出错,f必须加

类型占用存储空间表数范围
float4字节-3.403E38~3.403E38(小数点后有效位数7位)
double8字节-1.798E308~1.798E308(小数点后有效位数15位)

注意:浮点数在计算机中表示是离散的,有误差,在有效位数(精度)之后就不精确了,浮点数值不适用于禁止出现舍入误差的金融计算中。如果需要在数值计算中不含有任何舍入误差,就应该用BigDecimal类。

5.数据类型转换

boolean类型不可以转换为其它的数据类型。

整型,字符型,浮点型的数据在混合运算中相互转换,转换时遵循一下原则:

注:实箭头表示无信息丢失的转换;虚箭头,表示可能有精度的丢失。

1)容量小的类型自动转换为容量大的数据类型;数据类型按容量大小(指表示数的大小)排序为:

byte,short,char->int->long->float->double

2)容量大的数据类型转换为容量小的数据类型时,要加上强制转换符,但可能造成精度降低或溢出,使用时要注意。

比如double类型(8)强制转换成float类型(4)就很容易溢出。

int强转byte,可以砍掉,没有影响,内部格式没问题。而double强转为float则不能砍掉,因为带有小数,内部格式会出问题,这也是float后面必须加f的原因。

3)有多种类型数据混合运算时,系统首先自动的将所有数据转换成容量最大的那一种数据类型,然后再计算。

6.程序格式

目的:要别人看的更清楚,让别人看这个更舒服就可以。

格式应该注意的问题:(若用ide则不用考虑,一般ide都有格式调整的功能)

1)大括号对齐

2)遇到{缩进,Tab/Shift+Tab

3)程序块之间加空行

4)并排语句之间加空格

5)运算符两侧加空格

6){前面有空格

7)成对编程

例子:

import test.Student;
import java.util.ArrayList;
import java.util.List;
import java.util.Comparator;
import java.util.Collections;

/**
 * 说明:
 *
 * @author huayu
 * @date 2018/7/30 下午4:31
 */

public class Test1 {

    public static void main(String[] args) {
        List<Student> list = new ArrayList<Student>();
        list.add(new Student("Hao LUO", 33));
        list.add(new Student("XJ WANG", 32));
        list.add(new Student("Bruce LEE", 60));
        list.add(new Student("Bob YANG", 22));
        /*通过 sort 方法的第二个参数传入一个 Comparator 接口对象
         相当于是传入一个比较对象大小的算法到 sort 方法中
         由于 Java 中没有函数指针、仿函数、委托这样的概念
         因此要将一个算法传入一个方法中唯一的选择就是通过接口回调
         */
        Collections.sort(list, new Comparator<Student>() {
            //            @Override
            public int compare(Student o1, Student o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });
        for (Student stu : list) {
            System.out.println(stu);
        }

    }
}

7.运算符

(1)java语言支持的运算符

分类运算符
算数运算符+,-,*,/,%(取余),++,--
关系运算符>,<,>=,,<=,==,!=
逻辑运算符!(非),&(与),|(或),^(异或),&&(短与),||(短路或)
位运算符&,|,^,~,>>,<<,>>>
赋值运算符=
扩展赋值运算符+=,-=,*=,/=
字符串连接运算符+

注意:

1)自增和自减运算符:++(--)在前时先运算再取值,在后时先取值再运算。

2)逻辑运算符

a^b:相异为true

&(&&):同真为真  ,短路与(&&)只要第一个为false,第二个操作数就不算了。   |(||):同假为假,短路或运算(||)同短路与(&&)

ab!aa&ba|ba^ba&&ba||b
truetruefalsetruetruefalsetruetrue
truefalsefalsefalsetruetruefalsetrue
falsetruetruefalsetruetruefalsetrue
falsefalsetruefalsefalsefalsefalsefalse

3)赋值运算符与扩展赋值运算符

赋值运算符

当“=”两侧数据类型不一致时,可以使用默认类型转换和强制转换原则进行处理。

注意:可以将整型常量直接赋值为byte,short,char等类型,而不需要进行强制类型转换,只要不超出表数范围就可以。

扩展赋值运算符

运算符用法举例等效的表达式
+=a+=ba=a+b
-=a-=ba=a-b
*=a*=ba=a*b
/=a/=ba=a/b
%=a%=ba=a%b

4)字符串连接符(+)

“+”运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接。

举例

String str=1+"2";

System.out.println(str);//12

注意:当进行打印时,无论任何类型,都自动转为字符串进行打印。

5)三目运算符

语法格式:x?y:z

其中x为boolean类型表达式,先计算x的值,若true,则整个三目运算的结果为y的值,否则整个运算结果为表达式z的值。

(简单说,若x判断为true,值就是y;若x判断为false,值就是z)

(2)表达式:是符合一定语法规则的运算符和操作数的序列(最后能算出一个值来)

举例:a

          a+5.0

       (a+b)*c-1

        i<22&&i%10!=0

表达式的类型和值:

1)对表达式中的操作数进行运算得到的结果成为表达式的值。

2)表达式值和数据类型即为表达式的类型。

表达式的运算顺序

应按照运算符的优先级从高到低的顺序进行。

优先级相同的运算符按照实现约定的结合方向进行。

1)运算符优先级(下表不用记,最实用的方法就算你不知道你就加括号就行,这方法比什么都稳妥)

运算符结合性
[]   .   ()  (方法调用)从左向右
! ~ ++  --  +(一元运算) - (一元运算)()  (强制类型转换)new从右向左
*   /      %从左向右
+     -从左向右
<<   >>    >>>从左向右
<    <=   >   >=  instanceof从左向右
==   !=从左向右
&从左向右
^从左向右
|从左向右
&&从左向右
||从左向右
?:从右向左
=  +=    -=    *=   /=    %=    &=     |=     ^=     <<=   >>=    >>>=从右向左

8.语句

(1)条件语句:根据不同条件,执行不同语句

1)if

2)if ...else

3)if ... else if

4)if ... else if... else if... else

import java.util.Scanner;

/**
 * 说明:
 *
 * @author huayu
 * @date 2018/8/1 下午3:17
 */
public class IfTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int a = scanner.nextInt();
        if (a == 1) {
            System.out.println("a");
        } else if (a == 2) {
            System.out.println("b");
        } else if (a == 3) {
            System.out.println("c");
        } else {
            System.out.println("d");
        }
    }
}

 if语句只有一句需要执行的语句时,可以省略{},但是我建议大家都写上,其实不写如果用ide的话它也会提醒你缺少大括号。

5)switch

(2)循环语句:重复执行某些动作

1)for循环

语句格式 :for(表达式1:表达式2:表达式3){语句;...;}

执行过程:首先计算表达式1,接着执行表达式2,若表达式2的值为true,则执行语句,接着计算表达式3,再判断表达式2的值,依次重复下去,直到表达式2的值为false结束。

for语句中的三个表达式都可以省略(jdk5开始)。

/**
 * 说明:for循环使用举例
 *
 * @author huayu
 * @date 2018/8/1 下午3:33
 */
public class ForTest {
    public static void main(String[] args) {
        int count=0;//局部变量
        int sum=0;
        for (int i = 0; i <100 ; i++) {
            sum+=i;
            count++;
            System.out.println("i="+i+'\n'+"count="+count+"次");
        }
        System.out.println("sum="+sum);
    }
}

2)while

while语句形式:while(逻辑表达式){语句;....;}

执行过程:先判断逻辑表达式的值,若为true则执行其后面的语句,然后再次判断条件并反复执行,直到条件不成立为止。

public class WhileTest {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个整数");
        int a = scanner.nextInt();
        while (a < 10) {
            a++;
            System.out.println("a=" + a);
        }

    }
}

3)do...while(用的较少)

语句形式:do{语句;...;}while(逻辑表达式);

执行过程:先执行语句,再判断逻辑表达式的值,若为true,再执行语句,否则结束循环。

4)break&Continue语句

break语句用于终止某个语句块的执行。用在循环语句体中,可以强行推出循环。

public class BreakTest {
    public static void main(String[] args) {
        int stop = 5;
        for (int i = 0; i < 10; i++) {
            if (i == stop) {
                break;
            }
            System.out.println("i="+i);
        }
    }
}
结果:
i=0
i=1
i=2
i=3
i=4


/**
 * 说明:输出1~100内前5个可以被3整除的数
 *
 * @author huayu
 * @date 2018/8/1 下午4:14
 */
public class BreakTest {
    public static void main(String[] args) {
       int num=0,i=1;
       while (i<=100){
           if(i%3==0){
               System.out.println(i+" ");
               num++;
           }
           if(num==5){
               break;
           }
           i++;
       }
    }
}

continue语句用在循环语句体中,用于终止某次循环过程,跳过循环体中continue语句下面未执行的循环,开始下一次循环。

public class ContinueTest {
    public static void main(String[] args) {
        int skip = 5;
        for (int i = 0; i < 10; i++) {
            if (i == skip) {
                continue;
            }
            System.out.println("i="+i);
        }
    }
}
结果:
i=0
i=1
i=2
i=3
i=4
i=6
i=7
i=8
i=9


/**
 * 说明:输出101~200内的质数
 *质数又称素数。一个大于1的自然数,除了1和它自身外,不能整除其他自然数的数叫做质数;
 * @author huayu
 * @date 2018/8/1 下午4:21
 */
public class ContinueTest {
    public static void main(String[] args) {
        //只算奇数就可以,偶数肯定不是质数
        for (int i = 101; i < 200; i+=2) {
            //置个标记,首先默认是质数
            boolean flag=true;
            //如果进入这层for循环flag被置为false,则表示不是质数,那么就跳出内层循环不执行了
            for (int j = 2; j < i; j++) {
                if(i%j==0){
                    flag=false;
                    break;
                }
            }
            //筛选,如果不是质数,也就是flag是false就跳过外层这一次循环,继续下一次循环
            if(!flag){
                continue;
            }
            //如果是质数则能走到这一步,输出出来
            System.out.println(" "+i);
        }
    }
}

5)switch语句

语句形式:switch(choice){

     case xx:

            ....

        break;

    case xx:

            ....

         break;

    default:

            ....

        break;

}

注意:小心case穿透,推荐末尾使用break语句(关于case穿透,你将下面例子中第一个break去掉,输出看看会出现什么情                  况)。

          多个case可以合并到一起。

           default可以省略,但不推荐省略。

          choice(switch的语句中探测):java 1.6(包括)以前,只是支持等价成int 基本类型的数据:byte ,short,char,int,也可以是枚举常量,1.7加入的新特性可以支持String类型的数据。long是不可以的。。就算是通过强制的转化也必须是转成int。short、 char 或者 byte他会自动转换为int的。。long不能自动转换为int..因为long比int范围大..可能会丢失精度..

//switch例子
public class SwitchTest {
    public static void main(String[] args) {
        int a=1;
        switch (a){
            case  1:
                System.out.println("1");
                break;
            case  2:
                System.out.println("2");
                break;
            case  3:
                System.out.println("3");
                break;
            default:
                System.out.println("error");
        }
    }
}

结果:
1

 9.方法:java的方法类似于其它语言的函数,是一段用来完成特定功能的片段(方法的本质是增强程序的复用性)。

声明格式:

[修饰符1  修饰符2.....] 返回值类型 方法名(形式参数列表){

           java语句;

          ....

}

1)几个名词:

形式参数:调用方法时用于接受外界输入的数据。

实参:调用方法时实际传给方法的数据。

返回值:方法在执行完毕后返还给调用它的环境的数据。

返回值类型:事先约定的返回值的数据类型,如无返回值,必须给出返回值类型void。

2)方法调用(一般在代码区,方法执行起来才会占用内存)

java语言中调用方法:对象名.方法名(实参列表)

实参的数目、数据类型和次序必须和所调用方法声明的形参列表匹配。

return语句终止方法的运行并指定要返回的数据。

参数传递原则

java中进行函数调用中传递参数时,遵循值传递原则。

基本类型传递的是该数据值本身。引用类型传递的是对对象的引用,而不是对象本身。

//方法调用实例
public class Function {
    public static void main(String[] args) {
        int a=f1(1);
        f2();
        System.out.println(a);
    }
    public static int f1(int a){
        int b=1+a;
        return b;
    }
    public static void f2(){
        System.out.println("空值");
    }
}
结果:
空值
2

10.递归与非递归

(1)递归

递归调用:在一个方法内部对自身进行调用。注意,没有分支。

重要!!!:用递归编写程序时一定要牢记两点:1. 递归公式;2. 收敛条件

public class Test {
    public static void main(String[] args) {
        System.out.println(method(5));
    }

    public static int method(int n) {
        if (n == 1) {
            return 1;
        } else {
            return n * method(n - 1);
        }

    }
}
程序分析:
n=5  return 5*method(5-1)
n=4  return 5*4*method(4-1)
n=3  return 5*4*3*method(3-1)
n=2  return 5*4*3*2*method(2-1)
n=1  return 5*4*3*2*1
结果
120

以上方法递归调用过程

递归实现斐波那契数列

斐波那契数列指的是这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …

这个数列从第三项开始,每一项都等于前两项之和。

public class Feb {
    public static void main(String[] args) {
        System.out.println(fibonacci(5));
    }

    public static int fibonacci(int n) {
        if (n == 1 || n == 2) {
            return 1;
        } else {
            return  fibonacci(n - 1)+fibonacci(n - 2);
        }

    }
}
过程分析:
n = 5         return fibonacci(4)+fibonacci(3);
n = 4,n = 3   return fibonacci(3)+fibonacci(2);
n = 3,n = 2   return fibonacci(2)+fibonacci(1);
n = 2         return 1;
n = 1         return 1;

//如果这样再看不清楚代价就一步一步拆开或者将程序打debugger跑一下
n = 5    return fibonacci(4)+fibonacci(3);
n = 5    return fibonacci(3)+fibonacci(2)+fibonacci(3);
n = 5    return fibonacci(2)+fibonacci(1)+fibonacci(2)+fibonacci(2)+fibonacci(1));
结果
5

以上方法递归调用过程

(2)非递归

非递归实现斐波那契数列(for循环)

//没考虑健壮性,只考虑了算法的实现,如果是实际应用应考虑健壮性,比如不让人传不符合条件的值
public class Feb {
    public static void main(String[] args) {
        System.out.println(f(5));
    }
    public static long f(int index){
        if(index==1||index==2){
            return 1;
        }
        long f1=1L;
        long f2=1L;
        long f=0;
        for (int i = 0; i <index-2; i++) {
            f=f1+f2;
            f1=f2;
            f2=f;
        }
        return f;
    }
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 11
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小猿架构

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值