java简介
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。
Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序等。
Java是SUN公司的产品,从1996年发布JDK1.0以来,经过多年的发展陆续发布了JDK1.1,JDK1.2,JDK1.3,JDK1.4,JDK1.5版本。2009年,甲骨文(Oracle)公司宣布收购SUN,甲骨文公司又陆续发布了JDK6.0,JDK7.0,2014年发布了JDK8.0版本。
作者:詹姆斯·高斯林
JDK(Java Development Kit)称为Java开发包,是一个编写Java应用程序的程序开发环境。JDK是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一些Java工具和Java的核心类库(Java API)。可以把Java API类库中的Java SE API子集和Java虚拟机这两部分统称为JRE(JAVA Runtime Environment),JRE是支持Java程序运行的标准环境。
JRE是个运行环境,JDK是个开发环境。因此写Java程序的时候需要JDK,而运行Java程序的时候就需要JRE。而JDK里面已经包含了JRE,因此只要安装了JDK,就可以编辑Java程序,也可以正常运行Java程序。
JVM是Java Virtual Machine(Java虚拟机)的缩写。JVM是java的核心和基础,是java编译器和OS平台之间的虚拟处理器,主要用于实现Java跨平台。
第一个示例程序
安装JDK并配置好环境变量(见主页JDK环境安装)后就可以进行java编程了,下面编写一个入门级别的Java程序来体验Java开发的神奇之旅。开发一个Java程序分3步,如下:
-
创建Java源程序即一个.java文件。
-
将源程序编译为字节码文件即.class文件。
-
执行字节码文件。
1.创建Java源程序
在C盘根目录下创建一个目录,命名为java,在c:\java目录中新建一个记事本文件,将该文件命名为HelloWorld.java。在HelloWorld.java文件中输入下面的代码。
/**
* HelloWorld程序
**/
public class HelloWorld{
/**
*main方法是程序的入口点
**/
public static void main(String[] args){
System.out.println("HelloWorld");
}
}
2.将源文件编译为字节码文件
字节码文件是以.class结尾的文件,字节码文件通过Javac编译器编译出来的。
打开控制台,在控制台中使用Java编译器命令(javac)将java源文件编译成字节码文件,字节码文件是以.class为扩展名的文件。编译后会在C盘根目录下产生编译完的HelloWorld.class字节码文件,字节码文件是不允许修改的,只能修改源文件后重新生成字节码文件。
javac 文件名.java
3.运行字节码文件
在控制台中使用java解释器命令(java)运行HelloWorld字节码文件,显示java程序运行结果。
java 文件名
变量命名规范
命名规范:
1)只能使用$,字母,数字,_,不能以数字开头
2)不能使用关键字。public class static void String
3) 要见名知意 age name score
4)使用驼峰法(Camel命名法),第一个单词首字母小写,其后每个单词首字母大写:stuJavaScore
5)区分大小写 age Age是两个不同的变量
数据类型
数据类型 | 占用空间 | 保存范围 | 使用举例 |
---|---|---|---|
boolean 布尔型 | 1字节 | true或false | 是否婚配 |
byte 字节型 | 1字节 | -128~127 | 如文件读写 |
char 字符型 | 2字节 | 0~65535 | 保存单个字母 |
short 短整型 | 2字节 | -32768~32767 | 保存较小的整数时使用 |
int 整型 | 4字节 | -2147483648~2147483647 | 保存一般的整数时使用 |
long 长型 | 8字节 | -922337203654775000~22337203654775007 | 保存较长的整数时使用 |
float 浮点型 | 4 字节 | -3.403e38~3.403e38 | 保存小数时使用 |
double 浮点型 | 8字节 | 1.798e308~1.798e308 | 保存精度较高的小数 |
这这几种数据的范围说明
//byte
System.out.println("最小值:Byte.MIN_Value = "+ Byte.MIN_VALUE);
System.out.println("最大值:Byte.MAX_Value = "+ Byte.MAX_VALUE);
System.out.println();
//short
System.out.println("最小值:Short.MIN_Value = "+ Short.MIN_VALUE);
System.out.println("最大值:Short.MAX_Value = "+ Short.MAX_VALUE);
System.out.println();
//int
System.out.println("最小值:Integer.MIN_Value = "+ Integer.MIN_VALUE);
System.out.println("最大值:Integer.MAX_Value = "+ Integer.MAX_VALUE);
System.out.println();
//long
System.out.println("最小值:Long.MIN_Value = "+ Long.MIN_VALUE);
System.out.println("最大值:Long.MAX_Value = "+ Long.MAX_VALUE);
System.out.println();
//float
System.out.println("最小值:Float.MIN_Value = "+ Float.MIN_VALUE);
System.out.println("最大值:Float.MAX_Value = "+ Float.MAX_VALUE);
System.out.println();
//double
System.out.println("最小值:Double.MIN_Value = "+ Double.MIN_VALUE);
System.out.println("最大值:Double.MAX_Value = "+ Double.MAX_VALUE);
System.out.println();
//char
System.out.println("最小值:Character.MIN_Value = "+ Character.MIN_VALUE);
System.out.println("最大值:Character.MAX_Value = "+ Character.MAX_VALUE);
System.out.println();
强制类型转换(显示)
1.特点:代码需要进行特殊的格式处理,不能自动完成
2.规则:数据范围由小到大
格式如下:
int b = (char)10L;
整数类型:byte,short,int,long
注意:java的整型常亮默认为int型,声明long型常量须后加 'l’或’L’
浮点类型:float、double
注意:Java 的浮点型常量默认为double型,声明float型常量,须后加‘f’或‘F’
字符类型:char
注意:char类型是可以进行运算的。因为它都对应有Unicode码。
布尔类型:boolean
注意:boolean类型数据只允许取值true和false,无null。
boolean类型不可以转换为其它的数据类型。
输出格式
System.out.println(msg); // 输出一个字符串, 带换行
System.out.print(msg); // 输出一个字符串, 不带换行
System.out.printf(format, msg); // 格式化输出
printf 的格式化输出方式和 C 语言的 printf 是基本一致的。
格式化字符串
转换符 | 类型 | 举例 | |
---|---|---|---|
d | 十进制整数 | (“%d”,100) | 100 |
x | 十六进制整数 | (“%x”,100) | 64 |
o | 八进制整数 | (“%o”,100) | 144 |
f | 定点浮点数 | (“%f”,100f) | 100 |
e | 指数浮点数 | (“%e”,100f) | 1.00E+02 |
g | 通用浮点数 | (“%g”,100f) | 100 |
a | 十六进制浮点数 | (“%a”,100) | 0x1.9p6 |
运算符
赋值: =
算术运算符: + - * / % ++ -- +=
位运算: 二进制 & | ^ ~ >>
比较运算符: > < >= <= == !=
逻辑运算符: &&(&) ||(|) !
三元运算符: ? :
public static void main(String[] args){
//char可以直接运算
System.out.println('B'+ 1);
//区分string的+连接
System.out.println("A"+1);
//int/int 默认去除小数类型
System.out.println(10/3);
System.out.println(10.0/3);//保存小数
System.out.println((byte)100+(byte) 100);
}
}
输入
System.in 输入
System.out 输出
Scanner 扫描
public class Test {
public static void main(String[] args) {
// 和用户交互
Scanner sc = new Scanner(System.in);
// String word = sc.nextLine(); // sc 扫描的结束标记 以换行作为标记
// System.out.println(word);
// String word = sc.next(); // 以空格作为结束标记
// System.out.println(word);
// 不建议
// int x = sc.nextInt();
// System.out.println(x);
// sc.nextLine();
// int y = sc.nextInt();
// System.out.println(y);
// 通过java提供的API 将输入的 字符串转成 数值
System.out.println("请输入int");
String word = sc.nextLine();
int x = Integer.parseInt(word); // string - int
System.out.println(x);
System.out.println("请输入double");
word = sc.nextLine();
double d = Double.parseDouble(word);
System.out.println(d);
System.out.println("请输入boolean");
word = sc.nextLine();
boolean res = Boolean.parseBoolean(word);
System.out.println(res);
System.out.println("请输入1个字符");
word = sc.nextLine();
char c = word.charAt(0); // 1 个字符
System.out.println(c);
}
}
练习
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
String command = "";
while (!command.equals("Q")) {
System.out.println("请输入 [w 向上 s向下 a向左 d向右 Q退出] 控制你的角色:");
command = scanner.next();
String message = (command.equals("w")) ? "向上移动" :
(command.equals("s")) ? "向下移动" :
(command.equals("a")) ? "向左移动" :
(command.equals("d")) ? "向右移动" :
(command.equals("Q")) ? "退出游戏" : "无效的命令,请重新输入";
System.out.println(message);
}
scanner.close();
}
流程控制
顺序结构:按照顺讯执行
分支结构:根据某个事情的结果来决定下一步操作,if else
循环结构:重复做某件事
分支结构
if(条件表达式){
//要做的事
}
if(条件表达式1){
}else if(条件表达式2){
}else{
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//根据员工工资判定员工的工资等级
//1.接受输入的员工工资
double sal =Double.parseDouble(sc.nextLine());
//在编程中尽量不使用嵌套代码,能不用if else尽量不用
//数据校验
if(sal<700){
System.out.println("工资低于700异常");
//System.exit(3);//3 是自己设置的一个验证码
return;
}
if(sal>9999){
System.out.println("工资高于9999异常");
return;
}
//业务处理
if(sal>=3000){
System.out.println(5);
}else if(sal>=2001){
System.out.println(4);
}else if(sal>=1401){
System.out.println(3);
}else if(sal>=1201){
System.out.println(2);
}else{
System.out.println(1);
}
}
//根据员工的部门编码显示员工的部门名称
//分支语句
//定义一个变量接受员工的部门编码
int deptno=Integer.parseInt(sc.nextLine());
//判断员工部门
//只能做是否相等判断,支持byte,int,double,short,char,String(仅支持jdk7版本以上)
switch(deptno){
case 10:
System.out.println("ACCOUNTING");
break; //跳出当前语句块
case 20:
System.out.println("RESEARCH");
break;
case 30:
System.out.println("SALES");
break;
case 40:
System.out.println("OPERATIONS");
default:
System.out.println("输入部门编码异常!");
}
循环结构
while(条件表达式){
//重复的事
}
do{
//重复的事
}while(条件);
for( ; ; ){
}
练习
//打印心形
int line1 =4; //打印几行
int x1 =1; //从几行开始
for(int i = x1; i<=line1; i++){
for(int j=0; j<=line1-i; j++){
System.out.print(" ");
}
for(int j=0;j<2*i-1;j++){
System.out.print("*");
}
for(int j=0;j<=10-i*2;j++){
System.out.print(" ");
}
for(int j=0;j<2*i-1;j++){
System.out.print("*");
}
System.out.println();
}
int line2 =10; //打印几行
int x2 =1; //从几行开始
for(int i = x2; i<= line2; i++){
for(int j = 1; j< i; j++){
System.out.print(" ");
}
for(int j=0; j<=line2-i; j++){
System.out.print("*");
}
for(int j=0; j<line2-i; j++){
System.out.print("*");
}
System.out.println();
}
//打印斐波那契数列
//n为打印长度
int n=Integer.parseInt(sc.nextLine());
//first与second为第一个和第二个数
int first = 0;
int second = 1;
System.out.println("斐波那契数列前 " + n + " 个数字为:");
System.out.print(first + " " + second);
for(int i = 2; i < n; i++) {
int next = first + second;
System.out.print(" " + next);
first = second;
second = next;
}
结果:
数组
一组类型相同,固定长度的数据集合
数组的声明方式:int[] arr; 或 int []arr; 或int arr[]; 或 int [] arr;
数组的初始化:给数组分配空间
动态初始化: int[] arr; arr = new int[len];
静态初始化:int[] arr = {};
数组的基本使用
public static void main(String[] args) {
//统计学生年龄
int[] ages;
//分配了5个32bit的存储空间
ages =new int[5];
int a0=ages[0];
System.out.println(a0);
System.out.println(ages[1]);
ages[2]=12;
System.out.println(ages[2]);
//数组长度
int len=ages.length;
//数组循环遍历,可以读取也可以修改
for(int i=0;i<len;i++){
System.out.println(ages[i]);
}
//foreach 迭代,只能从数组中读取数据
for(int x : ages){
System.out.println(x);//这里的x不是数组的位置
}
//使用java工具打印数组
System.out.print(Arrays.toString(ages));
}
数组练习
设计一个程序,输入学生的姓名,根据学生的姓名得到学生的年龄
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
//分配了5个32bit的存储空间
int ages[];
String [] names;
ages =new int[5];
names = new String[5];
//数组长度
int len=ages.length;
//输入数据
for(int i=0;i<len;i++){
names[i]=sc.nextLine();
ages[i]=Integer.parseInt(sc.nextLine());
}
//根据输入的名字输出年龄
String name=new String();
name=sc.nextLine();
for(int i=0;i<len;i++) {
if (name.equals(names[i])) {
System.out.println(ages[i]);
}
}
}
多维数组
基本使用
public static void main(String[] args) {
int[][] arr={
{0,1,2,3},
{0,1,2,3},
{0,1,2,3},
{0,1,2,3}
};
int[][] ste =new int[4][];
ste[0] = new int[3];
ste[1] = new int[4];
ste[2] = new int[5];
ste[3] = new int[3];
System.out.println(arr.length);
arr[1][2]=100;
for(int i=0;i< arr.length;i++){
for(int j=0;j<arr[i].length;j++){
System.out.print(arr[i][j]+",");
}
}
删除与扩容的功能实现
public class kuorong {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int size=4;
int index=0;//记录元素个数
String[] names= new String[4];
//初始化元素
names[index++]="张三";
names[index++]="张四";
names[index++]="王五";
names[index++]="张留";
int command=-1;
while(command!=0){
System.out.println("请输入要进行的操作:1.删除元素 2.添加元素 3.查看元素 0.退出");
command=Integer.parseInt(sc.nextLine());
switch(command){
case 1:
//根据同学的序号、索引删除一个同学
System.out.println("请输入删除的同学序号:");
int no=Integer.parseInt(sc.nextLine());
//校验数据
if(no>=index || no<0){
System.out.println("序号错误!");
return;
}
//删除
names[no]=null;
//整理数组
for(int i=no;i<index-1;i++){
names[i]=names[no+1];
}
names[--index]=null;
break;
case 2:
//输入新用户
System.out.println("请输入新增的姓名:");
String name=sc.nextLine();
//确保数组有足够的空间
if(index>=size){
//扩容
//1.创建新的数组长度是size+size>>1其中>>是右移
int newSize=size+(size>>1);
String[] newNames= new String[newSize];
//2.移植原来的数据到新数组中
for(int i=0;i<names.length;i++){
newNames[i]=names[i];
}
//3.将names的引用指向newNames
names=newNames;
size=newSize;//修改数组新的容量
}
//保存
names[index++]=name;
break;
case 3:
System.out.println(Arrays.toString(names));
break;
default:
break;
}
}
}
}
练习
1.统计部门员工的工资,找出工资排名3-5的员工
2.统计各部门工资最高的员工
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
// 员工姓名数组
String[] names = {"小明", "小红", "小刚", "小华", "小李"};
// 部门数组//0是10部门,1是20部门,2是30部门
int[] depts = {10,10,20,20,30};
int[] dept = {10,20,30};
// 工资数组
double[] sal = {5000, 8000, 10000, 6000, 9000};
int command=-1;
while(command!=0){
System.out.println("请选择:0.退出 1.以工资排序并查看 2.查看排序后的3-5名 3.查看各部门工资最高的员工");
command=Integer.parseInt(sc.nextLine());
switch(command){
case 1:
//统计员工工资并排序
int n = sal.length;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (sal[j] > sal[j + 1]) {
// 交换元素
double temp = sal[j];
sal[j] = sal[j + 1];
sal[j + 1] = temp;//员工名字也交换
String temp1=names[j];
names[j] = names[j+1];
names[j+1] = temp1;
}
}
}
System.out.println(Arrays.toString(sal));
System.out.println(Arrays.toString(names));
System.out.println();
break;
case 2:
//查看工资排序3-5 的员工
for(int i=2;i<=4;i++){
System.out.print((i+1)+names[i]);
}
System.out.println();
break;
case 3:
int max=0;//记录最高工资的下标
for(int j=0;j<3;j++){
System.out.println(dept[j]+"部门工资最高员工:");
max=0;
for(int i=1;i<sal.length;i++) {
if (sal[max] < sal[i] && depts[i] == dept[j]) {
max = i;
}
}
System.out.println(names[max]);
}
System.out.println();
break;
default:
System.out.println();
break;
}
}
}