阶段一
一 Java 背景概述
1 背景知识
- java 是美国sun 公司 19995 推出的高级编程语言
- java 早期称Oak(橡树),后期改名java
- java之父: 詹姆斯*高斯林
- 2009 年,sun公司被Oracle(甲骨文)公司收购
2 流行原因
- 最流行编程语言之一,在国内最为广泛的编程语言
- 可移植性,安全,性能好
- 开发社区完善,功能最为丰富
3 Java 技术体系
ps: 在本次课程(黑马),先学习标准版-- java 核心和基础,后面学习企业版
二 Java 快速入门
1 Java 环境配置(idea,jdk)
- 官网下载
- 网盘(idea,jdk)资料
- 在安装文件中javac.exe和java.exe介绍,java.exe是执行工具,javac.exe是编译工具(对程序进行翻译)
- 命令行窗口常用命令 dir - 查看当前路径; cd; cls - 清屏;
2 java 入门程序-helloworld
1 java 开发的三个步骤
编写代码,编译代码,运行代码
注意:代码文件名全英文,首字母大写,满足驼峰命名 ,源文件必须 .java
2 编写程序
第一个java程序
public class HelloWorld {
public static void main(String[] args) {
System.out.printIn('HelloWorld!');
}
}
3 命令行窗口编译与运行
- 编译 javac 文件名.java
- 运行java 类名 (是自己定义的类名)
注意:
- 勾选扩展名
- 使用双引号
- System.out.println 中 l 是L 的小写
- 第一次运行时,可能不能直接在命令窗口运行javac,可以在安装文件bin中打开 运行
- 文件名称与类名称必须一致
- jdk11开始可以直接运行源代码文件 (xxx:Java HelloWorld.java)
补充知识:
-
编程语言发展历程 (机器语言- 汇编语言-高级语言)
-
jdk的组成:
-
java跨平台(一次编译,处处可用;程序只需要开发一次,就可以在安装了JVM的系统平台运行)
-
注意配置Path环境变量
三 IDEA开发工具的使用
1 idea 开发工具的安装
参考百度网盘
2 idea编写第一个程序
1 idea项目结构
如:
2 idea 使用步骤
-
创建Project空工程
配置工程所需的环境:
配置工程路径:
-
创建Module模块
-
创建Package包
鼠标右键的点击:
包的命名规范:全部英文小写 网站反着名命名 第三部是建议功能名称
-
创建class类
直接显示:
-
在类中编写代码
package com.xxx.hello; public class HelloWorld { public static void main(String[] args) { //键入main,回车可以快速生成 System.out.println("Hello World !"); //键入sout,回车可以快速生成 } }
-
完成编译运行
-
总结
3 idea 设置主题与字体
4 idea 快捷键+导入(删除)模块
导入模块
- 关联导入(在存在的模块导入,用.mi文件)(缺点:路径不会改变)
- 新建一个模块,再复制粘贴(建议)
删除模块
在项目中,点击
然后在所属文件中,删除文件,(如果重建相同名称模块有问题,则再重新打开项目)
打开工程(还是点击这个”有小黑点的文件“)
关闭工程
5 vscode与idea快捷键修改及个人快捷键备忘
阶段二
1 java 基础语法
1 注释的快捷键
/*
* 这是文档注释
*/
2 java中的进制数输入
3 java中的数据类型
还有:String 等
4 标识符及命名规范
2 类型转换
1 自动类型转换
范围大的变量,可以直接赋值给范围大的遍变量
2 强制类型转换
double a = 12.2;
int b = (int) a;
System.out.println(b); // 12
补充
3 运算符
注意:
算数运算符:
关系运算符:
逻辑运算符:
+连接符(注意:与‘a',a连接情况)
int a = 5;
System.out.println("xxx"+'a'+a); // xxxa5
System.out.println('a'+"xxx"); // axxx
System.out.println("xxx"+'a'); // xxxa
System.out.println('a'+a); // 102
4案例:键盘导入- Scanner
-
导包(多看api)
-
使用
import java.util.Scanner; public class HelloWorld { public static void main(String[] args) { Scanner sn = new Scanner(System.in); System.out.println("name is "); // 等待键盘输入,才会执行下一行 String name = sn.next(); System.out.println("age is "); int age = sn.nextInt(); System.out.println("name is "+name+"/t age is "+age); } }
3 程序流程控制
switch的使用:
注意:
String weekday = "周二";
switch (weekday){
case "周一":
System.out.println("one");
break;
case "周二":
System.out.println("two");
break;
case "周三":
System.out.println("thr");
break;
default:
System.out.println("error");
}
案例:打印乘法表
int i,j;
for(i=1;i<=9;i++) {
for(j=1;j<=i;j++){
System.out.print(j+"*"+i+"="+(i*j)+"/t");
}
System.out.println("");
}
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
案例:打印水仙花
for (int i = 100; i < 999; i++) {
int ge = i % 10;
int shi = i / 10 % 10;
int bai = i / 100;
if ((ge * ge * ge + shi * shi * shi + bai * bai * bai) == i) {
System.out.print(i + "/t");
}
}
死循环
案例: Random随机数-猜数字
注意:随机数的范围
package com.xxx.hello;
import java.util.Random;
import java.util.Scanner;
public class HelloWorld {
public static void main(String[] args) {
// 随机数0-9
Random r = new Random();
int data = r.nextInt(10); // 不包含10
System.out.println(data);
// 65 - 91 随机数
for(int j =0;j<30;j++) {
int data2 = r.nextInt(27)+65;
System.out.print(data2+"/t");
}
}
}
// 猜数字游戏案例
Random r = new Random();
Scanner sn = new Scanner(System.in);
while (true) {
System.out.print("请输入数字:");
int userInputNum = sn.nextInt();
int randomNum = r.nextInt(10)+1; // 1 - 10 之间
if(userInputNum < randomNum){
System.out.println("猜小了");
}else if(userInputNum > randomNum) {
System.out.println("猜大了");
}else {
System.out.println("对了!😀朋友去买单吧!");
break;
}
}
/*
int randomNum = r.nextInt(10)+1; // 1 - 10 之间
代替写法: r.nextInt(1,11) 包含前面不包含后面
*/
4 数组
1 数组的定义
静态初始化数组
操作:
// 定义数组
int[] arr={12,22,33};
// 赋值
arr[1] = 123111;
// 取值
System.out.println(arr[1]);
// 访问数组长度
System.out.println(arr.length);
注意
动态初始化数组(指定数组长度,后期赋值)
示例:
// 元素默认值
boolean[] arr2 = new boolean[20];
System.out.println(arr2[19]); // false
2遍历数组-案例:
案例 - 求和
int[] arr = {16, 26, 100, 89, 12};
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
}
System.out.println("sum is "+sum);
注意:
案例 - 冒泡排序
// 案例 冒泡排序
int [] peopleCode = {22,33,12,12,3333,3,22,67,2,13};
int temp = 0;
for(int i=0;i<peopleCode.length;i++) {
for(int j=0; j<i+1;j++) {
if(peopleCode[i]<peopleCode[j]){
temp = peopleCode[i];
peopleCode[i]=peopleCode[j];
peopleCode[j]=temp;
}
}
}
for(int k=0; k<peopleCode.length; k++)
System.out.print(peopleCode[k]+" ");
3 Debug 工具的使用
4 补充:java的内存分配简述
5 方法
5.1 方法定义的格式
方法定义的注意事项:
5.2 方法案例
使用方法,传递数组求最值:
package com.xxx.hello;
import java.util.Scanner;
public class FunStudy {
public static void main(String[] args) {
// Scanner sn = new Scanner(System.in);
// int n = sn.nextInt();
// check(n);
int [] arrNum = {12,23,61233,12,32,663};
System.out.println(getMax(arrNum));
// int re = sum(n);
// System.out.println(re);
}
// 求和
public static int sum(int n) {
int re = 0;
for(int i =1;i<=n;i++) {
re += i;
}
return re;
}
// 判断奇数 偶数
public static void check(int n) {
if(n%2 == 0) {
System.out.println(n+"是偶数");
}else {
System.out.println(n+"是奇数");
}
}
// 求最值
public static int getMax(int[] arr) {
int max =arr[0];
for(int i=0;i<arr.length;i++) {
if(max<arr[i]){
max = arr[i];
}
}
return max;
}
// public static void main(String[] args) {
// int re = 0;
// re = sum(10,121);
// System.out.println(re);
// }
// public static int sum(int a, int b) {
// int c = a+ b;
// return c;
// }
}
方法在内存存放的位置:
5.3 方法类型传递机制
基本类型的参数传递:值传递
值传递
示例:
package com.xxx.hello;
public class MethodStudy {
public static void main(String[] args) {
int a= 10;
change(a);
System.out.println(a); // 10
}
public static void change(int a) {
System.out.println(a); // 10
a=20;
System.out.println(a); // 20
}
}
效果:
引用类型的参数传递:值传递
示例:
package com.xxx.hello;
public class MethodStudy {
public static void main(String[] args) {
int[] aaa= {10,12,11};
change(aaa);
System.out.println(aaa[1]); //222
}
public static void change(int[] a) {
System.out.println(a[1]); // 12
a[1]=222;
System.out.println(a[1]); // 222
}
}
效果:
在栈内存中放的变量地址,指向相同的堆中的值;当值变化时,地址则没有变化。
总结
5.4 方法重载与return关键字
-
方法重载
示例:
package com.xxx.hello; public class FireSuc { public static void main(String[] args) { fire(); fire("y国"); fire("d国",16); } public static void fire(){ // System.out.println("向米国发射1枚炮弹"); fire("米国"); } public static void fire(String location) { // System.out.println("向"+location+"发射1枚炮弹"); fire(location,1); } public static void fire(String location, int num) { System.out.println("向"+location+"发射"+num+"枚炮弹"); } }
重载方法识别技巧:(1. 方法名称相同 2. 形参不同)
-
return关键字:跳出当前方法,或结束当前方法的执行(在是void的情况下,没有返回值)
示例:除法的式子中,分母不能为”0“,return 在判断下执行
// return 的作用 public static void main(String[] args) { result(12,3); } public static void result(int a, int b){ if(b == 0){ System.out.println("input error !"); return; // 跳出当前方法 } int c = a/b; System.out.println("result is "+c); }
5.5 案例 - 双色球中奖
-
示例:
package com.xxx.hello; import java.util.Random; public class Ex3 { public static void main(String[] args) { // 案例 - 双色球中奖 int[] num = createNumber(); int[] redNum = new int[6]; for(int i=0; i<6;i++) { redNum[i] = num[i]; } for(int i=0; i<num.length; i++){ System.out.print(num[i]+"/t"); } int[] myNum = {24,20,1,3,4,5,7}; int redCount = 0; int blueCount =0; for(int i=0; i<6; i++) { boolean isRedOk = check(redNum,myNum[i]); if(isRedOk) redCount++; } if(num[6] == myNum[6]) { blueCount= 1; } System.out.println(""); System.out.println("中奖个数:"+redCount+"/t"+blueCount); String str = redCount +""+blueCount; switch (str){ case "01": System.out.println("六等奖 5元"); break; case "11": System.out.println("六等奖 5元"); break; case "21": System.out.println("五等奖 10元"); break; case "31": System.out.println("五等奖 10元"); break; case "40": System.out.println("五等奖 10元"); break; case "41": System.out.println("四等奖 200元"); break; case "50": System.out.println("三等奖 3000元"); break; case "51": System.out.println("三等奖 3000元"); break; case "60": System.out.println("二等奖 500万元"); break; case "61": System.out.println("一等奖 1000万元"); break; default: System.out.println("下次一定"); } } public static int[] createNumber() { Random r = new Random(); int[] redNumber = new int[7]; for(int i=0;i<6;) { int num = r.nextInt(33)+1; boolean isCheck = check(redNumber,num); if(!isCheck) { redNumber[i] = num; i++; } } redNumber[6] = r.nextInt(16)+1; return redNumber; } public static boolean check(int[] arr,int num) { for(int i =0;i<arr.length;i++){ if(num==arr[i]){ return true; } } return false; } }
阶段三
1 面向对象
1.1 设计对象并使用
1.1.1 类的定义和对象的使用
概念:
定义类
获取对象的类
使用类
示例代码:
Phone.java文件:
package com.xxx.test.obj;
public class Phone {
// 属性
String brand;
double price;
// 行为
public void call() {
System.out.println("手机在大电话");
}
public void playGame() {
System.out.println("手机在玩游戏");
}
}
PhoneTest.java文件:
package com.xxx.test.obj;
public class PhoneTest {
public static void main(String[] args) {
// 创建对象
Phone p = new Phone();
// 赋值
p.brand = "小米";
p.price = 1266;
// 获取对象里面的值
System.out.println(p.brand);
System.out.println(p.price);
// 获取对象的方法
p.call();
p.playGame();
}
}
效果:
1.1.2 类的几个补充事项
注意:
对象成员变量的默认值:
1.2 封装(重要)
1.2.1 封装思想 -如:
人画园
人对象:人的名字,人的年龄等
园对象:园的半径,画圆行为等
ps:问什么画圆行为在园对象中?因为画圆,需要半径。
面向对象编程中,sun 公司提供许许多多的方法,在我们需要使用的,查找即可,不记不背,知道即可;
可以下载:JDK API 1.8.0 中文版
封装思想的好处
1.2.2 private 关键字
示例:
Friend.java
package com.xxx.test.obj2;
public class Friend {
private String uname;
private int age;
String six;
String denger;
// 对每个私有化成员变量,都要提供set和get方法
// set : 给成员变量赋值
// get :对外提供成员变量的值
public void setUname(String v){
uname=v;
}
public String getUname(){
return uname;
}
public void setAge(int v) {
if(v >= 18 && v <= 50) {
age = v;
}else {
System.out.println("非法数据");
}
}
public int getAge(){
return age;
}
public void eat(){
System.out.println("干饭人");
}
}
FriendTest.java
package com.xxx.test.obj2;
public class FriendTest {
public static void main(String[] args) {
Friend g1 = new Friend();
g1.setUname("如玉");
g1.setAge(-18);
System.out.println(g1.getUname() + "/t" + g1.getAge());
Friend g2 = new Friend();
g2.setUname("莉莉丝");
g2.setAge(20);
System.out.println(g2.getUname() + "/t" + g2.getAge());
}
}
效果:
总结
1.3 this关键字
区分局部变量与全局变量
package com.xxx.test.obj3;
public class Friend {
private int age;
public void setAge(int age){
this.age = age;
}
public int getAge(){
return this.age;
}
}
package com.xxx.test.obj3;
public class FriendTest {
public static void main(String[] args) {
Friend g1 = new Friend();
g1.setAge(18);
System.out.println(g1.getAge());
}
}
1.4 构造方法
概述
1.4.1 构造方法的格式
1.4.2 构造方法的作用
1.4.3 构造方法的注意事项
示例
package com.xxx.test.obj4;
public class Friend {
private String uname;
private int age;
// 如果没有写任何的构造方法
// 虚拟机会给添加一个空参构造方法
// 同时,如果写了有参构造方法
// 在测试类中,创建对象,空参调用,报错
public Friend(){
System.out.println("执行,呵呵");
}
public Friend(String uname,int age){
this.uname = uname;
this.age = age;
}
public String getUname(){
return this.uname;
}
public int getAge(){
return this.age;
}
}
package com.xxx.test.obj4;
public class FriendTest {
public static void main(String[] args) {
Friend g1 = new Friend("如玉",18);
// Friend g1 = new Friend();
System.out.println(g1.getUname()+"/t"+g1.getAge());
}
}
1.5 标准JavaBean类
快捷键生成JavaBean模板
-
alt+insert 或者 alt+fn+insert
-
插件ptg