原文链接:公众号狂神说
视频教程[狂神说B站]: https://www.bilibili.com/video/BV12J41137hu
如有侵权,联系立删
简单性、面向对象、可移植性、高能性、分布式、动态性、多线程、安全性、健壮性。
要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用
弱类型语言
由于Java是强类型语言,所以要进行有些运算的时候的,需要用到类型转换。
低-------------------------------> 高
byte, short,char-> int -> long-> float -> double
运算中,不同类型的数据先转化为同一类型,然后进行运算。
强制类型转换
高–>低
自动类型转换
低–>高
注意点:
变量是什么:就是可以变化的量!
Java是一种强类型语言,每个变量都必须声明其类型。
Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。
type varName [=value] [{
,varName[=value]}] ;
//数据类型变量名 =值;可以使用逗号隔开来声明多个同类型变量。
注意事项:
public class demo01 {
//类变量static
static double salary = 2500;
//属性:变量
//实例变量:从属于对象;如果不自行初始化,这个类型的默认值 0.0
//布尔值:默认是false
//除了基本类型,其余的默认值都是nulL;
String name;
int age;
//main方法
public static void main(String[] args) {
//局部变量;必须声明和初始化值
int i=10;
System.out. println(i);
//变量类型变量名字 = new Demo08();
demo01 demo01 = new demo01();
System. out. println(demo01.age);
System. out . println(demo01. name);
//类变量static
System.out. println(salary);
}
//其他方法
public void add(){
}
}
常量(Constant): 初始化(initialize)后不能再改变值!不会变动的值。
所谓常量可以理解成一种特殊的变量,它的值被设定后,在程序运行过程中不允许被改变.
final常量名=值;
final double PI=3.14;
常量名一般使用大写字符。
算术运算符
short+bety+long+int–>存在long为long,否则结果为int
存在double则为double
a++、++a
int b = a++; //执行完这行代码后, 先给b赋值,再自增
int c = ++a; 执行完这行代码前, 先自增,再给b赋值
位运算符
<<、>>效率极快
字符串连接符+
System . out .println("" +a+b);//""先和a拼接,在和b拼接,a+b不进行算术运算
System . out. println(a+b+"");//a+b先进行算术运算,在和""拼接
为了更好地组织类,Java 提供了包机制,用于区别类名的命名空间。
包语句的语法格式为:
package pkg1[. pkg2[. pk...]];
一般利用公司域名倒置作为包名;
为了能够使用某一个包的成员,我们需要在Java程序中明确导入该包。使用"import"语句可
完成此功能
import package1[. package..].(classname |*);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wDHiW2pT-1590302143162)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1589881750591.png)]
之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入。java.util.Scanner 是Java5的新特征,我们可以通过Scanner类来获取用户的输入。
基本语法:
Scanner S = new Scanner( System. in);
通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext()与hasNextLine()判断是否还有输入的数据。
next()和hasNext()
public class Demo02_Scanner {
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()和hasNextLine()
public class Demo02_Scanner {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("使用nextLine方式接收: ");
//判断是否还有输入
if (scanner.hasNextLine()) {
String str = scanner.nextLine();
System.out.println("输出的内容为: " + str);
}
scanner.close();
}
}
next():
nextLine():
使用语法
public class Demo02_Scanner {
public static void main(String[] args) {
Scanner scanner = new Scanner(System. in);
System.out.println("请输入数据: ");
String str = scanner.nextLine( );
System.out .println( "输出的内容为: "+str);
scanner.close();
}
}
其他hasNextInt()和hasNextFloat()
public class Demo03_Scanner {
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()) {
f = scanner.nextFloat();
System.out.println("小数数据: " + f);
} else {
System.out.println("输入的不是小数数据! ");
}
scanner.close();
}
}
输入多个数字,并求其总和与平均数
import java.util.Scanner;
public class Demo04_Scanner {
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=m+1; //m++
sum=sum+x;
System.out.println("你输入了第"+m+"个数据,然后当前结果sum=" +sum) ;
}
System.out.println(m + "个数的和为" + sum);
System.out.println(m +"个数的平均值是" + (sum / m));
scanner.close();
}
}
多选择结构还有一个实现方式就是switch case语句。
switch case语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。
switch 语句中的变量类型可以是:
byte、short, int 或者char.
从JavaSE7开始,switch支持字符串String类型了
public class Demo05_Switch {
public static void main(String[] args) {
String name = "狂神";
switch (name){
case "秦疆":
System.out.println("秦疆");
break;
case "狂神":
System.out.println("狂神");
break;
default :
System.out.println("弄啥嘞! ");
}
}
}
class文件(hashCode())
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package com.base;
public class Demo05_Switch {
public Demo05_Switch() {
}
public static void main(String[] args) {
String name = "狂神";
byte var3 = -1;
switch(name.hashCode()) {
case 941788:
if (name.equals("狂神")) {
var3 = 1;
}
break;
case 997472:
if (name.equals("秦疆")) {
var3 = 0;
}
}
switch(var3) {
case 0:
System.out.println("秦疆");
break;
case 1:
System.out.println("狂神");
break;
default:
System.out.println("弄啥嘞! ");
}
}
}
同时case标签必须为字符串常量或字面量。
这里我们先只是见一面,做个了解,之后数组我们重点使用
Java5引入了一种主要用于数组或集合的增强型for循环。
Java增强for循环语法格式如下:
for(声明语句:表达式)
{
//代码句子
}
public class Demo06_Foreach {
public static void main(String[] args) {
int[] numbers = {
10,20,30,40,50}; //定义了一个数组
//遍历数组的元素
for (int x: numbers){
System.out.println(x);
}
}
}
public class Demo07_Label {
public static void main(String[] args) {
//打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+" ");
}
}
}
System.out.println(), 那么它是什么呢?
Java方法是语句的集合,它们在一起执行一个功能。
设计方法的原则:方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成1个功能,这样利于我们后期的扩展。
回顾:方法的命名规则?
Java的方法类似于其它语言的函数,是-段用来完成特定功能的代码片段,一般情况下,定义一个方法包含以下语法:
方法包含一个方法头和一个方法体。下面是一个方法的所有部分:
修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
返回值类型:方法可能会返回值。returnValueType 是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType 是关键字void。
方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
方法体:方法体包含具体的语句,定义该方法的功能。
修饰符 返回值 类型 方法名(参数类型参数名){
方法体
return返回值;
}
重载就是在一个类中,有相同的函数名称,但形参不同的函数。
方法的重载的规则:
实现理论:
方法名称相同时,编译器会根据调用方法的参数个数、参数类型等去逐个匹配,以选择对应的方法,如果匹配失败,则编译器报错。
有时候你希望运行一个程序时候再传递给它消息。这要靠传递命令行参数给main()函数实现。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-279o2TJf-1590302143170)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1589890633703.png)]
public class CommandLine {
public static void main(String args[]){
for(int i=0; i<args.length; i++){
System. out. println("args["+ i + "]:"+ args[i]);
}
}
}
public class Demo08 {
public static void main(String args[]) {
//调用可变参数的方法
printMax(15,22.0,36,25.3);
printMax(new double[]{
1, 2, 3});//本质为数组
}
public static void printMax(double... numbers) {
if (numbers.length == 0) {
System.out.println("No argument passed");
return;
}
double result = numbers[0];
//排序!
for (int i = 1; i < numbers.length; i++) {
if (numbers[i] > result) {
result = numbers[i];
}
}
System.out.println("The max value is " + result);
}
}
首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:
dataType[] arrayRefVar; // 首选的方法
或
dataType arrayRefVar[]; // 效果相同,但不是首选方法
Java语言使用new操作符来创建数组,语法如下:
dataType[] arrayRefVar = new dataType[arraySize] ;
数组的元素是通过索引访问的,数组索引从0开始。
int[] nums; //1.声明-一个数组
nums = new int[10]; //2. 创建一个数组
nums[0] = 1;//3.给数组元素中赋值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AH0ioxe6-1590302143175)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1589892489281.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R7jKY9tD-1590302143178)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1589892447051.png)]
静态初始化
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;
数组的默认初始化
数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式初始化。
For-Each循环
public class Demo09_Array {
public static void main(String[] args) {
int[] arrays = {
1,2,3,4,5};
//JDK1.5,没有下标
for (int array : arrays) {
System.out.println(array);
}
}
}
数组作方法入参
public class Demo09_Array {
public static void main(String[] args) {
int[] arrays = {
1,2,3,4,5};
printArray(arrays);
}
//打印数组元素
public static void printArray(int[] arrays){
for (int i = 0; i < arrays.length; i++) {
System.out.print(arrays[i]+" ");
}
}
}
数组作返回值
public class Demo09_Array {
public static void main(String[] args) {
int[] arrays = {
1,2,3,4,5};
int[] reverse = reverse( arrays);
printArray(reverse);
}
//反转数组
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 printArray(int[] arrays){
for (int i = 0; i < arrays.length; i++) {
System.out.print(arrays[i]+" ");
}
}
}
多维数组可以看成是数组的数组,比如维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组。
二维数组
int a[][] = new int[2][5];
思考:多维数组的使用?
数组的工具类java.util.Arrays
由于数组对象本身并没有什么方法可以供我们调用,但API中提供了-一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本的操作。
查看JDK帮助文档
Arrays类中的方法都是static修饰的静态方法,在使用的时候可以直接使用类名进行调用,而"不用"使用对象来调用(注意:是"不用"而不是"不能")
具有以下常用功能:
给数组赋值:通过fill方法。
对数组排序:通过sort方法,按升序。
Arrays.sort(a);
System.out.println(Arrays.toString(a));
比较数组:通过equals方法比较数组中元素值是否相等。
查找数组元素: 通过binarySearch方法能对排序好的数组进行二分查找法操作。
package com.base;
import java.util.Arrays;
public class Demo10_Arrays {
public static void main(String[] args) {
int[] a = {
1, 2, 3, 4, 9090, 31231, 543, 21, 3, 23};
System.out.println(a); // 数组对象的hashcode [I@4554617c
//打印数组元素Arrays.tostring
System.out.println(Arrays.toString(a));
printArray(a);
}
//自己编写打印数组的方法
public static void printArray(int[] a) {
for (int i = 0; i < a.length; i++) {
if (i == 0) {
System.out.print("[");
}
if (i == a.length - 1) {
System.out.print(a[i] + "]");
} else {
System.out.print(a[i] + ", ");
}
}
}
}
冒泡排序无疑是最为出名的排序算法之一, 总共有八大排序!
冒泡的代码还是相当简单的,两层循环,外层冒泡轮数,里层依次比较,江湖中人人尽皆知。
我们看到嵌套循环,应该立马就可以得出这个算法的时间复杂度为0(n2)。
import java.util.Arrays;
//1. 比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换他们的位置
//2. 每一次比较,都会产生出一个最大,或者最小的数字;
//3. 下一轮则可以少一次排序!
//4. 依次循环,直到结束!
public class Demo11 {
public static void main(String[] args) {
int[] a = {
1, 4, 5, 6, 72, 2, 2, 2, 25, 6, 7};
int[] sort = sort(a); //调用完我们自己写的排序方法以后,返回一个排序后的数组
System.out.println(Arrays.toString(sort));
}
public static int[] sort(int[] array) {
//临时变量
int temp = 0;
//外层循环,判断我们这个要走多少次;
for (int i = 0; i < array.length - 1; i++) {
Boolean flag = false;
//内层循环,比价判断两个数,如果第一个数,比第二个数大,则交换位置
for (int j = 0; j < array.length - 1 - i; j++) {
if (array[j + 1] > array[j]) {
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
flag = true;
}
}
if (flag == false){
break;
}
}
return array;
}
}
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1JnVvy5b-1590302143181)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\1589895946078.png)]
public class Demo12_Sparse {
public static void main(String[] args) {
//创建一个元素的二维数组 11*11 0:没有棋子 1: 黑棋 2: 白棋
int chessArry1[][] = new int[11][11];
chessArry1[1][2] = 1;
chessArry1[2][3] = 2;
for (int [] row : chessArry1) {
for ( int data : row) {
System.out.printf("%d\t", data);
}
System.out.println();
}
int[][] paraseArr = transformSparseArr(chessArry1);
transformArry(paraseArr);
}
//二维数组 转 稀疏数组
public static int[][] transformSparseArr( int[][] arry) {
int sum =0; // 有效值的个数
int rowSize = 0;
//1、计算出有效的个数
for (int[] row :arry) {
for ( int data :row) {
rowSize = row.length;
if (data != 0) {
sum++;
}
}
}
//创建稀疏数组 并给稀疏数组赋值
int [][] sparseArr= new int[sum+1][3];
sparseArr [0][0] = arry.length;
sparseArr [0][1] = rowSize;
sparseArr [0][2] = sum;
//count 计数器 计算放入的有效个数 即第几个非零数据
int count = 0;
for (int i = 0; i < arry.length; i++) {
for (int j = 0; j < rowSize ; j++) {
if (arry[i][j] != 0) {
count++;
sparseArr[count][0] = i;
sparseArr[count][1] = j;
sparseArr[count][2] = arry[i][j];
}
}
}
// 输出稀疏数组形式
System.out.println("===========稀疏数组============");
for (int i = 0; i < sparseArr.length; i++) {
// %d 占位符 \t 制表符 \n 换行
System.out.printf("%d\t%d\t%d\t\n", sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
}
System.out.println();
return sparseArr;
}
// 稀疏数组 转化为 二维数组
public static int[][] transformArry(int[][] parseArr) {
int row = parseArr[0][0]; //得到行
int col = parseArr[0][1]; //得到列
//数组恢复 并赋值
int[][] arry = new int[row][col];
for (int i = 1 ; i < parseArr.length; i++) {
arry[parseArr[i][0]][parseArr[i][1]] = parseArr[i][2];
}
// 输出
System.out.println("============二维数组恢复==============");
for (int [] rows: arry) {
for (int data : rows) {
System.out.printf("%d\t", data);
}
System.out.println();
}
return arry;
}
}
~~~java
or (int i = 0; i < sparseArr.length; i++) {
// %d 占位符 \t 制表符 \n 换行
System.out.printf("%d\t%d\t%d\t\n", sparseArr[i][0],sparseArr[i][1],sparseArr[i][2]);
}
System.out.println();
return sparseArr;
}
// 稀疏数组 转化为 二维数组
public static int[][] transformArry(int[][] parseArr) {
int row = parseArr[0][0]; //得到行
int col = parseArr[0][1]; //得到列
//数组恢复 并赋值
int[][] arry = new int[row][col];
for (int i = 1 ; i < parseArr.length; i++) {
arry[parseArr[i][0]][parseArr[i][1]] = parseArr[i][2];
}
// 输出
System.out.println("============二维数组恢复==============");
for (int [] rows: arry) {
for (int data : rows) {
System.out.printf("%d\t", data);
}
System.out.println();
}
return arry;
}
}
B站地址