🚀Write In Front🚀
📝个人主页:令夏二十三
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏:Java
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🖊
目录
1. 面向对象程序设计
1.1 对象 object
在现实世界中:是客观世界中的一个实体
在计算机世界中:是一个可标识的存储区域
1.2 类 class
具有共同属性和行为的对象集合,属性指的是变量,行为指的是方法。
类是对象的模板,对象是类的实例(对象实例):
1.3 面向对象的三大特性
封装性:程序定义很多类,将属性和行为封装在类中,这样就可以将类的细节部分隐藏起来,用户只通过受保护的接口访问某个类。
继承性:子类可以继承父类的属性和方法,便于进行分类。
多态性:不同对象调用一个同名的方法可以产生不同的效果,效果由各自对于这个方法的定义所决定。
class Animal {
public void makeSound() {
System.out.println("Animal is making a sound");
}
}
class Cat extends Animal {
public void makeSound() {
System.out.println("Meow");
}
}
class Dog extends Animal {
public void makeSound() {
System.out.println("Woof");
}
}
public class PolymorphismExample {
public static void main(String[] args) {
Animal animal1 = new Cat();
Animal animal2 = new Dog();
animal1.makeSound(); // 输出 "Meow"
animal2.makeSound(); // 输出 "Woof"
}
}
1.4 Java开发
java的开发工具是JDK。
java的开发环境是JRE,JRE包括JVM和API。
java中的class文件中包含的不是实际机器的CPU指令。
2. 第一个Java程序
2.1 Java程序的基本构成
2.2 JDK的文件组成
2.3 Hello World
public class HelloWolrd {//创建一个类
public static void main(String[] args){//创建main方法,相当于C里的main函数
System.out.print("Hello,world!");//print不换行,println换行
}
}
2.4 输入输出
2.4.1 使用Scanner类
package Week_5;
import java.util.Scanner; //使用Scanner类
public class IOlearning{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
System.out.print("请输入一个数:");
int a = scanner.nextInt();
/*
这里使用nextInt()方法接收一个整数的输入;
还可以使用nextDouble()方法接收实数的输入;
使用next()方法接收下一个单词的输入。
*/
System.out.printf("%d的平方是%d\n", a, a * a);
/*
这里的printf使用方法类似于C语言,可以在输出中插入数据;
*/
}
}
2.4.2 使用int及out
这里要注意try-catch语句的格式。
输入输出字符
package Week_5;
import java.io.*; //使用IO包
public class Inout {
public static void main(String[] args){
char c = ' ';
System.out.print("please input a char:");
try{ //要用try语句,声明是试图输入这个数,不一定符合输入规则
c = (char) System.in.read();
}catch(IOException e){} //catch语句表明记录IO错误
System.out.println("You have entered:"+c);
}
}
输入输出行
package Week_5;
import java.io.*;
public class Inoutline {
public static void main(String[] args){
String s = " ";
try{ //新建一个行输入的缓冲方法,缓冲方法里再新建一个输入流读取方法,这样就可以读取一整行的输入
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
s = in.readLine(); //记住这个读取行的方法后面的Line要大写
}catch(IOException e){}
System.out.println(s);
}
}
输入输出数字
package Week_5;
import java.io.*;
public class Inoutnumber {
public static void main(String[] args){
String s = " ";
int n = 0;
try{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Please input an int: ");
s = in.readLine();
n = Integer.parseInt(s); //加了个转换方法
}catch(IOException e){}
System.out.print("You have input "+n);
}
}
3. 数据运算、流控制和数组
3.1 数据类型、变量与常量
3.1.1 数据类型
数据类型的划分
基本类型和引用类型的差别
实际上,基本类型的数据是直接存储在对应的栈里的,而引用类型的数据在栈里只存储了其地址,真正的数据存放地是地址所指向的堆,类似于C里的指针。
Java基本数据类型
基本数据类型的自动提升
byte -> short -> int -> long -> float -> double
char -> int
数据类型强制转换和C++一样,注意进行强制类型转换时不能超出表数范围即可。
逻辑型
字符型
转义符
整型
浮点型
标识符
3.2 运算符与表达式
算术运算符:* / % + -
关于 / :运算对象都为整数,则为整除;运算对象有浮点数,则为实数除法。
算术赋值符:+= -= *= /= %=
关系运算符:> >= < <= == !=
字符串连接符:+
一元运算符:++ --
三目运算符:A?B:C
逻辑运算符:& | ^ !
记住 ^ 不是乘方,而是异或,只有两个对象不同,真值才是true!
短路运算符:&& ||
&&:第一个操作数为假则不判断第二个操作数
||:第一个操作数为真则不判断第二个操作数(和C++里的一样)
移位运算符:只能用于byte,short,int,long
移位方式 | 表达式 | 含义 |
符号右移 | num>>n | num/2^n |
无符号右移 | num>>>n | |
符号左移 | num<<n | num*2^n |
3.3 流程控制语句
3.3.1 程序的注释
3.3.2 分支语句
if-else语句和switch语句,和C++一模一样。
if-else分支语句代码示例如下,这里做了一个简单的分数评价程序:
package Week_5;
import java.io.*;
public class Controlif {
public static void main(String[] args){
int n = 0;
String s = " ";
System.out.print("Please enter your score: ");
try{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
s = in.readLine();
n = Integer.parseInt(s);
}catch(IOException e){}
if (n > 100 | n < 0)
System.out.print("Wrong Score!");
else if (n >= 90)
System.out.print("Excellent!");
else if (n >= 80)
System.out.print("Standout!");
else if (n >= 60)
System.out.print("Good!");
else
System.out.print("Come on!");
}
}
switch分支语句代码示例如下,这是一个简单的加减乘除计算器:
package Week_5;
import java.io.*;
import java.util.*;
public class Controlswitch {
public static void main(String[] args){
int a = 0, b = 0, c = 0;
System.out.print("Please enter two numbers: ");
Scanner scanner = new Scanner(System.in);
a = scanner.nextInt();
b = scanner.nextInt();
System.out.println("Please choose your compute method: 1. add 2. minus 3. multiplication 4. division");
c = scanner.nextInt();
switch(c){
case 1:
System.out.printf("%d + %d = %d", a, b, a + b);
break;
case 2:
System.out.printf("%d - %d = %d", a, b, a - b);
break;
case 3:
System.out.printf("%d * %d = %d", a, b, a * b);
break;
case 4:
System.out.printf("%d / %d = %d", a, b, a / b);
break;
default:
System.out.print("Wrong enter!");
}
}
}
3.3.3 循环语句
同C++完全一样,分为for循环语句、while循环语句和do-while循环语句。
for循环语句代码示例如下,这是一个求阶乘的简单程序:
package Week_5;
import java.util.*;
public class Controlfor {
public static void main(String[] args){
int n = 0, ans = 1;
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
for (int i = 1; i <= n; i++) {
ans *= i;
}
System.out.print(ans);
}
}
while循环语句代码示例如下,这是一个求阶乘之和的简单程序:
package Week_5;
import java.util.*;
public class Controlwhile {
public static void main(String[] args){
int n = 0, ans = 0;
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
while (n > 0) {
ans += n * n;
n--;
}
System.out.print(ans);
}
}
3.4 数组
3.4.1 数组概述
数组,顾名思义,是多个相同类型数据的组合。
一维数组的声明方式如下:
int[] a;
double []b;
boolean c[];
可以看出,方括号可以贴近数组变量名,也可以贴近数组名;可以写到变量名的前面,也可以写到变量名的后面。
3.4.2 数组的初始化
数组的声明和初始化可以写在同一句里,声明完后可以对数组元素赋值:
int[] a = new int[5];
a[0] = 3;
a[1] = 6;
a[2] = 9;
但是,在Java里,声明数组时不能指定其长度,也就是直接写出数组元素的个数,这样是不符合规则的,因为在Java里,数组只是引用类型,声明之后只是在栈上取一个地方存数组真正存放数据的堆的地址。
静态初始化
可以不new,这样就默认new一个堆来放数组元素:
double []b = {1.2, 3.4, 5.6,}; // 最后多一个逗号没问题
double []c = new double[]{1.1, 2.2, 3.3, 4.4, 5.5};
默认初始化
数组一经分配空间,其中的每个元素就会被隐式初始化,例如初始化一个整形数组,其中每个元素都被初始化为0。
3.4.3 数组元素的引用
数组元素的方式和C++一致,都是使用从0到n-1的下标来引用。
不同的是,在Java里,每个数组都有一个属性length指明它的长度,在使用for循环遍历数组的时候可以使用length来表示数组长度:
int []ages = new int[10];
for (int i = 0; i < ages.length; i++)
System.out.println(ages[i]);
3.4.4 增强的for语句
增强的for语句和python里的类似,但是这种语句在Java里是只读式遍历,不能进行赋值等其他操作:
int[] years = new int[10];
for (int year : years) // 这里的冒号可以看作python里的in,表示取数组里的每个元素
System.out.println(year);
3.4.5 复制数组
Java里的System.arraycopy方法提供了数组元素复制的功能:
//原数组,复制的来源
int[] source = {1, 2, 3, 4, 5, 6,};
//目标数组,复制的目的地
int[] dest = {1, 1, 1, 1, 1, 1, };
// 复制方法,括号中的格式为(来源数组,来源数组的复制起点,目标数组,目标数组的接收起点,复制的元素个数)
System.arraycopy(source, 0, dest, 1, source.length - 1);
3.4.6 多维数组
二维数组是数组的数组,对二维数组及以上的多维数组的声明和初始化应该按照从高维到低维的顺序进行。
二维数组的初始化:
int[][] a = {{1,2,3}, {4,5,6}, {7,8,9}};
3.4.7 数组中的continue语句
下面是一个使用continue语句跳转的代码示例:
package Week_5;
public class Array_test2 {
public static void main(String[] args){
int a[] = new int[7];
for (int i = 0; i < a.length; i++){
one_num: //为内层循环里的continue设置一个跳转的地方,否则它只会跳过对它来说最近的循环
while(true){
a[i] = (int) (Math.random()*36) + 1;
for (int j = 0; j < i; j++){
if (a[i] == a[j])
continue one_num;
}
break;
}
for (int num : a)
System.out.print(num + " ");
System.out.println();
}
补充:随机数生成
Math.random()是令系统随机选取大于等于 0.0 且小于 1.0 的伪随机 double 值
公式:Math.random()*(n-m)+m,生成大于等于m小于n的随机数;
例如:定义一个随机1到5(取不到5)的变量 [1,5)
int number=(int)(Math.random()*(5-1)+1);
int number = (int)(Math.random()*4+1);取值正好是[1,5)
4. 课内代码笔记
1. stringDemo
将字符串转换为数字:
int n = Integer.parseInt(s);
将数字转换为字符串:
String s = String.valueOf(n);
2. ComputeArea
输入的初始化和关闭:
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
double m = scanner.nextDouble();
String s = scanner.nextLine();
scanner.close();
3. TestSwitch
switch语句的选择条件也可以是字符串,然后只需要把每一个case从数字改为不同的字符串即可;
注意每个case都要有break,最后要有default。