注释
单行注释 //
JavaDoc文档注释 /** */
标识符
标识符注意点
●所有的标识符都应该以字母(A-Z 或者a-z) ,美元符($)、或者下划线( )开始
●首字符之后可以是字母(A-Z 或者a-z) ,美元符($)、下划线( )或数字的任何字符组合●不能使用关键字作为变量名或方法名。
●标识符是大小写敏感的
●合法标识符举例: age. $salary、_ value、_ 1 _value
●非法标识符举例: 123abc、 -salary、 #abc
●可以使用中文命名,但是- -般不建议这样去使用,也不建议使用拼音,很Low
数据类型
强类型语言
-
要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用
public class HelloWord {
public static void main(String[] args) {
//八大基本数据类型
//整数
byte num1 = 10;
int num2 = 20;
short num3 = 30;
long num4 = 30L;//long 类型要在数字后面加个L
//小数:浮点数
float num5 = 50.1F;//float 类型要在数字后面加个F
double num5 = 3.1415926535897932384626;
//字符
char name = 'A';
//字符串,String不是关键字,类
//String name = "少年";
//布尔值:是非
boolean flag = true;
//boolean flag =false;
}
}
类型转换
//强制转换 (类型)变量名高-- 低
//自动转换 低--高
/* 注意点:
1.不能对布尔值进行转换
2.不能把对象类型转换为不相干的类型
3.在把高容量转换到低容量的时候,强制转换
4.转换的时候可能存在内存溢出,或者精度问题! */
System. out . println("==================");System. out . println( (int)23.7); //23
System. out . println((int)-45.89f); //-45
变量
变量
◆变量是什么:就是可以变化的量!
◆Java是-种强类型语言,每个变量都必须声明其类型。
◆Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。
type varName[=value] [{ ,varName[=value ]}]
//数据类型变量名 =值;可以使用逗号隔开来声明多个同类型变量。
◆注意事项:
-
每个变量都有类型,类型可以是基本类型,也可以是引用类型。
-
变量名必须是合法的标识符。
-
变量声明是一条完整的语句,因此每一个声明都必须以分号结束
public class Demo08 {
//类变量 static
static double salary = 2555;
//属性;变量
//实例变量:从属于对象;如果不自行初始化,这个类型的值默认值 0 0.0
//布尔值:默认是false
//除了基本类型,其余的默认值都是null;
String name;
int age;
//main 方法
public static void main(String[] args) {
//局部变量:必须声明和初始化值
int i = 10;
System.out.println(i);
//变量类型 变量名字 = new Demon08();
Demo08 demo08 = new Demo08();
System.out.println(demo08.age);
System.out.println(demo08.name);
//类变量 static
System.out.println(salary);
}
}
常量
常量
◆常量(Constant): 初始化(initialize)后不能再改变值!不会变动的值。
◆所谓常量可以理解成一种特殊的变量,它的值被设定后,在程序运行过程中不允许被改变。
final 常量名=值;
final double PI=3.14;
◆常量名一般使用大写字符。
public class Demo09 {
//static 是修饰符,不存在先后顺序
static final double PI =3.1415926;
public static void main(String[] args) {
System.out.println(PI);
}
}
变量的命名规范
◆所有变量、方法、类名:见名知意
◆类成员变量:首字母小写和驼峰原则: monthSalary◆局部变量:首字母小写和驼峰原则
◆常量:大写字母和下划线: MAX VALUE
◆类名:首字母大写和驼峰原则: Man, GoodMan◆方法名: 首字母小写和驼峰原则: run(), runRun()
运算符
◆Java语言支持如下运算符:
●算术运算符:+,-,*,/, %,++, -
●赋值运算符=
●关系运算符:>,<, >=, <=, ==, !=instanceof●逻辑运算符:&&, ||, !
●位运算符:&,|,^,~,>>,<<, >>>(了解! ! ! )●条件运算符? :
●扩展赋值运算符:+=, -=, *=, /=
//逻辑运算符
publicclass Demo05 f
public static void main(String[] args) f1/ 5 (and)或(or)非 (取反)
boolean a = true;
boolean b = false;
int a = 10;
int b = 20;
System. out. println("a && b: "+(a&&b));
System . out . println("a || b:"+(a || b));
System. out . println("! (a && b) :"+!(a&&b));
System.out.println(""+d+c); //这样会把d和c当作字符串连接起来1020,如果式子里前面是string,后面的也会被当作string
System.out.println(d+c+""); //这样的结果是d+c,是三十,因为string在后面
]
包机制
◆为了更好地组织类, Java 提供了包机制,用于区别类名的命名空间。◆包语句的语法格式为:
package pkg1[. pkg2[. pk...]];
一般利用公司域名倒置作为包名:
◆为了能够使用某-个包的成员, 我们需要在Java程序中明确导入该包。使用"import"语句可完成此功能
import package1[ . package2..] . ( classname|*);
生成和使用JavaDoc文档
◆javadoc命令 是用来生成自己API文档的
◆参数信息
◆@author作者名
◆@version 版本号
◆@since 指明需要最早使用的jdk版本◆@param参数名
◆@return返回值情况
◆@throws异常抛出情况
JDK 8 的帮助文档 https://docs.oracle.com/javase/8/docs/api/
package com. kuang . base;
/**
* @author Kaungshen
* @version 1.0
* @since 1.8
*/
public class Doc {
String name;
/**
*@author Kaungshen
*@param name
* Oreturn
*@throws Exception
*/
public String test(String name) throws Exception{
return name ;
}
//我是通过命令行 javadoc -encoding UTF-8 -charset UTF-8 Doc.java
//作业:学会查找使用IDEA生产avaDoc文档! 面向百度编程!
}
Java流程控制
用户交互Scaner
Scanner对象
◆之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样-个工具类,我们可以获取用户的输入。java.util.Scanner 是Java5的新特征,我们可以通过
Scanner类来获取用户的输入。
◆基本语法:
Scanner S = new Scanner(System. in);
◆通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一-般需要使用hasNext()与hasNextLine()判断是否还有输入的数据。
next():
◆1、 - -定要读取到有效字符后才可以结束输入。
◆2、对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
◆3、只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
◆4、 next() 不能得到带有空格的字符串。
◆nextLine():
◆1、以Enter为结束符,也就是说nextLine()方法返回的是输入回车之前的所有字符。 * ◆2、 可以获得空白。
例:使用next
package com.shao.study;
import java.sql.SQLOutput;
import java.util.Scanner;
public class Scaner {
public static void main(String[] args) {
//创建一个扫描器对象用来接受键盘数据
Scanner scanner = new Scanner(System.in);
System.out.println("使用next方法接收:");
//判断用户有没有接受字符
if (scanner.hasNext()){
//使用next 方法接收
String str = scanner.next();
System.out.println("输入的内容为:"+str);
}
//凡是属于IO流的类如果不关闭会一直占用资源,要养成好的习惯,用完就关掉
scanner.close();
}
}
例:使用nextline
package com.shao.study; import java.util.Scanner; public class Demon2 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("使用nextline接收:"); //使用nextline方法可以输出空格 if(scanner.hasNextLine()){ String str = scanner.nextLine(); System.out.println("结果是:"+str); } scanner.close(); } }
例:使用NextInt和NextFolat
package com.shao.study; import java.util.Scanner; public class Demon3 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); //整型浮点型要先初始化 int i = 0 ; float f = 0.0f; System.out.println("请输入整数:"); if(scanner.hasNextInt()){ //输入整数 i = scanner.nextInt(); System.out.println("整数数据:"+i); }else{ System.out.println("输入的不是整数数据"); } System.out.println("请输入小数:"); if(scanner.hasNextFloat()){ //输入浮点型0. f = scanner.nextFloat(); System.out.println("小数输出为:"+f); } scanner.close(); } }
综合练习输入测试题
package com.shao.study; import jdk.nashorn.internal.ir.WhileNode; import java.util.Scanner; public class Demon4 { public static void main(String[] args) { //输入多个数,求其总和和平均数,每输入一个数字用回车确认,通过输入非数字来结束输入,输出结果 Scanner scanner = new Scanner(System.in); double sum = 0; int m = 0; while (scanner.hasNextDouble()){ double x = scanner.nextDouble(); m++; sum+=x; System.out.println("你输入了第"+m+"个数据,当前结果为sum="+sum); } System.out.println(m+"个数和为:"+sum); System.out.println(m+"个数平均数"+(sum/m)); scanner.close(); } } /* E:EnvironmentjavaJDK1.8injava.exe " com.shao.study.Demon4 80 你输入了第1个数据,当前结果为sum=80.0 90 你输入了第2个数据,当前结果为sum=170.0 30 你输入了第3个数据,当前结果为sum=200.0 m 3个数和为:200.0 3个数平均数66.66666666666667 进程已结束,退出代码 0 */
switch多选择结构
◆多选择结构还有一个实现方式就是switch case语句。
◆switch case语句判断-个变量与一系列值中某个值是否相等,每个值称为-个分支。
◆switch语句中的变量类型可以是:
◆byte、short, int 或者char。
◆从JavaSE7开始switch支持字符串String类型了
同时case标签必须为字符串常量或字面量。
package com.shao.study; import java.util.Scanner; public class Demon5 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String grade = "null"; if(scanner.hasNext()){ grade = scanner.next(); } scanner.close(); switch (grade){ case "A": System.out.println("优秀"); break; case "B": System.out.println("良好"); case "C": System.out.println("及格"); break; case "D": System.out.println("不及格"); default: System.out.println("未知"); } } }
for循环打印九九乘法表
package com.shao.study; import java.util.Scanner; public class Demon5 { public static void main(String[] args) { for (int i= 1;i <=9;i++){ for (int j=1;j<=i;j++){ System.out.print(i+"*"+j+"="+i*j+" "); //print不会换行 } System.out.println(); } } } /* 1*1=1 2*1=2 2*2=4 3*1=3 3*2=6 3*3=9 4*1=4 4*2=8 4*3=12 4*4=16 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 */
break continue
◆break在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用)
◆continue语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。
◆关于goto关键字
◆goto关键字很早就在程序设计语言中出现。尽管goto仍是Java的一 个保留字,但 并未在语言中得到正式使用; Java没有goto。然而,在break和continue这两个关键 字的身上,我们仍然能看出一些goto的影 子---带标签的break和continue.
◆“标签"是指后面跟一个冒号的标识符,例如: label:
◆对Java来说唯一 用到标签的地方是在循环语句之前。 而在循环之前设置标签的唯- 理由是:我们希望在其中嵌套另个循环,由于break和continue关键字通常只中断当 前循环,但若随同标签使用,它们就会中断到存在标签的地方。
打印三角形
package com.shao.study; public class Demon6 { public static void main(String[] args) { int m=10; //首先控制行数循环 for (int i = 1;i<m;i++){ for (int j=m;j>i;j--) { System.out.print(" "); //打印空白 } for (int a=1;a<=i;a++){ System.out.print("*"); // 打印前一半星号 } for (int b=1;b<i;b++){ System.out.print("*"); //打印后一半星号 } System.out.println(); } } } /*: * *** ***** ******* ********* *********** ************* *************** ***************** 进程已结束,退出代码 0 */
JAVA方法
何谓方法? //类似于C语言里的函数
◆System.out.println(),那么它是什么呢? //System 是类,out是对象,println()是方法
◆Java方法是语句的集合,它们在一起执行一个功能。
◆方法是解决一类问题的步骤的有序组合
◆方法包含于类或对象中
◆方法在程序中被创建,在其他地方被引用
◆设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成1个功能,这样利于我们后期的扩展。
◆回顾:方法的命名规则?
方法的定义
◆Java的方法类似于其它语言的函数,是一-段用来完成特定功能的代码片段,一般情况下,定义一个方法包含以下语法:
◆方法包含- 一个方法头和一一个方法体。下面是-个方法的所有部分:
◆修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
◆返回值类型:方法可能会返回值。returnValueType 是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType 是关键字void。
◆方法名: 是方法的实际名称。方法名和参数表共同构成方法签名。
◆参数类型:参数像是-个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
◆形式参数: 在方法被调用时用于接收外界输入的数据。
◆实参: 调用方法时实际传给方法的数据。
◆方法体:方法体包含具体的语句,定义该方法的功能。
public static int max(int num1,int num2){ //修饰符 返回值类型 方法名 (参数类型 参数名) ... 方法体 ... return 返回值; }
方法调用
◆调用方法:对象名.方法名(实参列表)
◆Java 支持两种调用方法的方式,根据方法是否返回值来选择。
◆当方法返回-一个值的时候,方法调用通常被当做-个值。
例如:
int larger = max(30, 40);
◆如果方法返回值是void,方法调用一定是一条语句。
System. out. println( "Hel1o, kuangshen!");
方法的重载
◆重载就是在-个类中,有相同的函数名称,但形参不同的函数。
◆方法的重载的规则:
◆方法名称必须相同。
◆参数列表必须不同(个数不同、或类型不同、参数排列顺序不同等)。◆方法的返回类型可以相同也可以不相同。
◆仅仅返回类型不同不足以成为方法的重载。
◆实现理论:
◆方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。
可变参数
◆JDK 1.5开始,Java支持传递同类型的可变参数给一一个方法。
◆在方法声明中,在指定参数类型后加一个省略号(..)。
◆-个方法中只能指定一个可变参数,它必须是方法的最后-个参数。任何普通的参数必须在它之前声明。
public static void printMax( double... numbers) { if (numbers.length == 0) { System. out. print1n("No argument passed"); return; } double result = numbers[0]; //排序! for (int i = 1; i < numbers .1ength; i++){if (numbers[i] > result) { result = numbers [i]; } System. out . print1n("The max value is”+ result); }
递归
◆A方法调用B方法,我们很容易理解!
◆递归就是: A方法调用A方法!就是自己调用自己
◆利用递归可以用简单的程序来解决-些复杂的问题。它通常把一个大型复杂的问题层层转化为-个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。
◆递归结构包括两个部分:
◆递归头:什么时候不调用自身方法。如果没有头,将陷入死循环。
◆递归体:什么时候需要调用自身方法。
//递归练习 package com.shao.study; import java.util.Scanner; public class Demon7 { public static void main(String[] args) { int a = 0; System.out.println("请输入:"); Scanner scanner = new Scanner(System.in); if(scanner.hasNextInt()){ a = scanner.nextInt();//int a 早已定义,此处不用定义,只有String类型的,前面没定义才需要在此定义 } System.out.println("乘阶结果为:"+f(a)); scanner.close(); } public static int f(int n){ if (n==1){ return 1;//此处是1,不能是0 ,乘以零结果都为0 }else { return n*f(n-1);//递归调用 } } }
作业 加减乘除
https://blog.csdn.net/u012429555/article/details/51317798?utm_medium=referral
数组
数组的定义
◆数组是相同类型数据的有序集合.
◆数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成。
◆其中,每-个数据称作一个数组元素每个数组元素可以通过一个下标来访问它们.
数组声明创建
◆首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:
dataType[ ] arrayRefVar;//首选的方法
或
dataType arrayRefVar[]; // 效果相同,但不是首选方法
◆Java语言使用new操作符来创建数组,语法如下:
dataType[ ] arrayRefVar = new dataType [ arraySize];
◆数组的元素是通过索引访问的,数组索引从0开始。
◆获取数组长度:
arrays . length
//示例 package com.shao.study; public class Demon9 { public static void main(String[] args) { int[] nums;//申明数组 nums =new int[5];//创建一个数组 int[] num2=new int[2];//效果是一样的 nums[0]=1; nums[1]=5; nums[2]=10; nums[3]=6; nums[4]=7; int sum = 0; for (int i = 0;i<nums.length;i++){ //arrays.length 可以获取数组长度 sum = sum +nums[i]; } System.out.println("总和为:"+sum); } } /* 总和为:29 进程已结束,退出代码 0 */
Java内存分析
◆堆
◆存放new的对象和数组
◆可以被所有的线程共享,不会存放别的对引用
◆栈
◆存放基本变量类型(会包含这个基本类型的具体数值)
◆引用对的变量(会存放这个引用在堆里面的具体地址)
◆方法区
◆可以被所有的线程共享
◆包含了所有的class和static变量
三种初始化
静态初始化
int[] a = {1,2,3}; Man[] mans = {new Man(1,1), new Man(2,2)};
◆动态初始化
int[] a = new int[2];a[0]=1; a[1]=2;
◆数组的默认初始化
◆数组是引用类型,它的元素相当于类的实例变量,因此数组-经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。
数组的四个基本特点
◆其长度是确定的
。数组- -旦被创建,它的大小就是不可以改变的。
◆其元素必须是相同类型,不允许出现混合类型。
◆数组中的元素可以是任何数据类型,包括基本类型和引用类型。
◆数组变量属引用类型,数组也可以看成是对象,数组中的每个元素相当于该对象的成员变量。数组本身就是对象,Java中对象是在堆中的,因此数组无论保存原始类型还是其他对象类型,数组 对象本身是在堆中的。
数组边界
◆下标的合法区间; [0, length-1],如果越界就会报错;
public static void main(String[] args) {int[] a=new int[2]; System. out . print1n(a[2]); }
◆ArrayIndexOutOfBoundsException :数组下标越界异常!
◆小结:
◆数组是相同数据类型(数据类型可以为任意类型)的有序集合
◆数组也是对象。数组元素相当于对象的成员变量
◆数组长度的确定的,不可变的。如果越界,则报: ArrayIndexOutofBounds
数组使用
◆一般的for循环
◆For-Each循环
◆数组作方法入参
◆数组作返回值
package com.shao.study; public class Demon10 { public static void main(String[] args) { int[] arrays = {1,2,3,4,5}; //使用for增强型,for-each, 快捷缩写arrays.for for (int array : arrays) { System.out.println(array); } printArray1(arrays);//此时返回值是result所带的值 System.out.println("========="); printArray1(reverse(arrays));//在方法里套用方法,输出反转数组 } //反转数组 public static int[] reverse(int[] arrays){ //做一个新的数组,长度一致 int[] result = new int[arrays.length]; //反转操作 for (int i = 0,j = result.length-1; i <arrays.length ; i++,j--) { result[j] = arrays[i]; } return result; } //自己写方法打印 public static void printArray1(int[] arrays1){ for (int i = 0; i <arrays1.length ; i++) { System.out.print(arrays1[i]+" "); } } } /* 1 2 3 4 5 1 2 3 4 5 ========= 5 4 3 2 1 进程已结束,退出代码 0 */
多维数组
◆多维数组可以看成是数组的数组,比如二维数组就是-个特殊的一维数组,其每一个元素都是-个- -维数组。
◆二维数组
int a[][] = new int[2][5]; //以上二维数组a可以看成-个两行五列的数组。
调用方法
package com.shao.study; public class Demon11 { public static void main(String[] args) { int[][] arrays ={{1,2},{3,4},{5,6}}; printArray1(arrays[0]);//用自己写的方法输出此二维数组的[0]行 System.out.println();//用以空行 System.out.println("======="); System.out.println(arrays[0][1]);//普通调用 System.out.println(arrays[2][1]); } //自己写方法打印 public static void printArray1(int[] arrays1) { for (int i = 0; i < arrays1.length; i++) { System.out.print(arrays1[i] + " "); } } } /* 1 2 ======= 2 6 进程已结束,退出代码 0 */
Arrays类
◆数组的工具类java.util.Arrays
◆由于数组对象本身并没有什么方法可以供我们调用,但API中提供了-个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。
◆查看JDK帮助文档
◆Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而"不 用"使用对象来调用(注意:是"不用"而不是"不能")
◆具有以下常用功能: .
◆给数组赋值:通过fill方法。
◆对数组排序:通过sort方法,按升序。
◆比较数组:通过equals方法比较数组中元素值是否相等。
◆查找数组元素: 通过binarySearch方法能对排序好的数组进行二分查找法操作。
//使用工具类 package com.shao.study; import java.util.Arrays; public class Demon12 { public static void main(String[] args) { int[] grade1 = {66,56,77,90,86};//定义一个数组,并放好值 int[] grade2 = new int[10];//定义一个空数组, Arrays.sort(grade1);//数组排序,从低到高 System.out.println(Arrays.toString(grade1));//toString用来输出数组 Arrays.fill(grade2,60);//用60填充数组 Arrays.fill(grade1,1,3,99);//在数组下标1~3下,填充99 System.out.println(Arrays.toString(grade1)); System.out.println(Arrays.toString(grade2)); } } /* [56, 66, 77, 86, 90] [56, 99, 99, 86, 90] [60, 60, 60, 60, 60, 60, 60, 60, 60, 60] 进程已结束,退出代码 0 */
冒泡排序
◆八大排序算法之一,时间复杂度为O(n2)
//冒泡排序 package com.shao.study; import java.util.Arrays; public class Demon13 { public static void main(String[] args) { int[] xing = {33,12,46,11,9,37,67,1,22,15}; int[] wan = {33,12,46,11,9,37,67,1,22,15}; Arrays.sort( xing);//用Arrays类的方法 System.out.println(Arrays.toString(xing)); System.out.println(Arrays.toString(sort1(wan))); } public static int[] sort1(int[] wan){ int hou = 0;//临时变量 //外层循环,判断要走多少次 for (int i = 0; i <wan.length-1 ; i++) { //内层循环,比较判断两个数,通过大小判断和临时变量的接替,进行位置交换 for (int j = 0; j < wan.length-1-i ; j++) { if(wan[j+1]>wan[j]){ hou = wan[j]; wan[j] = wan[j+1]; wan[j+1] = hou; } } } return wan; } } /* [1, 9, 11, 12, 15, 22, 33, 37, 46, 67] [67, 46, 37, 33, 22, 15, 12, 11, 9, 1] 进程已结束,退出代码 0 */
稀疏数组介绍
◆当一个数组中大部分元素为0,或者为同- -值的数组时,可以使用稀疏数组来保存该数组。
◆稀疏数组的处理方式是:
◆记录数组一共有几行几列,有多少个不同值
◆把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模
◆如下图:左边是原始数组,右边是稀疏数组
[0]行表示的是:6行7列,8个有效数值;
[1]行表示的是:0行3列,为22;
[2]行表示的是:0行6列,为15;
//稀疏数组 package com.shao.study; public class Demon14 { public static void main(String[] args) { //1.创建-一个二维数组11* 11 0:没有棋子, 1:黑棋 2:白棋int[][ ] array1 = new int[11] [11] ; int[][] array1 = new int[11][11]; array1[1][2] = 1; array1[2][3] = 2; //输出原始的数组 System.out.println("输出原始的数组"); for (int[] ints : array1) { for (int anInt : ints) { System.out.print(anInt + " "); } System.out.println(); } System.out.println("================"); //转换为稀疏数组保存 //获取有效值的个数 int sum = 0; for (int i = 0; i < 11; i++) { for (int j = 0; j < 11; j++) { if(array1[i][j] != 0){ sum++; } } } System.out.println("有效值的个数:"+sum); //2创建一个稀疏数组 int[][] arrays2 = new int[sum+1][3]; arrays2[0][0] = 11; arrays2[0][1] = 11; arrays2[0][2] = sum; //遍历二维数组,将非零的值,存放习输数组中 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++; arrays2[count][0] = i; arrays2[count][1] = j; arrays2[count][2] = array1[i][j]; } } } //输出稀疏数组 System.out.println("稀疏数组"); for (int i = 0; i < arrays2.length; i++) { System.out.println(arrays2[i][0]+" " +arrays2[i][1]+" " +arrays2[i][2]+" "); } } } /* 输出原始的数组 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 ================ 有效值的个数:2 稀疏数组 11 11 2 1 2 1 2 3 2 进程已结束,退出代码 0 */
面向对象
面向过程&面向对象
◆面向过程思想
◆步骤清晰简单,第-步做什么,第=步做什么... .
◆面对过程适合处理一些较为简单的问题
◆面向对象思想
◆物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。
◆面向对象适合处理复杂的问题,适合处理需要多人协作的问题!
◆对于描述复杂的事物,为了从宏观上把握、从整体上合理分析,我们需要使用面向对象的思路来分析整个系统。但是,具体到微观操作,仍然需要面向过程的思路去处理。
什么是面向对象
◆面向对象编程(Object-Oriented Programming, 00P)
◆面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据。
◆抽象
◆三大特性:封装、继承、多态
◆从认识论角度考虑是先有对象后有类。对象,是具体的事物。类,是抽象的,是对对象的抽象
◆从代码运行角度考虑是先有类后有对象。类是对象的模板。
关于回顾方法的调用
◆静态方法与非静态方法的区别是是否在定义方法时使用static,使用就是静态,可以直接调用,没使用就是非静态,需要new.
◆对于值传递与引用传递示例
//对于值传递与引用传递示例 package com.shao.ti; public class Demon1 { public static void main(String[] args) { Person person = new Person(); System.out.println(person.name);//null Demon1.change(person); System.out.println(person.name);//晚星 } public static void change(Person person){ //person是一个对象:指向的-->Person person = new Persong();这是一个具体的人,可以改变属性 person.name = "晚星"; } } class Person{ String name;//null } /* null 晚星 进程已结束,退出代码 0 */
类与对象的关系
◆类是一种抽象的数据类型,它是对某-类事物整体描述/定义,但是并不能代表某- 个具体的事物.
◆动物、植物、手机、电脑....
◆Person类、 Pet类、 Car类等,这些类都是用来描述/定义某- 类具体的事物应该具备的特点和行为
◆对象是抽象概念的具体实例
◆张三就是人的-个具体实例,张三家里的旺财就是狗的一一个具体实例。
◆能够体现出特点展现出功能的是具体的实例,而不是一个抽象的概念.
创建与初始化对象
◆使用new关键字创建对象
package com.shao.duixiang; import java.util.Scanner; //一个项目应该只有一个main方法 public class Application { public static void main(String[] args) { //类;抽象的,实例化 //类的实例化回返回一个自己的对象; //student对象就是一个Student类的具体实例 //Student student = new Student(); Student xiaoming = new Student(); Student xiaohong = new Student(); xiaoming.name= "小明"; xiaoming.age = 3; System.out.println(xiaoming.name); System.out.println(xiaoming.age); } } //创建的Student类文件 package com.shao.duixiang; //学生类 public class Student { //属性;字段 String name; int age; //方法 public void study(){ System.out.println(this.name+"学习"); } } /* 小明 3 进程已结束,退出代码 0 */
构造器必须要掌握
◆使用newy关键字创建的时候,除了分配内存空间之外,还会给创建好的对象进行默认的初始化以及对类中构造器的调用。
◆类中的构造器也称为构造方法,是在进行创建对象的时候必须要调用的。并且构造器有以下俩个特点:
◆1.必须和类的名字相同
◆ 2. 必须没有返回类型,也不能写void
作用
1.new 本质在调用构造方法
2.初始化对象的值
注意点:
◆定义有参构造之后,如果想使用无参构造,显示的定义一个无参的构造
◆ Alt + Insert 构造器创建快捷键
◆ this. (当前类的字段)= (参数传进来的值)
//住程序main package com.shao.duixiang; import java.util.Scanner; //一个项目应该只有一个main方法 public class Application { public static void main(String[] args) { //new关键字本质是在调用构造器 Person person1 = new Person();;//调用的是无参数的 System.out.println(person1.name); House house = new House("蓝色");//调用一个有参数的 System.out.println(house.colro); System.out.println("=========="); Person person2 = new Person("红色",9); System.out.println(person2.name); System.out.println(person2.age); } } ====================================================== //Person类文件 package com.shao.duixiang; //新创建的类 Person public class Person { //一个类即使什么都不写也会存在一个无参数的构造器 String name;//字段 int age; //Alt + Insert 快速搭建构造器 //做一个构造器,无参数类型 //一旦定义了一个有参构造器,无参就必须显示定义 public Person( ){ //name指的是字段name,此处赋值 this.name = "晚星"; } public Person(String name, int age) { this.name = name; this.age = age; } } ============================================================= //house类文件 package com.shao.duixiang; public class House { String colro; //一个有参数的构造器 public House(String cloro){ this.colro = cloro; } } ============================================================= //运行结果 晚星 蓝色 ========== 红色 9 进程已结束,退出代码 0
创建对象的内存分析
简单小结类与对象
1.类与对象
类是一个模板:抽象,对象是一个具体的实例
2.方法
定义、调用!
3.对应的引用
引用类型: 基本类型 (8)
对象是通过引用来操作的:栈--->堆
4.属性 : 字段Field 成员变量
默认初始化:
数字: 0 0.0
char : u0000
booLean: false
引用: null
修饰符 属性类型 属性名=属性值!
5.对象的创建和使用
-必须使用 new 关键字创造对象,构造器 Person kuangshen = new Person();
-对象的属性 kuangshen. name
-对象的方法 kuangshen. sleep( )
6.类:
静态的属性 属性
动态的行为 方法
封装
◆该露的露,该藏的藏
◆我们程序设计要追求“高内聚,低耦合”。高内聚就是类的内部数据操作细节自己完成,不允许外部干涉;低耦合:仅暴露少量的方法给外部使用。
◆封装(数据的隐藏)
◆通常, 应禁止直接访问-一个对象中数据的实际表示,而应通过操作接口来访问,这称为信息隐藏。
◆记住这句话就够了: 属性私有,get/set
作用:
1.提高程序的安全性,保护数据 2.隐藏代码的实现细节 3.统一接口 4.系统可维护增加了
package com.shao.duixiang; import com.shao.duixiang.feng.Student; public class Application { public static void main(String[] args) { Student s1 = new Student(); s1.setName("少年");//赋值 System.out.println(s1.getName()); s1.setAge(26); System.out.println(s1.getAge()); } } ============================================ //Student类方法文件 package com.shao.duixiang.feng; public class Student { //属性私有 private String name; //名字 private int age;//年龄 private char sex;//性别 //提供public的 get set 方法操作 public String getName() { return this.name; } public void setName(String name) { this.name = name; } //Alt + Insert 快捷键 public int getAge() { return age; } public void setAge(int age) { //此处对传入的年龄age进行判断,如果不合法则输出三岁 if (age >120 || age<0){ this.age =3; }else{ this.age = age; } } } /* 少年 26 进程已结束,退出代码 0 */
继承
◆继承的本质是对某- -批类的抽象,从而实现对现实世界更好的建模。 ◆extends的意思是“扩展”。子类是父类的扩展。 ◆JAVA中类只有单继承,没有多继承! ◆J继承是类和类之间的一-种关系。除此之外,类和类之间的关系还有依赖、组合、聚合等。 ◆继承关系的俩个类,-个为子类(派生类),-个为父类(基类)。子类继承父类,使用关键字extends来表示。 ◆子类和父类之间,从意义上讲应该具有"is a"的关系. ◆object类 Java中,所有类都默认直接或间接继承Object类 ◆super 调用父类构造器,在子类中,调用父类构造器的代码默认在也只能在子类第一行 ◆方法重写
super注意点:
-
super 调用父类的构造方法,必须在构造方法的第一一个
-
super 必须只能出现在子类的方法或者构造方法中!
-
super和this不能同时调用构造方法! Vs this: 代表的对象不同: this:本身调用者这个对象 super:代表 父类对象的应用 前提 this:没哟继承也可以使用 super:只能在继承条件才可以使用 构造方法. this() ; 本类的构造 super():父类的构造!
重写
需要有继承关系,子类重写父类的方法! 1.方法名必须相同 2.参数列表列表必须相同 3.修饰符:范围可以扩大但不能缩小:| public>Protected>Default>private 4.抛出的异常:范围,可以被缩小,但不能扩大; ClassNotFoundException --> Exception(大) 重写,子类的方法和父类必要一致; 方法体不同! 为什么需要重写: 1.父类的功能,子类不一 定需要,或者不一-定满足! 快捷键:Alt + Insert ; override;
静态方法和非静态方法区别很大,非静态就可以重写。重写的子类默认为为父类的方法,在内容力要修改。
多态
◆即同- -方法可以根据发送对象的不同而采用多种不同的行为方式。 ◆-个对象的实际类型是确定的,但可以指向对象的引用的类型有很多(父类,有关系的类) ◆多态存在的条件 ◆有继承关系 ◆子类重写父类方法 ◆父类引用指向子类对象 ◆注意:多态是方法的多态,属性没有多态性。
import com. oop . demo06. Person; I import com. oop. demo06. Student; public class Application { public static void main(String[] args) { //-一个对象的实际类型是确定的 //new Student(); //new Person(); //可以指向的引用类型就不确定了:父类的引用指向子类 //Student能调用的方法都是自己的或者继承父类的! Student s1,= new Student(); //Person父类国,可以指向子类,但是不能调用子类独有的方法 Person s2 = new Student( ); Object s3 = new Student( ); //对象能执行哪些方法,主要看对象左边的类型,和右边关系不大! ((Student) s2).eat(); //子类重写了父类的方法,执行子类的方法 s1.eat(); } } /* 多态注意事项: 1.多态是方法的多态,属性没有多态 2.父类和子类,有联系类型转换异常! CLassCastException ! 3.存在条件: 继承关系,方法需要重写,父类引用指向子类对象! Father f1 = new Son(); 1. static 方法,属于类,它不属于实例 2. final 常量; 3. private方法; | */
Instanceof 和类型转换
instanceof (类型转换)引用类型, 判断一个对象是什么类型
package com.shao.duixiang; import com.shao.duixiang.feng.Person; import com.shao.duixiang.feng.Student; import com.shao.duixiang.feng.Teacher; public class Application { public static void main(String[] args) { //0bject > String //0bject > Person > Teacher //0bject > Person > Student Object object = new Student( ); //System. out. println(X instanceof Y):// 能不能编译通过! System. out . println( object instanceof Student); //true System. out. println(object instanceof Person); //true System. out. println(object instanceof Object); //true System. out . println( object instanceof Teacher); //False System. out . println(object instanceof String); //False System.out.println("==========================="); Person person = new Student( ); System. out. println(person instanceof Student); //true System. out. println(person instanceof Person); //true System. out. println(person instanceof Object); //true System. out. println(person instanceof Teacher); //False //System. out . println(person instanceof String); //编译报错! } } ====================================== //强制类型转换,父类转子类 public class App1ication { public static void main(String[] args) { //类型之间的转化:父子 //高 低 Person obj = new Student(); //student将这个对象转换为Student类型,我们就可以使用student类型的方法了! ((Student) obj) .go(); } } /* go */ ======================================= //强制类型转换子类转父类 public class Application { public static void main(String[] args) { //类型之间的转化:父子 //子类转换为父类,可能丢失自己的本来的一些方法! Student student = new Student(); . student.go(); Person person = student ; } /* 1.父类引用指向子类的对象 2.把子类转换为父类,向上转型; 3.把父类转换为子类,向下转型; 强制转换 4.方便方法的调用,减少重复的代码!简介 抽票:封装、 继承、多态!| */
Static关键字详解及代码块
//Static public class Student { private static int age; //静态的变量 多线程! private double score; // 非静态的变量 public void run() { go();//非静态可以调用静态方法 } public static void go() { //静态不可以调用非静态方法 } public static void main(String[] args) { Student s1 = new Student(); System.out.println(Student.age); //System.out.println(Student.score);score是非静态,不能这样调用 System.out.println(s1.age); System. out. println(s1.score); } }
//代码块 package com.shao.duixiang.test1; public class Person { //2:赋初值~| { System.out.println("匿名代码块"); } //1 :只执行-一次,也是一点会执行的~ static { System.out.println("静态代码块"); } //3 public Person() { System.out.println("构造方法"); } public static void main (String[]args){ Person person1 = new Person();//通过这条命令调用了静态代码块和构造方法 System.out.println("=============="); Person person2 = new Person(); } } ====================================//静态导入包方法 package com. oop . demo07; //静态导入包~ limport static java. lang . Math . random;//导入math.random包 import static java . lang .Math.PI; public class Test { public static void main(String[] args) { System. out . println(random());//如果不静态导入包,random前面还要加Math System. out . println(PI);//如果不静态导入包,PI前面还要加Math } }
抽象类
◆abstract修饰符可以用来修饰方法也可以修饰类,如果修饰方法,那么该方法就是抽象方法;如果 修饰类,那么该类就是抽象类。 ◆抽象类中可以没有抽象方法,但是有抽象方法的类一定要声明为抽象类。 ◆抽象类,不能使用new关键字来创建对象,它是用来让子类继承的。 ◆抽象方法,只有方法的声明,没有方法的实现,它是用来让子类实现的。 ◆子类继承抽象类,那么就必须要实现抽象类没有实现的抽象方法,否则该子类也要声明为抽象类。
package com. oop . demo08; //abstract 抽象类: 类 extends: 单继承~ (接口可以多继承) public abstract class Action{ //约束有人帮我们实现~ . //abstract,抽象方法,只有方法名字,没有方法的实现! public abstract void doSomething(); //1.不能new这个抽象类,只能靠子类去实现它;约束! //2.抽象类中可以写普通的方法 //3.抽象方法必须在抽象类中 //抽象的抽象:约束~ //思考题? new, 存在构造器么 ? //存在的意义 抽象出来~ 提高开发效率 }
异常
什么是异常
◆实际工作中,遇到的情况不可能是非常完美的。比如:你写的某个模块,用户输入不一定符合你的要求、你的程序要打开某个文件,这个文件可能不存在或者文件格式不对,你要读取数据库的数据,数据可能是空的等。我们的程序再跑着,内存或硬盘可能满了。等等。 ◆软件程序在运行过程中,非常可能遇到刚刚提到的这些异常问题,我们叫异常,英文是:Exception,意思是例外。这些,例外情况,或者叫异常,怎么让我们写的程序做出合理的处理。而不至于程序崩溃。 ◆异常指程序运行中出现的不期而至的各种状况,如:文件找不到、网络连接失败、非法参数等。 ◆异常发生在程序运行期间,它影响了正常的程序执行流程。
简单分类
◆要理解Java异常处理是如何工作的, 你需要掌握以下三种类型的异常: ◆检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,-个异常就发生了,这些异常在编译时不能被简单地忽略。 ◆运行时异常:运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。 ◆错误:错误不是异常, 而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
异常体系结构
◆Java把异常当作对象来处理,并定义-一个基类java.lang.Throwable作为所有异常的超类。 在Java API中已经定义了许多异常类,这些异常类分为两大类,错误Error和异常Exception。
Error
◆Error类对象由Java虚拟机生成并抛出,大多数错误与代码编写者所执行的操作无关。 ◆Java虚拟机运行错误(Virtual MachineError), 当JVM不再有继续执行操作所需的内存资源时,将出现OutOfMemoryError。这些异常发生时,Java虚拟机(JVM) 一般会选择线程终止; ◆还有发生在虚拟机试图执行应用时, 如类定义错误(NoClassDefFoundError) 、链接错误(LinkageError)。这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。
Exception
◆在Exception分支中有一个重要的子类RuntimeException (运行时异常) ◆ArraylndexOutOfBoundsException (数组下标越界) ◆NullPointerException (空指针异常) ◆ArithmeticException (算术异常) ◆MissingResourceException (丢失资源) ◆ClassNotFoundException (找不到类)等异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。 ◆这些异常-般是由程序逻辑错误引起的, 程序应该从逻辑角度尽可能避免这类异常的发生;Error和Exception的区别: Error通常是灾难性的致命的错误,是程序无法控制和处理的,当出现这些异常时,Java虛拟机(JVM) - -般会选择终止线程; Exception通常情况下是可以被程序处理的,并且在程序中应该尽可能的去处理这些异常。
异常处理机制
◆抛出异常 ◆捕获异常 ◆异常处理五个关键字 ◆try、 catch、 finally、 throw、 throws
package com.shao.study; public class Demon16 { public static void main(String[] args) { int a=1; int b=0; try { //try 监控区域 System. out. println(a/b); }catch (ArithmeticException e){ //catch 捕获异常,里面的参数是想要捕获的异常类型,最高是Throwable,后面e是给异常的命名 System. out .println( "程序出现异常,变量b不能为0"); }catch (Throwable t){ System. out .println( "这样就是多次捕获,层层递进,越高的在越下面,前面捕捉到的,后面就不会再捕捉和输出"); }finally { //处理善后工作 System. out .println("finally"); } //finally可以不要,finally,假设I0, 资源,关闭! } } /* 程序出现异常,变量b不能为0 finally 进程已结束,退出代码 0 */
捕获异常的快捷键为Ctrl + Alt + T, 在QQ热键被占用情况下,使用Ctrl + win + Alt + T
//假设这方法中,处理不了这个异常。方法上抛出异常 public void test(int a,int b) throws ArithmeticException{ if (b==0){ //throw throws throw new ArithmeticException(); //主动的抛出异常,一般在方法中 使用 }