A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘星海 初级黑马   /  2018-4-17 18:38  /  709 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

第1章 初识JAVA
*Java开发的三个方向:

1、Java SE:主要用于桌面程序的开发;

2、Java EE:主要用于网页程序的开发;

3、Java ME:主要用于嵌入式系统程序的开发。



*Java语言的主要特性:

1、面向对象;



2、分布性:可以在多个不同的主机上布置相关操作,同时数据也可以存放在多个不同的主机上,Java可以凭借URL对象访问网络对象,访问的方式和访问本地系统相同;



3、可移植性:Java程序与平台系统无关,通过JVM处理字节码文件以适应不同平台;



4、安全性:删除了类C语言中的指针、内存管理等语法,避免了非法的内存操作。同时Java程序要经过代码校验、指针校验等多种测试才可以运行;



5、多线程:Java允许应用程序同时并行执行多项任务,而且相应的同步机制可以保证不同线程能正确地共享数据;



6、高性能:Java编译后的字节码是在解释器中运行的,其运行速度比多数交互式的应用程序提高很多;



7、解释性、健壮性、动态等…。



*JDK安装后的环境变量配置:



1、JAVA_HOME:指向jdk的安装目录,Eclipse等软件就是通过搜索该变量值对应路径找到jdk;



2、PATH:在起始位置添加“%JAVA_HOME%\bin;”。其作用是指定命令搜索路径,在shell下面执行命令时,系统会到PATH变量所指定的路径中查找相应的命令程序(bin目录中包含经常要用到的可执行文件如javac/java/javadoc等)。设置好 PATH变量后,就可以在任何目录下执行javac/java等工具了;



3、CLASSPATH:作用是指定应用程序中使用的类的搜索路径JVM就是通过CLASSPTH来寻找类的。



*第一个Java程序


public class MyApp{
    public static void main(String[] args){
        System.out.println(
        System.out.println("My Java Application!");
    }
}
//存储在D盘根目录下,D:\MyApp.java
//进入Shell中D盘符,输入javac MyApp.java
//通过dir可以发现D盘根目录下多出了一个MyApp.class文件
//这就是javac命令的作用:生成源程序的字节码文件
//在D盘目录下,输入java MyApp
//可在shell窗口看到输出:My Java Application!
//这里java命令即是运行之前生成的字节码文件,即MyApp.class
//但需要注意,这里不能用java MyApp.class

第2章 熟悉Eclipse开发工具

*Eclipse是IBM公司用Java语言开发的开源IDE集成开发工具。



*使用Eclipse编写Java程序:



1、首先通过“新建”创建一个Java项目,并输入项目名,假设为MyApp;



2、继续通过“新建”创建一个Java类,输入类名称时要注意类名必须和项目名一致,这里即是MyApp;



3、创建完成类之后Eclipse会自动打开代码编辑区,输入代码完成编程;



4、代码编写完成后可通过“运行”执行程序,或Ctrl+F11快捷键。



5、断点的设置:可以在需要设置断点的代码行对应的行号位置双击或者选择“切换断点”设置或删除;



6、以调试方式运行程序:右键点击程序代码选择“调试方式”/“Java应用程序”(或者通过菜单),调试器将执行到断点处挂起当前线程使程序暂停;



7、程序调试:程序被暂停后,可通过调试工具栏上的单步跳入(对应快捷键F5)使得执行跳入调用方法或者对象的内部单步执行程序;或通过单步跳过(对应快捷键F6)即运行单独的一行程序代码,跳到下一个可执行点。


第3章 Java语言基础


一、标识符和关键字

1、Java中的标识符用于标识类名、变量名、方法名、数组名、文件名。



2、标识符的命名规则:由字母、数字、下划线和美元符号组成,但第一个字符不能是数字。同时标识符不能选用Java的关键字和保留字。



3、一般的约定命名规则:

(1)类和接口名:每个词首字母大写,如MyClass,HelloWorld;



(2)方法名:第一个词的首字母小写,其余词首字母大写,尽量少用下划线,如myMethod,myGetData;



(3)常量名:基本数据类型的常量名全部用大写字母,各词之间用下划线分隔,如SIZE_NAME;



(4)变量名:首词首字母小写,其余词首字母大写,不用下划线,尽量少用美元符号。



二、基本数据类型

1、整数类型:有byte\short\int\long四种,存储空间分别为1、2、4、8个字节,其中给long类型变量赋值时必须在结尾加L或l,如:long BigNumber=1234567L。



2、浮点类型:有float单精度和double双精度两种,分别占4、8个字节。其中float类型变量赋值时结尾必须加F或f。



3、字符类型:使用char进行声明,占用两个字节。



4、布尔类型:使用boolean进行声明,只能由true和false两个值。



三、变量和常量

1、变量的有效范围(作用域)

(1)在类体中定义的变量被称为成员变量,成员变量在整个类中都有效。类的成员变量分为静态变量和实例变量,静态变量通过修饰符static确定,并且可以通过“类名.静态变量名称”的方式在其他类中使用。



class var{
    int x=3;         //这里定义了var类的一个实例变量x
    static int y=30; //这里定义了var类的一个静态变量y
}
class bar{
    int a=var.y;
/*
定义bar类的实例变量a,
并把var类中静态变量y的值赋值给a
*/
}

(2)在类的方法体中定义的变量为局部变量,只在当前代码块中有效,其生命周期只在该方法被调用时,虚拟机为其分配内存空间,方法调用结束后,则该内存也被释放。

(3)在类中某一方法体内,可直接使用类体创建的静态变量,当该静态变量与该方法体中创建的局部变量重名时,静态变量将被隐藏,如果须调用该类体静态变量时,需使用“类名.静态变量名称”的方式。
注:经测试,类体中的实例变量无法在方法中使用。

public class Number {
    static int mydata=414;
     static int yourdata=1973;   
         public static void main(String[] args) {
         int mydata=1314;
         System.out.println("类体静态变量mydata的值是"+Number.mydata);
         System.out.println("类体静态变量yourdata的值是"+yourdata);
         System.out.println("方法内部的局部变量mydata的值是"+mydata);
     }
}
/*
输出----------
类体静态变量mydata的值是414
类体静态变量yourdata的值是1973
方法内部的局部变量mydata的值是1314
----------------
*/

四、运算符
异或的应用范例:不使用辅助变量实现两变量的值互换

import java.util.Scanner;
public class Nexchange {
     public static void main(String[] args){
         Scanner scan=new Scanner(System.in);
         System.out.println("请输入变量A的值");
         long A=scan.nextLong();
         System.out.println("请输入变量B的值");
         long B=scan.nextLong();
         System.out.println("A="+A+"\tB="+B);
         System.out.println("执行变量互换...");
         A=A^B;
         B=B^A;
         A=A^B;
         System.out.println("A="+A+"\tB="+B);      
     }
}
/*
这里运用了位操作异或,对于整数X有:X^X=0;X^0=X;同时异或操作满足结合律和交换律
将A=A^B带入后面两式,分别如下:
B=B^A=B^A^B=A^(B^B)=A^0=A;
A=A^B=(A^B)^A=...=B;
----------
引申:除异或方法外,不通过辅助变量的方法还有:
(1)a=a+b;b=a-b;a=a-b;
(2)a=a*b;b=a/b;a=a/b;
*/

五、实例
1、判断某一年是否为闰年

import java.util.Scanner;
public class LeapYear{
     public static void main(String[] args){
         Scanner scan=new Scanner(System.in);
         System.out.println("请输入年份(0~99999):");
         long year=scan.nextLong();
         while (year<0||year>99999){
             System.out.println("请重新输入年份(0~99999):");
             year=scan.nextLong();
        }
        scan.close();
         if((year/400==0)||((year/4==0)&&(year/100!=0))){
             System.out.println("输入年份为"+year+"是闰年");
        }
         else {
             System.out.println("输入年份为"+year+"不是闰年");
        }
    }
}

2、不使用乘号运算符,用移位运算符计算21*16。

public class MoveBit {
     public static void main(String[] args){
         long a=21L;
         int x=1;
         for(int i=1;i<5;i++){
             x*=2;
             a=a<<1;
             System.out.println("21左移动"+i+"位就是乘以"+x+"结果为"+a);
        }
    }
}

第4章 流程控制

一、条件语句

1、if语句



if(布尔表达式){
    语句序列
}
/*
布尔表达式如果为true则执行if代码块中的语句序列;
反之则不执行。
*/

2、if…else语句

if(布尔表达式){
    语句序列
}
else{
    语句序列
}
/*
布尔表达式如果为true则执行if代码块中的语句序列;
反之则执行else代码块中的语句序列。
如果一段代码中有多处if..else,则每一个else总是与它上面最近的一个if相匹配。
*/

/*
创建GetTerm类,在主方法中定义变量x,从控制台输入接受赋值,并通过if...else if多分支语句判断x的值决定输出结果。
*/
import java.util.Scanner;
public class GetTerm {
     public static void main(String[] args){
         Scanner scan=new Scanner(System.in);
         System.out.println("请输入一个整数:");
         int x=scan.nextInt();
         if(x>1000){
             System.out.println("x的值大于1000");
         }else if(x>500){
             System.out.println("x的值大于500,但小于1000");
         }else if(x>100){
             System.out.println("x的值大于100,但小于500");
         }else {
             System.out.println("x的值小于100");
        }
        scan.close();
    }
}

3、switch多分支语句

switch(表达式){   //表达式的值必须是整型或者字符型
case 常量值1:      //这里常量值必须与表达式的值对应,下同
    语句序列1
     break;   //跳出switch语句块,如没有则会继续执行下一句
case 常量值2:
    语句序列2
     break;
...
default:   //当上述各case的常量值没有匹配时候则从此处执行
     语句序列;
      break;
}  

import java.util.Scanner;
public class Switch_Example {
     public static void main(String[] args){
         Scanner scan=new Scanner(System.in);
         System.out.println("请输入你的姓名:");
         String name=scan.nextLine();
         System.out.println("请输入你的专业编号(0~9):");
         int majorLanguage=scan.nextInt();

         switch(majorLanguage){
         case 0:
         case 1:
         case 2:
             System.out.println("恭喜你,"+name+"你被分配到办公室");
             break;
         case 3:
         case 4:
         case 5:
         case 6:
             System.out.println("恭喜你,"+name+"你被分配到总工办");
             break;
         case 7:
         case 8:
         case 9:
             System.out.println("恭喜你,"+name+"你被分配到财务处");
             break;
         default:
             System.out.println("抱歉,你未被录用");     
         }
         scan.close();
     }
}

二、循环语句
1、while语句

while(条件表达式){   //条件表达式必须为布尔类型
  语句序列;          //条件表达式为true则执行该语句序列
}                 //否则退出循环

2、do…while语句

do {
    语句序列;
}while(条件表达式)  /*与while语句的区别可以从顺序上理解出,即便条件表达式为false,也会执行一次do代码块里的指令*/

3、for语句

for(表达式1;表达式2;表达式3){
    语句序列;
}
/*
表达式1:初始化工作
表达式2:为布尔类型,用于判断循环条件
表达式3:改变循环条件判断参数
表达式2:为布尔类型,用于判断循环条件
表达式3:改变循环条件判断参数
执行流程:先通过表达式1进行初始化设置工作,再判断表达式2,如果为true则执行语句序列,再通过表达式3改变循环条件判断参数;进入第二次循环时候先判断表达式2,如果为true则执行语句序列,再通过表达式3改变循环条件判断参数;直至某次判断表达式2为false则跳出循环。
*/

//用for循环输出九九乘法表
public class MultiTable {
     public static void main(String[] args){
         for(int i=1;i<10;i++){
             for(int j=1;j<i+1;j++){
                 System.out.println(j+"*"+i+"="+j*i+" ");
            }
             System.out.println();  //换行
        }
    }
}

4、foreach语句

for(元素变量x:遍历对象obj){
     语句序列(一般会对x有操作)
}
/*foreach是for语句的特殊简化格式,从上述示例代码可以看出foreach并不是所用的关键字,而是习惯上对这种循环的称谓。*/

//使用foreach语句读取一位整型数组各元素
public class Repetition {
     public static void main(String[] args){
         int arr[]={1,3,4,7,8,10};
         System.out.println("一维数组中各元素分别为:");
         for(int x:arr){
             System.out.println(x+"\t");
        }
    }
}

三、跳转语句
1、break语句
break只可以用在switch\for\while\do..while循环语句中,用于强行退出整个循环体。

2、continue语句
continue只能用在for\while\do…while循环语句中,用于直接跳出当前循环进入下一次循环。

//计算1~100各偶数之和 2 public class ContinueDemo {
     public static void main(String[] args){
         for(int sum=0,i=0;i<101;i++){
             if(i%2==0){
                 sum+=i;
             }else {
                 continue;
            }
             if(i==100){
                 System.out.println("0~100内偶数之和是"+sum);
            }
        }
    }
}

public class CatchBird {
     public static void main(String[] args){
         String[] birdArray=new String[]{"麻雀","鸽子","百灵","布谷","老鹰","鹦鹉","老鹰","翠鸟","斑鸠","老鹰","黄鹂"};
         int laoYingNumber=0;
         for(String birdString:birdArray){
             if(birdString.equals("老鹰")){
                 System.out.println("一只老鹰已经被我抓起来了");
                 laoYingNumber++;
                 continue;
            }
             System.out.println("发现了一只"+birdString);     //这里当然也可以用if-else
        }
         System.out.println("总共抓住了"+laoYingNumber+"只老鹰");
    }
}


//计算1+1/2!+1/3!+...+1/20!的值
public class x1 {
     public static void main(String[] args){
         double sum=0;
         long a=1L;
         for(long i=1L;i<21;i++){
             for(long j=1L;j<=i;j++){
                 a=a*j;              
             }
             sum+=1/(double)a;          //强制浮点运算
             a=(long)1;                 //重置为长整型数值12             System.out.println(sum);
         }
     }
}

第5章 数组

一、一维数组

1、创建

一维数组实质上是一组相同类型数据的集合,在Java中数组不属于数据类型,而是一种对象。 数组的两种声明方式:

int[] arr1;
int arr2[];

数组声明之后,在使用之前还需要先分配内存空间:

arr1=new int[3];  //数组元素个数为3,即长度为3;arr2=new int[2];

声明和分配空间也可以一并操作:

int arr1[]=new int[3];
int arr2[]=new int[2];

元素赋值的两种方法:

arr1[]=new int[]{1,2,3};
arr2[]={4,5};


//找出一维数组中的最小值元素
public class ArrayMinNum {
   public static void main(String[] args){   
     int arr[]=new int[]{12,398,25,1024,414,1973,2,520,1013};
     int tempMin=arr[0];       //最小值暂存器,初始值为第一个元素值
     int markNumber=1;    //位置标识符
     for(int j=1;j<arr.length;j++){
         if(tempMin>arr[j]){
             tempMin=arr[j];
             markNumber=j+1;
         }
     }
     System.out.println("数组arr中最小值是"+tempMin+";是数组中第"+markNumber+"个元素");
   }
}

二、二维数组
二维数组中各元素实际上是一维数组,创建、分配空间及赋值类似:

int arr[][];                    //声明创建
arr=new int[2][3]               //分配2*3个元素空间
arr={{1,2,3},{4,5,6}};              //赋值
int arrx[][]=new int[][]{{1,2},{3,4},{5,6}};  //创建+分配+赋值

//对一个二维数组进行转置操作
public class ArraySwap {
     public static void main(String[] args) {
         int arr1[][]=new int[][]{{1,2,3},{4,5,6},{7,8,9}};
         int arr2[][]=new int[3][3];
         for(int i=0;i<arr1.length;i++){
             for(int j=0;j<arr1[i].length;j++){
                 arr2[j][i]=arr1[i][j];
            }
        }
         for(int i=0;i<arr1.length;i++){
             for(int j=0;j<arr1[i].length;j++){
                 System.out.print(arr1[i][j]+"  ");
            }
             System.out.println("");
        }
         for(int i=0;i<arr2.length;i++){
             for(int j=0;j<arr2[i].length;j++){
                 System.out.print(arr2[i][j]+"  ");
            }
             System.out.println("");
        }
    }
}

三、数组的基本操作
1、通过for方法的遍历元素

//1、二维数组的元素遍历输出
public class ArrayTrap {
    public static void main(String[] args){
        int arr[][]=new int[][]{{1,3,5,7},{2,4,6},{0,10}};
        System.out.println(
        System.out.println("for循环常规方法:");
        for(int i=0;i<arr.length;i++){
           for(int j=0;j<arr[i].length;j++){
                System.out.print(arr[i][j]
                System.out.print(arr[i][j]+"  ");
            }
            System.out.println("");
        }
        System.out.println("foreach方法:");
        for(int arrx[]:arr){
            for(int a:arrx){
                System.out.print(a
                System.out.print(a+"  ");
            }
            System.out.println("");
        }
    }
}

2、填充替换数组元素
(1)fill(int[] a,int value)方法:将value的值赋给数组a中每一个元素,该方法的返回值为更改后的数组a。

(2)fill(int[] a,int fromIndex,int toIndex,int value):将value的值赋给数组a中的元素,范围从索引为fromIndex的元素开始,到索引为toIndex的元素结束不包括该元素,该方法的返回值为更改后的数组a。

//将数组中部分元素更改值
import java.util.Arrays;
public class ArrayDisplace {
     public static void main(String[] args){
         int arr[]=new int[]{13,8,9,520,14,4,24,27};
         System.out.println("填充前数组为:");
         for(int x:arr){
             System.out.print(x+" ");
        }
         Arrays.fill(arr,1,4,520);
         System.out.println("填充后数组为:");
         for(int x:arr){
             System.out.print(x+" ");
        }
    }
}


3、复制数组

(1)copyOf(arr,int newlength):arr是要进行复制的数组。newlength用于指定赋值后新数组的长度,如该长度大于arr长度,则其余用0填充(整型数组)或null(char型数组)。如果newlength小于arr长度,则按newlength截取。返回值为复制后的新数组。


(2)copyOfRange(arr,int fromIndex,int toIndex):复制范围从索引为fromIndex的元素开始,到索引为toIndex的元素结束不包括该元素,该方法的返回值为复制后的新数组。



四、实例



//用冒泡法从小到大排序数组元素
public class BubbleSortArray {
     public static void main(String[] args){
         int ourArray[]=new int[]{1973,10,1013,24,414,4,1980,520,13,19999};
         int temp;
         System.out.println("排序前:");
         for(int x:ourArray){
             System.out.print(x+" ");
        }
         for(int i=1;i<ourArray.length;i++){
             for(int j=0;j<ourArray.length-i;j++){
                 if(ourArray[j]>ourArray[j+1]){
                     temp=ourArray[j+1];
                     ourArray[j+1]=ourArray[j];
                     ourArray[j]=temp;
                }
            }
        }
         System.out.println("排序后:");
         for(int x:ourArray){
             System.out.print(x+" ");
        }
    }
}

//创建一个int型二维数组,求各元素之和并打印
public class ArraySum {
     public static void main(String[] args){
         int arr[][]=new int[][]{{13,414,73},{10,24,80},{2012,10,13},{520,13,14}};
         int sum=0;
         for(int a[]:arr){
             for(int x:a){
                 sum+=x;
            }
        }
         System.out.println("二维数组arr各元素总和为"+sum);
    }
13 }
以上
来自宇宙超级黑马专属安卓客户端来自宇宙超级黑马专属安卓客户端

1 个回复

倒序浏览
哇,这么多,我就问,上面的你都会了嘛?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马