笔记参考来源狂神说Java视频https://www.bilibili.com/video/BV12J41137hu
本篇笔记有点长,可以根据目录定位,建议配合视频学习。
组成:cpu,主板,内存,电源,主机箱,硬盘,显卡,键盘、鼠标,显示器。
Alt+f4关闭窗口 Shift+Delete永久删除 ctrl+w自动保存
死机:任务管理器结束进程
打开CMD的方式
常用的Dos命令
# 盘符切换 E: # 查看当前目录下所有文件 dir # 切换目录 cd /d E:\idea # 返回上一级目录 cd .. # 进入同级目录下的下一级目录 cd tmp(该目录下的文件名) # 清屏 cls (clear screen) # 退出终端 exit # 查看电脑当前IP地址 ipconfig # 打开计算器 calc # 打开画图 mspaint # 新建记事本 notepad # 在当前目录新建文件夹 md test(文件夹名) # 新建文件 cd> a.txt(文件名) # 删除文件 del a.txt(文件名) # 删除目录 rd test(目录名) # ping命令(复制链接进入Dos直接单击鼠标右键粘贴) ping www.baidu.com
C、C++、Java、C#、Python、PHP、JavaScript …
大体上分为:面向过程与面向对象两大类
强类型语言
弱类型语言:JavaScript,Python
Java的数据类型分为两大类
//整数 int num1 = 10; //最常用,只要别超过21亿(2^31-1) byte num2 = 20; //-128~127 short num3 = 30; long num4 = 30L; //long类型数字后面要加个L(尽量用大写,小写l容易与1搞混)
//小数:浮点数 float num5 = 50.1F; //float类型数字后面要加个F double num6 = 3.141592653589793238;
//字符 char name = '国'; //字符串, String不是关键字,是类 //String namea = "薛之谦";
//布尔值:是非 boolean flag = true
//整数扩展: 二进制0b 八进制0 十进制 十六进制0x int i = 10; int i2 = 010; //八进制 8 int i3 = 0x10; //十六进制 16
//浮点数扩展: //面试题:银行业务字母怎么表示钱? BigDecimal(数学工具类) //float double是有问题的,最好避免使用浮点数进行比较 float f = 0.1f; //0.1 double d = 1.0/10; //0.1 System.out.println(f==d); //false //浮点数 位有限,舍入误差,大约 //最好避免使用浮点数进行比较 float f1 = 23131313131f; float f2 = f1+1; System.out.println(f1==f2); //true
//字符扩展:所有字符本质还是数字 char c1 = 'a'; char c2 = '中'; System.out.println(c1); //a System.out.println((int)c1);//强制类型转换,97 System.out.println(c2); //中 System.out.println((int)c2);//强制类型转换,20013 //编码 Unicode表(97=a,65=A)2字节 0-65536 //U000~UFFFF 十六进制(u0061=a,相当于十进制的97) System.out.println('\u0061'); //a '\'是转义字符
//布尔值扩展 boolean flag = true; if(flag==true){} //新手 if(flag){} //老手这样写 Less is More(代码要精简易读)
由于Java是强类型语言,所以要进行有些运算的时候,需要用到类型转换。
容量高–>低:
运算中,不同类型的数据先转化位同一类型,再进行运算。
//强制转换 (类型)变量名 高--低 //自动转换 低--高 int i = 128; byte b = (byte)i; //强制转换 内存溢出 -128~127 double d =i; //自动转换 System.out.println(i); //128 System.out.println(b); //-128 System.out.println(d); //128.0 /* 注意点: 1.不能对布尔值进行转换 2.不能把对象类型转换为不相干的类型 3.在把高容器转换到低容量的时候,强制转换 4.可能存在内存溢出,或者精度问题 * */ System.out.println((int)23.7); //23 丢失精度 char c = 'a'; int n = c+1; System.out.println(n); //98 System.out.println((char)n); //b
//当操作数比较大时,注意溢出问题 //JDK7新特性,数字之间可以用下划线分割 int money = 10_0000_0000; //10亿,下划线不会被打印出来 System.out.println(money); //1000000000 int years = 20; int total = money*years; //数据大,溢出 System.out.println(total); //-1474836480 long total2 = money*years; //默认是int,转换前就有溢出问题 System.out.println(total2); //-1474836480 long total3 = money*(long)years; //先把一个数转Long System.out.println(total3); //20000000000
//数据类型 变量名 = 值; type varName [=value][{,varName[=value]}]; //可以使用逗号隔开同多个类型的变量,但不建议在一行定义多个变量
public class Variable{ static int allClicks = 0; //类变量 String str = "hello world"; //实例变量 public void method(){ int i=0; //局部变量 } }
//常量一般用大写字符 final 常量名=值; final double PI=3.14;
//修饰符 不存在先后顺序,static可以写final后面 static final doube PI=3.14; //类变量,该类下的全局范围
int a=10; int b=20; System.out.println(a/b); //0 System.out.println((double)a/b); //0.5 long c=12300000000; System.out.println(a+b); //int System.out.println(a+c); //long 自动转换式子中容量大的数据类型
// ++自增 --自减 单目运算符 int a = 3; int b = a++; //b=a,a=a+1 先赋值 即b=3 a=4 int c = ++a; //a=a+1,c=a 先自增 即a=5 c=5 System.out.println(a); //5 System.out.println(b); //3 System.out.println(c); //5
//幂运算 2^3 2*2*2=8 double pow = Math.pow(2,3); // (底数,指数)double型 System.out.println(pow); //8.0
//扩展:笔试题 i=5 s=(i++)+(++i)+(i--)+(--i) s=? int i=5; int s=(i++)+(++i)+(i--)+(--i); System.out.println(s); //24
// 与(snd) 或(or) 非(取反) boolean a = true; boolean b = false; System.out.println(a&&b); // false System.out.println(a||b); // true System.out.println(!(a&&b)); // true int c=5; boolean d = (c<5)&&(c++<5); //第一个值为false,后面就不进行判定了 System.out.println(d); //false System.out.println(c); //5 c++未执行
/* A = 0011 1100 B = 0000 1101 A&B 0000 1101 按位与 A|B 0011 1101 按位或 A^B 0011 0001 异或 ~B 1111 0010 非 面试题:2*8 怎么算最快? 2<<3 <<左移 *2 效率极高!! >>右移 /2 */ System.out.println(2<<3); // 16
int a = 10; int b = 20; a+=b; // a = a+b a-=b; // a = a-b System.out.println(a); //10 //字符串连接符 + ,转化为String类型,然后拼接 注意!! System.out.println(""+a+b); //1020 System.out.println(a+b+""); //30 先进行运算,再转为String拼接 System.out.println(a+b+"str"); //30str
// x ? y : z //如果x为真,则结果为y,否则为z //if(x) y; else z; int score = 80; String type = score<60?"及格":"不及格"; System.out.println(type); //及格
package pkg1[.pkg2[.pkg3...]];
一般利用公司域名倒置作为包名;com.kuangstudy.www
为了能够使用一个包的成员,需要在Java程序中导入该包
import package1[.package2...].(className|*); //通配符* 导入包下所有的类
javadoc命令是用来生成自己API文档的
参数信息
API文档:https://docs.oracle.com/javase/8/docs/api/
/** * @author Kuangshen * @version 1.0 * @since 1.8 */ public class Demo05 { String name; /** * @author kuangshen * @param name * @return * @throws Exception */ public String test(String name) throws Exception{ return name; } }
Scanner s = new Scanner(System.in);
//创建一个扫描器对象 Scanner scanner = new Scanner(System.in); System.out.println("使用next方式接收"); //判断用户有没有输入字符串 if(scanner.hasNext()){ //使用hasNextLie()会接收一行 "hello word" //使用next方式接收 String str = scanner.next(); System.out.println("输入的内容为:"+str); //input: hello word //输入的内容为:hello } //凡是属于IO流的类如果不关闭会一直占用资源 scanner.close();
//从键盘接收数据 Scanner scanner = new Scanner(System.in); System.out.println("请输入数据:"); String str = scanner.nextLine(); System.out.println("输入的内容为:"+str); scanner.close();
System.out.println("请输入整数:"); if(scanner.hasNextInt()){ int i=scanner.nextInt(); System.out.println("输入的整数为:"+i); }else { System.out.println("输入的不是整数数据"); }
int a = 80; if(a>60){ System.out.println("及格"); if(a>80) System.out.println("且优秀"); }else if(a>0){ System.out.println("不及格"); }else { System.out.println("缺考"); }
char grade = 'C'; //JDK新特性 可以是字符串(字符本质还是数字) switch (grade){ case 'A': System.out.println("优秀"); break; //可选,跳出当前结构 case 'B': System.out.println("良好"); break; case 'C': System.out.println("合格"); break; default: //默认,以上值没匹配到 System.out.println("不及格"); break; }
IDEA反编译之后.class文件与源代码对比
//计算1+2+3+...+100 int i=0; int sum=0; while(i<100){ i++; sum+=i; } System.out.println(sum); //5050
//先执行后判断,至少执行一次 do{ i++; sum+=i; }while(i<100) //跟上面效果一样
//(初始化;条件判断;迭代) for(int i=0;i<100;i++){ i++; sum+=i; } for(; ; ){...} //死循环
//练习:输出1-1000能被5整除的数,每行输出3个 for (int i = 1; i <= 1000; i++) { if(i%5==0){ System.out.print(i+"\t"); //输出完不换行 } if(i%(3*5)==0){ System.out.println(); } }
//练习2:输出九九乘法表 for(int i=1;i<=9;i++){ for(int j=1;j<=i;j++){ System.out.print(j+"*"+i+"="+i*j+"\t"); } System.out.println(); }
int [] numbers = {10,20,30,40,50}; //定义一个数组 for (int x:numbers){ System.out.println(x); //遍历数组的元素 10 20 30 40 50 } //相当于 for(int i=0;i<5;i++){ System.out.println(numbers[i]); }
//打印101-150之间所有的质数 int count = 0; outer:for(int i=101;i<=150;i++){ for (int j=2;j<i/2;j++){ if(i%j==0) continue outer; //不建议使用标签 } System.out.print(i+" "); }
//打印等腰空心三角形 /* 例如:输入为4时 * * * * * * * * * */ Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); //n为三角形高 for(int i=1;i<=n;i++){ for(int j=1;j<=2*n-1;j++){ if(i!=n){ //若不为最后一行 if(i+j==n+1) System.out.print("*"); //三角形左腰边 else if(i+j==n+2*i-1) System.out.print("*"); //三角形右腰边 else System.out.print(" "); } else if(j%2!=0){ //最后一行,底边 System.out.print("*"); }else { System.out.print(" "); } } System.out.println(); //换行 }
修饰符 返回值类型 方法名(参数类型 参数名,...){ 方法体... return 返回值; }
int larger = max(30,40);
如果方法返回值是void,方法调用一定是一条语句。
扩展:值传递和引用传递 ( Java都是值传递)。
调用其他类的方法,除非是static静态方法,不然必须实例化这个类(new)
public class Demo01 { public static void main(String[] args) { int add = Demo01.add(1,2); // 通过类名直接调用静态方法 System.out.println(add); // 3 } // static静态方法,否则就要new实例化来调用 public static int add(int a,int b){ return a+b; } }
重载是在一个类中,有相同的方法名,参数列表不同的方法。
方法重载的规则:
实现理论
public static void main(String[] args) { //args.length 数组长度 for (int i = 0; i < args.length; i++) { System.out.println("args["+i+"]: "+args[i]); } }
找到当前类的文件夹,打开cmd.
//打印最大值 public static void printMax(int... num){ if(num.length==0){ System.out.println("没有值传入"); return; } int result = num[0]; for (int i = 1; i < num.length; i++) { if(num[i] > result){ result = num[i]; } } System.out.println("最大值是:"+result); } public static void main(String[] args) { printMax(1,2,3,4); //最大值是:4 printMax(new int[]{1,2,3,4,5}); //最大值是:5 }
递归就是:A方法调用A方法,自己调用自己!
递归策略只需少量的代码可描述解题过程中多次重复计算,大大减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
递归结构
//阶乘 n! n*(n-1)*...*2*1 public static int f(int n){ if(n==1) return 1; return n*f(n-1); //递归:调用自身 } public static void main(String[] args) { System.out.println(f(5)); //5!= 120 }
dataType[] arrayRefVar; //首选 dataType arrayRefVar[]; //效果相同,但不是首选
dataType[] arrayRefVar = new dataType[arraySize]; //int[] nums=new int[10]
int[] nums; //1.声明一个数组 nums = new int[3]; //2.创建一个数组 //3.给数组元素赋值 nums[0]=1; nums[1]=2; nums[2]=3; for (int num : nums) { //打印数组所有元素 System.out.println(num); }
//静态初始化:创建+赋值 int[] a={1,2,3}; Man[] mans={new Man(1,1),new Man(2,2)}
//包含默认初始化 int[] a=new int[2]; //默认值为0 a[0]=1; a[1]=2;
其长度是确定的,数组一旦被创建,它的大小就是不可改变的。
其元素必须是相同类型,不允许出现混合类型。
数组中的元素可以是任何数据类型,包括基本类型和引用类型。
数组变量属于引用类型,数组也可以看作对象,其中每个元素相当于该对象的成员变量。
数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,
数组本身是在堆中的。
int[] arrays = {1,2,3,4,5}; //打印全部的数组元素 JDK1.5 没有下标 for (int array : arrays) { System.out.println(array); }
//打印数组元素 public static void printArray(int[] a){ for (int i = 0; i < a.length; i++) { System.out.print(a[i]+" "); } }
//反转数组 public static int[] reverse(int[] arrays){ int[] result = new int[arrays.length]; //反转的操作 for (int i = 0; i < arrays.length; i++) { result[i] = arrays[arrays.length-i-1]; } return result; }
int arr[][] = new int[3][2]; //二维数组,三行两列
int[][] array = {{1,2},{3,4},{5,6}}; //打印二维数组所有元素 for (int i = 0; i < array.length; i++) { //arrays.length=3 for (int j = 0; j < array[i].length; j++) { System.out.print(array[i][j]+" "); } System.out.println(); }
int[] a = {1,2,3,4,9000,32145,451,21}; System.out.println(a); // [I@28d93b30 (hashcode) //Arrays.toString 打印数组元素 System.out.println(Arrays.toString(a)); //[1, 2, 3, 4, 9000, 32145, 451, 21] //二分法查找某值 返回下标 System.out.println(Arrays.binarySearch(a, 9000)); // 4 //填充 Arrays.fill(a,2,4,0); //数组[a[2]~a[4])之间填充0 System.out.println(Arrays.toString(a)); //[1, 2, 0, 0, 9000, 32145, 451, 21] //升序排序 Arrays.sort(a);
//冒泡排序 //1.比较数组中两个相邻的元素,如果第一个数大于第二个数,交换它们位置 //2.每一次比较,都会产生一个最大或最小的数字(升序为最大数) //3.下一轮则可以少一次排序 //4.依次循环,直到结束 public static int[] sort(int[] array){ int temp=0; //外层循环,次数length-1 for (int i = 0; i < array.length-1; i++) { //内层循环:如果第一个数大于第二个数,交换它们位置 for (int j = 0; j < array.length-1-i; j++) { if(array[j]>array[j+1]){ temp=array[j]; array[j]=array[j+1]; array[j+1]=temp; } } } return array; } public static void main(String[] args) { int[] a={8,1,35,47,19,-2}; int[] sort = sort(a); System.out.println(Arrays.toString(sort)); //[-2, 1, 8, 19, 35, 47] }
//创建一个二维数组 11*11 0:没有棋子,1:黑棋 2:白棋 int[][] array1 = new int[11][11]; array1[1][2] = 1; array1[2][3] = 2; //输出原始的数组 System.out.println("原始的数组:"); for (int[] array : array1) { for (int i : array) { System.out.print(i+"\t"); } System.out.println(); } //转换为稀疏数组保存 //1.有效值的个数 int sum = 0; //有效值总数 for (int i = 0; i < 11; i++) { for (int j = 0; j < 11; j++) { if(array1[i][j]!=0){ sum++; } } } //2.创建一个稀疏数组 int[][] array2 = new int[sum+1][3]; array2[0][0] = 11; array2[0][1] = 11; array2[0][2] = sum; //3.遍历二维数组,将有效值存放到稀疏数组 int count = 0; for (int i = 0; i < array1.length; i++) { for (int j = 0; j < array1[i].length; j++) { if(array1[i][j]!=0){ count++; array2[count][0] = i; array2[count][1] = j; array2[count][2] = array1[i][j]; } } } //4.输出稀疏数组 System.out.println("稀疏数组:"); for (int i = 0; i < array2.length; i++) { for (int j = 0; j < array2[i].length; j++) { System.out.print(array2[i][j]+"\t"); } System.out.println(); } /* 结果: 输出原始的数组 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 稀疏数组 11 11 2 1 2 1 2 3 2 */
public class Person { //一个类即使什么都不写,也会存在一个默认的无参构造方法 //显示地定义构造器 String name; //作用:1. 使用new关键字,本质是在调用构造器 //2. 用来初始化对象的值 public Person(){} //无参构造 //有参构造 3.一旦定义了有参构造,无参就必须显示定义 public Person(String name){ this.name=name; } //Alt+insert 快捷键插入构造方法 }
//定义一个宠物类 public class Pet { public String name; //默认 null public int age; //默认 0 //无参构造 public void shout(){ System.out.println("叫了一声"); } }
//应用类,创建调用对象 public class Application { public static void main(String[] args) { Pet dog = new Pet(); dog.name = "旺财"; dog.age = 3; dog.shout(); } }
继承的本质是对某一批类的抽象,从而实现对世界更好地建模。
extends的意思是”扩展“。子类是父类的扩展,使用关键字extends来表示。
Java中类只有单继承,没有多继承!一个类只能继承一个父类。
继承是类与类之间的一种关系,此外还有依赖、组合、聚合等。
继承关系的两个类,一个为子类(派生类),一个为**父类(基类)**子类继承父类。
子类和父类之间,从意义上讲应该具有”is a“的关系。
//学生类(子类)继承 人类(父类) public class Student extends Person{ /*Person extends Object*/ ... }
super(); //隐藏代码,默认调用了父类的无参构造,要写只能写第一行
重写:子类的方法必须与父类方法必须一致,方法体不同。
重写是方法的重写,与属性无关
重写方法只与非静态方法有关,与静态方法无关(静态方法不能被重写)
public class B { public static void test(){ //静态方法 System.out.println("B==>test()"); } }
public class A extends B{ //继承 public static void test(){ System.out.println("A==>test()"); } }
public class Application { public static void main(String[] args) { //方法的调用之和左边定义的类型有关 A a = new A(); a.test(); //打印 A==>test() //父类的引用指向了子类,但静态方法没有被重写 B b = new A(); b.test(); //打印 B==>test() } }
修改A.java, B.java
public class B { public void test(){ //非静态方法 System.out.println("B==>test()"); } } public class A extends B{ @Override //重写了B的方法 public void test() { System.out.println("A==>test()"); } }
//父类的引用指向了子类 B b = new A(); //子类重写了父类的方法,执行子类的方法 b.test(); //打印变成了 A==>test() /* 静态方法是类的方法,非静态方法是对象的方法 有static时,b调用了B类的方法,因为b是b类定义的 没有static时,b调用的是对象的方法,而b是A类new出来的对象,调用A的方法 */
动态编译:类型
即同一方法可以根据发送对象的不同而采用不同的行为方式
一个对象的实际类型是确定的,但可以指向对象的引用可以有很多
多态存在条件
public static void main(String[] args) { // Object > String // Objest > Person > Student // Objest > Person > Teacher Object object = new Student(); // X instanceof Y,X引用指向的对象是不是Y的子类 System.out.println(object instanceof Student); //true System.out.println(object instanceof Person); //true System.out.println(object instanceof Teacher); //false System.out.println(object instanceof Object); //true System.out.println(object instanceof String); //false //类型之间的转化:父-子(高-低),低可以转换为高 Person obj = new Syudent(); //只能用Person方法(重写了用子类重写过的方法) (Syudent)obj.go(); //强转之后可以用Student方法(Student->go()) }
类型转换
//静态导入包 import static java.lang.Math.random; public class Application { public static void main(String[] args) { //第一种随机数,不用导包 System.out.println(Math.random()); //0.7562202902634543 //第二种随机数,静态导入包 System.out.println(random()); //0.5391606223844663 } }
//abstract 抽象类 类只能单继承(接口可以多继承) public abstract class Action { //约束~有人帮我们实现~ //抽象方法只有方法名,没有方法的实现 public abstract void doSth(); //1.不能new抽象类,只能靠子类去实现它,仅作为一个约束 //2.抽象方法只能出现在抽象类中,抽象类可以有普通方法 //3.抽象类有构造器,可以派生子类 //4.抽象类的意义:约束,提高开发效率。但是类只能单继承,所以有局限 用的不多 }
//interface接口,接口都要有继承类 //实现类(implements 可以继承多个接口) //多继承,利用接口实现多继承 public interface UserService { //定义的属性都是常量,默认修饰 public static final public static final int AGE = 99; //一般不用 //所有的定义的方法都是抽象的 默认public abstract public abstract void run(); void add(); void query(); void delete(); }
注意点
软件程序在运行过程中,经常可能遇到异常问题,异常英文(Exception),意思是例外,这些例外情况需要我们写程序做出合理的处理,而不至于让程序崩溃。
异常指程序运行中出现的不期而至的各种状况:文件找不到,网络连接错误,非法参数等。
异常发生在程序运行期间,它影响了正常的执行流程。
public static void main(String[] args) { int a = 1; int b = 0; try { //try监控区域 System.out.println(a/b); }catch (ArithmeticException e){ //catch 捕获异常 System.out.println("程序出现异常,变量b不能为0"); }catch (Exception e){ e.printStackTrace(); }finally { //一定会执行,处理善后工作,如关闭资源 System.out.println("finally"); } if(b==0){ //抛出异常一般在方法中使用 throw new ArithmeticException(); //主动抛出异常 } } //Ctrl+Alt+T 快捷键插入 try-catch
如果本篇文章对你有帮助,不妨点个赞再走吧!