羡慕JAVA(施工中)

  • ~5.75K 字
  1. 1. 入门
    1. 1.1. JDK
  2. 2. 基础概念
    1. 2.1. Scanner
    2. 2.2. IDEA中的项目结构:
    3. 2.3. 运算符
      1. 2.3.1. 隐式转换
      2. 2.3.2. 强制转换
      3. 2.3.3. 字符串
        1. 2.3.3.1. 字符串的+
      4. 2.3.4. 逻辑运算符
      5. 2.3.5. 短路逻辑运算符
    4. 2.4. 判断与循环
      1. 2.4.1. switch
      2. 2.4.2. 无限循环
      3. 2.4.3. 跳转控制
    5. 2.5. 数组
      1. 2.5.1. 定义
      2. 2.5.2. 初始化
        1. 2.5.2.1. 静态初始化
        2. 2.5.2.2. 动态初始化
      3. 2.5.3. 遍历
      4. 2.5.4. 内存分配
    6. 2.6. 方法
      1. 2.6.1. 定义方法
      2. 2.6.2. 调用
        1. 2.6.2.1. 带参数的
      3. 2.6.3. 方法的重载
      4. 2.6.4. 基本数据类型和引用数据类型
    7. 2.7. 面向对象编程
      1. 2.7.1. 类和对象
        1. 2.7.1.1. 如何定义类
      2. 2.7.2. 封装
        1. 2.7.2.1. private关键字
        2. 2.7.2.2. 就近原则
        3. 2.7.2.3. 构造方法的格式
        4. 2.7.2.4. 标准的Javabean类
      3. 2.7.3. 对象内存图
        1. 2.7.3.1. 一个对象的内存图
        2. 2.7.3.2. 两个对象的内存图
        3. 2.7.3.3. 两个引用指向同一个对象
      4. 2.7.4. 基本数据类型和引用数据类型
      5. 2.7.5. this的内存原理
      6. 2.7.6. 成员变量和局部变量
      7. 2.7.7. 键盘录入
        1. 2.7.7.1. 第一种
        2. 2.7.7.2. 第二种
      8. 2.7.8. 字符串
        1. 2.7.8.1. 字符串的比较

注意点:

  • 字符串比较实用equals方法,例如class1.equals("头等舱")
  • %s是占位符
  • 想要换行直接sout(),别的不用加

入门

JDK

安装目录最重要的是bin里面的javac和java

image-20250817142617448

基础概念

Scanner

1
2
3
4
5
6
7
8
9
10
import java.util.Scanner;
public class Hello {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Enter your name: ");
String name = scanner.nextLine();
System.out.println("Hello, " + name + "!");
scanner.close();
}
}

IDEA中的项目结构:

project

​ module

​ package

​ class

运算符

隐式转换

取值范围小的和取值范围大的进行运算,小的会先提升为大的再进行运算

byte short char三种类型的数据在运算的时候都会先升为int之后再进行运算

取值范围:byte<short<int<long<float<double

强制转换

取值范围大的不能付给取值范围小的,如果想这么做就要强制转换

目标数据类型 变量名=(目标数据类型) 被强制转换的数据;

字符串

字符串的+

“+”是字符串连接,不是算术运算,会拼接前后数据,例如

逻辑运算符

正常的&,|,^(异或),!不在赘述

短路逻辑运算符

&&,||

效果和&,|一样,但是有短路效果,如果左边的表达式能够确定最终的结果,那么右边的就不参与运行

判断与循环

switch

多case写法

1
2
3
4
5
switch(week){
case 1,2,3,4,5 -> System.out.println("work");
case 6,7 -> System.out.println("rest");
default -> System.out.println("error");
}

无限循环

1
2
3
4
5
6
7
8
9
for(;;){
xxxx;
}
while(true){
xxxx;
}
do{
xxxx;
}while(true);

跳转控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
for(int i=1,;i<=5;i++)
{
if(i==3){
continue;
}
System.out.println("i = " + i);
}
for(int i=1;i<=5;i++)
{
if(i==4){
break;
}
System.out.println("i = " + i);
}

数组

定义

  1. 数据类型[]数组名 例如 int[] array
  2. 数据类型 数组名 [] 例如int array[]

初始化

在内存中为数组开辟空间并且把数据存入容器中的过程

静态初始化

数据类型[]数组名=new 数据类型[]{元素1,元素2,元素3…};

int[] array=new int[]{11,22,33}; 长度为3,数组长度不变化

double[] array2=new double[]{11.1,22.2};

简写格式:

int[] array={11,22,33};

动态初始化

数据类型[]数组名=new数据类型[数组长度];

int[] arr=new int[3];

遍历

数组长度用数组名.length即可

内存分配

  1. 栈:方法运行时使用的内存,比如main方法运行,进入方法栈中执行

程序的主入口(main方法)开始执行会进栈,执行完毕会出栈

  1. 堆:储存对象或者数组,new创建新的,都储存在堆内存

new出来的东西会在这块内存中开新的空间并产生地址

  1. 方法区:储存可以运行的class文件
  2. 本地方法栈:JVM在操作系统功能时使用
  3. 寄存器:给CPU使用

方法区在JDK8开始取消,新增元空间,将方法区功能进行拆分,有点放到堆里面有的到元空间里面

方法

方法是程序中最小的执行单元

说白了就是函数

定义方法

1
2
3
public static void 方法名(){
方法体;
}

调用

1
方法名();

需要先定义后调用.

带参数的

public static void 方法名(参数1,参数2){}

调用方法名(参数1,参数2);

要返回值就用return返回值;

注意方法不调用不会执行,方法和方法之间是平级关系,不可以嵌套定义,方法的编写顺序和执行顺序无关

返回值为void没有返回值,可以不写return,return后面跟的是变量名不是具体数据

如果是数组就用类似public static int[] 名称这种

方法的重载

在同一个class里面定义了多个同名的方法,这些同名的方法具有同种功能

每个方法具有不同的参数类型或者参数个数,这些同名的方法构成了重载关系

同一个class中方法名相同参数不同的方法.与返回值无关

参数不同:个数不同,类型不同,顺序不同

基本数据类型和引用数据类型

基本数据类型:整数,浮点数,布尔,字符

引用数据类型:除了上面的之外的 存储的是地址值

面向对象编程

类和对象

类:是对象共同特征的描述

对象:真实存在的具体东西

先设计类才能获得对象

如何定义类

1
2
3
4
5
6
7
public class 类名{ //注意是没有static的
1 成员变量(代表属性,一般是名词);
2 成员方法(代表行为,一般是动词);
3 构造器;
4 代码块;
5 内部块;
}

如何得到类的对象:

类名 对象名=new 类名();

比如:Phone p = new Phone();

如何使用对象:

访问属性:对象名.成员变量

访问行为:对象名.方法名(…)

  • 用来描述一类事物的类叫:Javabean类,不写main方法
  • 编写main方法的类叫做测试类,可以在测试类中创建Javabean类的对象并进行赋值调用

Tips:

类名首字母大写比较好

一个java文件中可以有多个class类,而且只能一个类是public修饰,而且public修饰的类名必须成为代码文件名 一般还是建议一个文件一个class类

成员变量完整定义格式:修饰符 数据类型 变量名称 =初始化值; 一般不需要指定初始化值,存在默认值

封装

封装告诉我们如何正确设计对象的属性和方法

对象代表什么,就得封装对应的数据,并且提供数据对应的行为

private关键字

  • 是一个权限修饰符
  • 可以修饰成员(成员变量和成员方法)
  • 被private修饰的成员只能在本类中才能访问

一个标准的private赋值方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class GirlFriend{
private int age;

//赋值
public void setAge(int a){
if(a>=18&&a<=50){
age=a;
}else{
System.out.println("illegal");
}
}
public int getAge(){
return age;
}
}

就近原则

如果在方法中的变量和类里面的变量同名通常用离得近的,如果想用类中的需要加上this. 类似:this.age

构造方法的格式

例子:

1
2
3
4
5
6
public class Student{

修饰符 类名(参数){
方法体;
}
}

Tips:

1.方法名与类名相同,大小写也要一致

2.没有返回值类型,连void都没有

没有具体的返回值(不能用return返回数据)

1
2
3
4
5
6
7
8
9
10
11
12
public class Student{
private String name;
private int age;

public Student(){
空参数构造方法
}
public Student(String name,int age){
带参数构造方法
}

}

执行时机:

  1. 创建对象的时候由虚拟机调用,不能手动调用构造方法

  2. 每创建一次对象,就会调用一次构造方法

注意事项

  1. 构造方法的定义

    • 如果没有定义构造方法,系统将给出一个默认无参数构造方法
    • 如果定义了构造方法,系统将不在提供默认的构造方法
  2. 构造方法的重载

    • 带参构造方法和无参构造方法,两者方法名相同,但是参数不同,这叫构造方法的重载
  3. 建议:不论是否使用,都手动书写无参数构造方法和待全部参数的构造方法

标准的Javabean类

  1. 类名需要见名知意
  2. 成员变量应该使用prvate修饰
  3. 提供至少两个构造方法
    • 无参数构造方法
    • 带全部参数的构造方法
  4. 成员方法
    • 提供每一个成员变量对应的setXxx()/getXxx()
    • 如果还有其他行为也要写上

对象内存图

Student s= new Student();

  1. 加载class文件
  2. 申明局部变量
  3. 在堆内存中开辟一个空间
  4. 默认初始化
  5. 显示初始化
  6. 构造方法初始化

一个对象的内存图

image-20250830115508199

new在堆内存开了一个空间(自身有地址值而且还有成员对象和成员方法的地址值)

如果用有参构造会给name和age之类的成员对象赋值

堆内存的地址会赋给变量s

两个对象的内存图

![屏幕截图 2025-08-30 120838](https://raw.githubusercontent.com/ZHOUGONG24/pic/master/屏幕截图 2025-08-30 120838.png)

两个引用指向同一个对象

![屏幕截图 2025-08-30 121245](https://raw.githubusercontent.com/ZHOUGONG24/pic/master/屏幕截图 2025-08-30 121245.png)

基本数据类型和引用数据类型

比如

1
2
3
4
5
6
public class TestStudent{
public static void main(String[] args){
Student s = new Student();
int[] arr = {1,2,3,4};
}
}

里面的s,arr就是引用数据类型

基本数据类型的数据值是储存在自己的空间里的

赋值给其他变量,也是赋的真实的值

引用数据类型的数据值是储存在其他空间里的

自己的空间中储存的是地址值,给别人赋值也是赋的地址值

this的内存原理

this区分了局部变量和成员变量

它的本质就是所在方法调用者的地址值

成员变量和局部变量

区别 成员变量 局部变量
类中位置不同 类中,方法外 方法内、方法申明上
初始化值不同 有默认初始化值 没有,使用之前需要完成赋值
内存位置不同 堆内存 栈内存
生命周期不同 随着对象的创建而存在,随着对象的消失而消失 随着方法的调用而存在,随着方法的运行结束而消失
作用域 整个类中有效 当前方法中有效

键盘录入

第一种

nextInt();接受整数

nextDouble();接受小数

next();接受字符串

上述三种遇到空格,制表符,回车就停止接受数据了

第二种

nextLine();接受字符串

可以接受空格制表符,遇到回车才停止接受数据

注意,键盘录入的两种方式是不可以混用的

字符串

Java中的所有字符串文字,都是此类的对象

可以用String s=newString(char[] chs) String s=new String(byte[] bytes)来创建,当然了可以直接创建 String s="xxx"

如果使用双引号直接赋值,系统会检查该字符串在串池中是否存在,不存在就创建新的存在就复用

字符串的比较

使用==对于引用数据类型比较的是地址值

应该使用:

  • boolean equals方法(要比较的字符串) 完全一样为true否则为false
  • boolean equalsIgnoreCase(要比较的字符串)忽略大小写的比较

sc.next()得到的字符串是new出来的新的