1、输入: Scanner sc = new Scanner(System.in);
int/String 变量名 = sc.nextInt(); //a为接收字符的变量
链式编程:调用一个方法的时候,不需要变量接受它的结果,可以继续调用其他方法
eg sb.append(“aaa”).append(“bbb”);
eg:String result = new StringBuilder(str).append(str).reverse().toString(); 字符串反转
1、psvm : public static void main(String[] args) {}
2、sout : System .out.println();
快捷键
好用方法
注意事项:
键盘录入:
Sanner sc = new Sanner(System.in);
int a = sc.nextInt(); //用变量a接收输入的整数
/*
nextDouble();接收小数
next(); 接收字符串
遇到空格,制表符,回车就停止接收.这些符号后面的就不会接收了,后面的会传给下一个next**接收
*/
/*
第二套
nextLine();接收字符串
可以接收空格制表符,遇到空格才停止接收数据
*/
//混用 先用nextInt 再用nextLine 会导致下面nextLine接收不到数据 输入123 其实是123+回车 , 回车被下面的nextLine接收了 学完类型转换再用第二套
跳出到外面循环(System.exit(0); //停止虚拟机运行)
//给外面循坏起个名字 ,然后在里面跳到外面循环
while (true) {
System.out.println("-----------------欢迎来到mikotokoruk学生管理系统-------------------");
System.out.println("1:添加学生");
System.out.println("5:退出");
System.out.println("请输入您的选择:");
Scanner sc = new Scanner(System.in);
String choose = sc.next();
switch(choose){
case "1" -> System.out.println("添加学生");
System.out.println("退出");
break; //这里break只跳出Switch
}
default -> System.out.println("无此选项");
}
}
loop: while (true) { //给外面循坏起个名字 ,然后在里面跳到外面循环
System.out.println("-----------------欢迎来到mikotokoruk学生管理系统-------------------");
System.out.println("1:添加学生");
System.out.println("5:退出");
System.out.println("请输入您的选择:");
Scanner sc = new Scanner(System.in);
String choose = sc.next();
switch(choose){
case "1" -> System.out.println("添加学生");
System.out.println("退出");
break loop; //调出到loop外面
}
default -> System.out.println("无此选项");
}
}
生成随机数:
Random r = new Random();
int number1 = r.nextInt(100); //生成[0,100)间的整数,不包括100
int number2 = r.nextInt(100)+1; //生成1-100间的整数
int number = r.nextInt(arr.length); //生成0-索引最大值的随机索引
//小于零值为零 否则还是那个值
remainBlood = remainBlood < 0 ? 0 : remainBlood;
随机挑选数组中的元素
//eg
String[] boyfaces= {"风流俊雅","气宇轩昂","相貌英俊","五官端正","相貌平平","一塌糊涂","面目狰狞"};
Random r1 = new Random();
int index = r1.nextInt(boyfaces.length);//生成其索引的随机数
String face = boyfaces[index];
判断数组中有多少元素的方法
public static int getCount(Student[] arr){
int cnt=0;
for(int i = 0; i<arr.length; i++){
if(arr[i] != null);
cnt ++;
}
return cnt;
}
将数组扩大一位(不实用 后面用ArrayList对象)
//创建一个新数组 长度为老数组加一
//之前元素拷贝到新数组中
public static Student[] createNewArr(Student[] arr){
Student[] newArr = new Student[arr.length+1];
for(int i = 0; i<arr.length; i++){
newArr[i] = arr[i];
}
return newArr;
}
打印对象数组元素的信息
//注意非空才打印
public static void printArr(Student[] arr){
for (int i = 0; i < arr.length; i++) {
if(arr[i]!=null){
System.out.println(arr[i].getId()+","+arr[i].getName()+","+arr[i].getAge());
}
}
}
字符串反转
String result = new StringBuilder(str).append(str).reverse().toString();
判断大小写字母
if(c >= 'a' && c <= 'z')//小写
if(c >= 'A' && c <= 'Z')//大写
字符型数字转换为整型
char c = '2';
//利用ASCII码表进行转换
//'0' ---> 48
//'1' ---> 49
//'2' ---> 50
int num = c - 48;
获取整数中每一位数(取模得到最右边一位 然后除10)
//得到money中每一位数字 eg 123 从右获取 3 2 1
/*
123 第一次 ge = 3 moeny =12
第二次 ge = 2 moeny =1
第三次 ge = 1 moeny =0 跳出循环
*/
while(true){
int ge = money % 10;//123%10 = 3 12%10 = 2
System.out.println(ge); //第一次输出3 第二次输出2 第三次
money = money / 10; //但是当其等于0的时候没有必要再除
if(money == 0){
break;
}
}
反拿反拼
//得到money中每一位数字 eg 123 从右获取 3 2 1 并转换为大写字符串
/*
123 第一次 ge = 3 moeny =12
第二次 ge = 2 moeny =1
第三次 ge = 1 moeny =0 跳出循环
*/
String moenyStr = "";
while(true){
int ge = money % 10;//123%10 = 3 12%10 = 2
moenystr = moneystr + ge; //得到的是321
moenystr = ge + moneystr; //得到的是123
money = money / 10; //但是当其等于0的时候没有必要再除
if(money == 0){
break;
}
}
子类中用继承
//可手动写子类的带参构造
public Student(String name,int age){
super(name,age);
}
souf(System.out.printlf(“”) 输出语句
eg
System.out.printlf("你好,%s","张三");
System.out.printlf("你好,%s %s","张三","李四");
//只有输出没有换行
字符与数字用加号连接 eg:“个位是”+ge
字符+字符/字符加数字 先通过ASCII码表查询到对应数字再计算
1+‘a’ 结果98
1+“a” 结果“1a"
只要有字符串出现进行相加就是拼接操作并产生新字符串
‘a’ ----- 97
‘A’ ----- 65
&& 和 & 、||和|的运行结果都是一模一样的。
但是短路逻辑运算符可以提高程序的运行效率。
关系表达式 ? 表达式1 :表达式2 ;
int max = a > b ? a : b ;
` //格式:关系表达式 ? 表达式1 : 表达式2 ;
//注意点:
//三元运算符的最终结果一定要被使用。
//要么赋值给一个变量,要么直接输出。
int max = a > b ? a : b ;
System.out.println(max);
//格式:关系表达式 ? 表达式1 : 表达式2 ;
//注意点:
//三元运算符的最终结果一定要被使用。
//要么赋值给一个变量,要么直接输出。
int max = a > b ? a : b ;
System.out.println(max);
System.out.println(a > b ? a : b);
switch (表达式) {
case 1:
语句体1;
break;
case 2:
语句体2;
break;
...
default:
语句体n+1;
break;
}
package a01switch选择语句;
import java.util.Scanner;
public class SwitchDemo2 {
public static void main(String[] args) {
//1.键盘录入一个整数表示星期
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个整数表示星期");
int week = sc.nextInt();
//2.书写一个switch语句去跟week进行匹配
switch (week){
case 1:
System.out.println("跑步");
break;
case 2:
System.out.println("游泳");
break;
case 3:
System.out.println("慢走");
break;
case 4:
System.out.println("动感单车");
break;
case 5:
System.out.println("拳击");
break;
case 6:
System.out.println("爬山");
break;
case 7:
System.out.println("好好吃一顿");
break;
default:
System.out.println("输入错误,没有这个星期");
break;
}
}
}
jdk12
int number = 10;
switch (number) {
case 1 -> {
System.out.println("一");
}//只有一行代码大括号可省略
case 2 -> System.out.println("二");
case 3 -> System.out.println("三");
default -> System.out.println("其他");
}
利用JDK12简化代码书写
switch (week) {
case 1, 2, 3, 4, 5 -> System.out.println("工作日");
case 6, 7 -> System.out.println("休息日");
default -> System.out.println("没有这个星期");
}
case穿透
不写break会引发case穿透现象
不写break程序会继续执行下一个case语句体(尽管不满足那个case条件);
应用:多个case语句体重复,可用case穿透简化代码
当我们需要对一个范围进行判断的时候,用if的第三种格式
当我们把有限个数据列举出来,选择其中一个执行的时候,用switch语句
比如:
小明的考试成绩,如果用switch,那么需要写100个case,太麻烦了,所以用if简单。
如果是星期,月份,客服电话中0~9的功能选择就可以用switch
可以存储同种数据类型多个值的容器
定义 1.int [] array (常用) 2.int array []
1. 静态初始化: 数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3,元素4…}; eg:int[] arr = new int[] {11,22,33};
常用简化: 数据类型[] 数组名 = {元素1,元素2,元素3,元素4…}; eg:int[] array = {1,2,3,4,5}
int[] arr = {1,2,3,4,6};
System.out.println(arr);//这里输出的是地址值
System.out.println(arr[1]);
想正常访问要加索引 (从0开始的)
arr.length 就是数组长度
数组常用操作
需求:定义一个数组,存入1,2,3,4,5。按照要求交换索引对应的元素。交换前:1,2,3,4,5交换后:5,2,3,4,1
//1.定义数组存储数据
int[] arr = {1,2,3,4,5};
//2.利用循环去交换数据
for(int i = 0,j = arr.length - 1; i < j; i++,j--){
//交换变量i和变量j指向的元素
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//当循环结束之后,那么数组中的数据就实现了头尾交换
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + " ");
}
程序中最小的执行单元 用:重复高,有独立功能 好处:复用性,可维护性
定义写在main方法外面 调用写在里面
//定义
public static void 方法名 ( ) {
// 方法体;
}
//调用
方法名();
//带参数 参数格式 数据类型 变量名 eg int a
public static void 方法名 (参数1) {
方法体;
}
public static void 方法名 (参数1, 参数2, 参数3...) {
方法体;
}
多个方法在同一个类中,有相同方法名,参数不同数据类型不同
public class MethodDemo {
public static void fn(int a) {
//方法体
}
public static int fn(double a) {
//方法体
}
}
//不构成 不在同一个类
public class MethodDemo01 {
public static void fn(int a) {
//方法体
}
}
public class MethodDemo02 {
public static int fn(double a) { /*错误原因:这是两个类的两个fn方法*/
//方法体
}
}
Javabean类:用来描述一类事物的类.比如Student,Teacher
测试类:用来检查其他类是否书写正确,带有main方法,程序主入口
工具类:帮我们做一些事情的类
eg
//私有化成员变量不让外界创建这个类 方法都定义为静态
public class ArrUtil{
private ArrUtil(){
}
public static void getMax(){}
}
想干什么都是找一个个东西来解决 对象即一个又一个能帮我们解决问题的东西
有些东西并不是凭空出现
类:类就是对现实事物的一种描述(理解为设计图)
类和对象的关系:类是对事物的一种描述,对象则为具体存在的事物
类的定义步骤:
①定义类 ②编写类的成员变量 ③编写类的成员方法
类的组成 ①属性: ②行为:通常用方法体现
类是抽象的 只定义不给值
— 类里面的行为的方法不用static
public class 类名 {
// 成员变量
变量1的数据类型 变量1;//类是抽象的 只定义不给值
变量2的数据类型 变量2;
…
// 成员方法
方法1;
方法2;
}
//对象的使用/*
创建对象
格式:类名 对象名 = new 类名();
范例:Phone p = new Phone();
使用对象
1:使用成员变量
格式:对象名.变量名
范例:p.brand
2:使用成员方法
格式:对象名.方法名()
范例:p.call()
*/
public class Phone {
//成员变量
String brand;
int price;
//成员方法
public void call() {
System.out.println("打电话");
}
public void sendMessage() {
System.out.println("发短信");
}
}
public class PhoneDemo {
public static void main(String[] args) {
//创建对象
Phone p = new Phone();
//使用成员变量
System.out.println(p.brand);
System.out.println(p.price);
p.brand = "小米";
p.price = 2999;
System.out.println(p.brand);
System.out.println(p.price);
//使用成员方法
p.call();
p.sendMessage();
}
}
//例如数组中 有arr.length属性
Javabean类:用来描述一类事物的类,不写main方法
public class 类名{
1.成员变量(代表属性)
2.成员方法(代表行为)
}
测试类:编写main方法的类 ,可以在测试类中创建Javabean类并进行赋值使用
注意
一个文件定义一个class类
成员变量 一般无需指定初始值(所有的学生都交张三?)
封装 继承 多态
封装:
eg:定义一个类描述人 只要一个类就行
eg:人画圆 里有两个对象人和圆 要定义一个类 人 一个类 圆 画这个动作 放在圆里
圆是自己画出来的 人只是调用了 画圆的方法 画圆要知道圆的属性 所以放到圆里面
人关门 : 门是自己关的 人只是给门一个作用力而已 关门这个方法是门的方法不是人的
对象代表什么,就得封装对应的数据,并提供数据对应的行为
public static Circle(){
double r;
public void draw(){
System.out.println("画圆");
}
}
private修饰符:被private修饰的成员,只能在本类进行访问 为了保护数据安全性
/*
学生类
*/
class Student {
//成员变量
String name;
private int age;
//提供get/set方法
public void setAge(int a) {
if(a<0 || a>120) {
System.out.println("你给的年龄有误");
} else {
age = a;
}
}
public int getAge() {
return age;
}
//成员方法
public void show() {
System.out.println(name + "," + age);
}
}
/*
学生测试类
*/
public class StudentDemo {
public static void main(String[] args) {
//创建对象
Student s = new Student();
//给成员变量赋值
s.name = "林青霞";
s.setAge(30);
//调用show方法
s.show();
}
}
this关键字:成员变量与局部变量(方法里面的变量)重名 , 就近原则局部优先 , 优先输出方法里面的局部变量, 加this可输出成员变量
//用例 这里this.name是setName外面的属性.
public void setName (String name) {
this.name = name;
}
构造方法
/*创建对象 Student stu = **new Student();**
是一种特殊的方法 主要是完成对象数据的初始化
格式
public class 类名{
修饰符 类名( 参数 ) {
}
}*/
//
public class Student {
private String name;
private int age;
//构造方法 空参构造
public Student() {
System.out.println("无参构造方法");
}
//构造方法
public Student(String name, int age){
this.name = name;
this.age = age;
}
//行为
public void show() {
System.out.println(name + "," + age);
}
}
/*
测试类
*/
public class StudentDemo {
public static void main(String[] args) {
//创建对象
Student s = new Student();//会执行上面的 输出"无参数构造方法"
Student s = new Student("xiaowang",23);//会执行上面带参数构造
s.show();
}
}
注意
作用:创造对象的时候,由虚拟机自动调用,给成员变量进行初始化的。
无参数构造方法:初始化的对象时,成员变量的数据均采用默认值。
有参数构造方法: 在初始化对象的时候,同时可以为对象进行赋值。
注意
① 类名需要见名知意
② 成员变量使用private修饰
③ 提供至少两个构造方法
④ get和set方法 : 提供每一个成员变量对应的setXxx()/getXxx()
⑤ 如果还有其他行为,也需要写上
public class User{
//属性
private String name;
private String password;
private String email;
private String gender;
private int age;
//空参
public User(){
System.out.println("空参构造哦");
}
//带全部参的构造
public User(String name, String password, String email, String gender, int age){
this.name = name;
this.password = password;
this.email = email;
this.gender = gender;
this.age = age;
}
//get()和set()方法
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
}
//
注意:改值用set()方法改 获取值用get()方法
eg:用name1变量接受小明名字:name1 = getName();
小明年龄设成18岁:xiaoming.setAge(18);
格斗游戏
package com.mikotokoruk.test;
import java.util.Random;
public class Role {
//格斗游戏 血量姓名 k o
private String name;
private int blood;
public Role() {
}
public Role(String name, int blood) {
this.name = name;
this.blood = blood;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getBlood() {
return blood;
}
public void setBlood(int blood) {
this.blood = blood;
}
//定义一个方法用于攻击别人
//Role r1 = new Role();
//Role r2 = new Role();
//r1.攻击(r2); 方法的调用着攻击参数
public void attack(Role role){
//计算造成伤害 //加一表示1-20
Random r = new Random();
int hurt = r.nextInt(20)+1;
// role.blood = role.blood-hurt;
int remainBlood = role.getBlood()-hurt;
remainBlood = remainBlood < 0 ? 0 :remainBlood;
//修改挨揍人的血量 改要用set方法不能直接改
role.setBlood(remainBlood);
//this 表示方法的调用者
//A打了B一下造成XX点伤害,B还剩XX血
//这里用this.getName
//System.out.println(this.name + "打了" + role+"一下,造成"+""+"点伤害"+role+"还剩"+""+"血");
System.out.println(this.getName() + "打了" + role.getName()+"一下,造成"+hurt+"点伤害"+role+"还剩"+remainBlood+"血");
}
}
Car[] arr = new Car[3];
Scanner sc = new Scanner(System.in);
for(int i = 0; i<arr.length;i++){
Car c = new Car();
System.out.println("请输入第"+i+"辆车的品牌:");
String brand = sc.next();
c.setBrand(brand);
// 课替换为 c.setBrand(sc.next());
System.out.println("请输入第"+i+"辆车的价格:");
c.setPrice(sc.nextInt());
System.out.println("请输入第"+i+"辆车的颜色:");
c.setColor(sc.next());
arr[i] = c;
}
简单理解: API就是别人已经写好的东西,我们不需要自己编写,直接使用即可
java API : JDK中提供的
String StringBuilder StringJoiner
字符串内容不能被改变(可通过转化为数组改变后再转化为字符串)
String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的实例。
创建String对象
2.3String类的构造方法
常用的构造方法
方法名 | 说明 |
---|---|
public String() | 创建一个空白字符串对象,不含有任何内容 |
public String(char[] chs) | 根据字符数组的内容,来创建字符串对象 |
public String(byte[] bys) | 根据字节数组的内容,来创建字符串对象 |
String s = “abc”; | 直接赋值的方式创建字符串对象,内容就是abc 常用 |
示例代码
public class StringDemo01 {
public static void main(String[] args) {
//public String():创建一个空白字符串对象,不含有任何内容
String s1 = new String();
System.out.println("s1:" + s1);
//public String(char[] chs):根据字符数组的内容,来创建字符串对象
char[] chs = {'a', 'b', 'c'};
String s2 = new String(chs);
System.out.println("s2:" + s2);
//public String(byte[] bys):根据字节数组的内容,来创建字符串对象
byte[] bys = {97, 98, 99};
String s3 = new String(bys);
System.out.println("s3:" + s3);
//String s = “abc”; 直接赋值的方式创建字符串对象,内容就是abc
String s4 = "abc";
System.out.println("s4:" + s4);
}
}
通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同
String s1 = "abc";
String s2 = "abc";
//s1 和 s2在内存里是同一个 结果相等
String s1 = new String("abc");
String s2 = new String("abc");
// new 出来的 在内存中开辟新空间 比较的是地址值
String s1 = "abc";
String s2 = new String("abc");
//s2 记录堆中的地址值 s1 串池中的地址值 两者不相同
遍历数组(遍历后可进行许多常用操作)
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符:");
String str = sc.next();
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
System.out.println(c);
}
//
public char charAt(int index) //根据索引返回字符
public int length() //返回字符串长度
public boolean equals(String s){} //比较两个字符串内容是否相同、区分大小写
public boolean equalsIgnoreCase(String s){} //忽略大小写比较 如验证码
//截取 注意:包头不包尾 包左不包右 要用变量接收一下
String substring(int beginIndex,int endIndex)
//截取重载方法
String substring(int beginIndex)
//替换
String replace(旧值,新值)
字符串拼接
字符串反转
StringBuilder :常用于字符串拼接字符串反转
StringBuilder 可以看成是一个容器,创建之后里面的内容是可变的。
当我们在拼接字符串和反转字符串的时候会使用到
public StringBuilder append(任意类型) //添加数据并返回对象本身
public StringBuilder reverse() //反转容器中的内容
public int length() //返回长度 (字符出现个数)
public String toString() //通过toString()就可以实现把StringBuilder转换为String
//创建示例
StringBuilder sb = new StringBuilder("abc");
//此时sb 只是一个容器 帮助我们操作字符串的工具
String str = sb.toString();
//字符串反转
String result = new StringBuilder(str).append(str).reverse().toString();
StringJoiner
StringJoiner sj = new StringJoiner("间隔符号","开始符号","结束符号")
//成员方法
public StringJoiner add() //添加数据并返回对象本身
public int length() //返回长度(字符出现个数)所有字符总个数
public String toString() //返回一个字符串(该字符串就是拼接之后的结果)
//eg
StringJoiner sj = new StringJoiner(",","[","]");
String str = sj.add("aaa").add("bbb").toString();
System.out.println(str);//[aaa,bbb]
长度可变的容器 (添加元素自动扩容) :自动伸缩 可长可短
不能存基本数据类型,可以存引用数据类型 (数组都可存)
ArrayList
tip
泛型 (加个尖括号里面放入引用数据类型(String是引用数据类型,int不是))
ArrayList list = new ArrayList<> ();
ArrayList 成员方法
增删改查
方法名 | 说明 |
---|---|
public boolean add(要添加的元素) | 将指定的元素追加到此集合的末尾(返回永远true) |
public boolean remove(要删除的元素) | 删除指定元素,返回值表示是否删除成功 |
public E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
public E set(int index,E element) | 修改指定索引处的元素,返回被修改的元素 |
public E get(int index) | 返回指定索引处的元素 |
public int size() | 返回集合中的元素的个数 |
包装类
常用
char Character
int Integer
其他第一个字母大写
//eg
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
静态方法中,只能访问静态(不能访问非静态成员变量,不能访问非静态成员方法)
非静态方法可以访问所有
静态方法中没有this关键字
eg
public class Student {
private String name;
private int age;
private String gender;
public void show1(){
System.out.println(name+","+age+","+gender);
show2();
}
//上述等价于 不过我们this 通常省略 ,这里this特指这次赋值的这个对象
public void show1(Student this){
System.out.println(this.name+","+this.age+","+this.gender);
this.show2();
this.method();//非静态方法可以访问所有
}
public void show2(){
System.out.println("show2");
}
public static void method(){
//System.out.println("this:"+this);//会报错
System.out.println("静态方法");
//System.out.println(name); //访问了 非静态报错
}
//非静态的 是跟对象相关的 跟某个对象相关
//静态的是共享的 跟某一个对象没有太大关系
}
特点
调用方法:
类名调用(推荐)
对象名调用
基础
什么是继承、继承的好处?
格式
public class 子类 extends 父类{}
继承后特点
继承特点
只能单继承,但支持多层继承 爷爷(间接父类)
Java中所有类都直接或者间接继承与Object类
子类只能访问父类中非私有成员
继承中成员方法的访问特点:
this调用:就近原则
super调用:直接找父类
重写
重写的方法尽量和父类保持一致(名称,形参列表)要用@override备注
eg:
@Override
public void eat() {
super.eat();
System.out.println("吃骨头");
}
//调用时如果加super.方法名() 父类和子类重写的都执行
继承中构造方法访问特点
子类不能继承父类构造方法,但是可以通过super调用
子类构造方法第一行有个隐藏的super();
默认先访问父类中的无参构造再访问自己. 可手动写子类的有参构造
public class Person(){
String name;
int age;
public Person(){}//父类无参
public Person(String name,int age){
this.name = name;
this.age = age;
}
}
public class Studetn extends Person(){
public Studetn{
super();//这行是默认的不写也有
}
//可手动写子类的带参构造
public Student(String name,int age){
super(name,age);
}
}