1.静态和非静态
2.调用静态和非静态的过程
注:在Java中,同类中,确实可以使用类的对象来调用静态方法,尽管这不是推荐的做法。静态方法属于类本身,而不是类的任何特定实例。因此,理论上讲,你应该通过类名来调用静态方法,而不是通过类的实例。
1.加载
开始调用之前需要将Tset类加载;
这一句的作用顺序也是先加载Static_ B类然后再在堆中创建对象static B,都需要先加载!
2.非静态掉用过程
非静态方法:需要通过类的实例(对象)来调用,也就是需要先创建类的对象,因为非静态方法属于类的实例,所以每个实例都可以有自己的非静态方法副本(尽管在大多数情况下,由于方法区共享,这只是一个概念上的说法)。非静态随着实例(对象)加载而加载;
3.静态调用过程(蓝色)
静态方法:可以直接通过类名来调用,而无需创建类的实例。这是因为静态方法属于类本身,而不是类的某个特定对象。所以使用Static_ B.mi直接调用,跳过堆区;静态成员随着类的加载而加载。
3.调用权限
-
静态方法:只能直接访问类的静态变量和静态方法,不能直接访问类的非静态变量和非静态方法。如果需要访问非静态成员,必须通过 类 对象 = new 类 来访问。
-
非静态方法:可以访问类的静态变量、静态方法以及非静态变量和非静态方法,全都可以直接访问。
4.内存占用
-
静态方法属于类级别,理论上不占用对象的堆内存。但是,静态方法中的局部变量仍然会被存储在栈内存中。
-
非静态方法作为对象的一部分,虽然其方法体本身不直接占用对象的堆内存,但方法的调用(包括方法中的局部变量)会占用栈内存。
5.功能分类
1.静态方法:
通常用于工具类中的方法,这些方法不依赖于对象的状态,而是执行一些通用的操作(查询之类的)。
2.非静态方法:
通常用于表示对象的行为,这些行为可能会修改对象的状态或基于对象的状态来执行操作,特殊性使用非静态。
6.生命周期
-
静态方法:在类加载到JVM时就被加载到方法区,因此它的生命周期和类相同。当类被卸载时,静态方法也随之卸载。
-
非静态方法:不直接关联于类的加载过程。非静态方法通常在创建类的实例时,随实例一起被初始化(虽然方法的实际代码仍然存储在方法区)。当实例被销毁时,非静态方法本身并不直接销毁,但其对应的实例方法调用上下文会消失
7.成员变量
分为:
8.private
实例:
public class Teacher {private int id;private String name;private int age;public void changeid(int a ){if (a<0||a>100){System.out.println("Nope!");}else {id=a;System.out.println(age);}}public void changename(String name1){if (name1.length()>3||name1.length()==0){System.out.println("Nope!");}else {name=name1;System.out.println(name);}}public void changeage(int age1){if (age1<0||age1>130){System.out.println("Nope!");}else {age=age1;System.out.println(age);}} }
import java.util.Scanner;public class text {static Scanner sc =new Scanner(System.in);public static void main(String[] args) {Teacher teacher = new Teacher();System.out.println("ID");int a=sc.nextInt();teacher.changeid(a);System.out.println("NAME");String name1= sc.next();teacher.changename(name1);System.out.println("AGE");int age1 = sc.nextInt();teacher.changeage(age1);} }
9.this
在Java中,this
关键字是一个非常重要的概念,它主要用于指代当前对象。this
关键字在Java中有多种用途,但主要可以归结为以下几个方面:
-
引用当前对象的属性和方法:
当你需要在类的方法内部引用当前对象的成员(字段或方法)时,可以使用this
关键字。这在方法中的局部变量与类的成员变量同名时特别有用,因为this
可以明确指明你是在引用类的成员变量。 -
在构造器中调用另一个构造器:
在Java中,你可以在一个构造器中使用this()
语法来调用同一个类的另一个构造器。注意,这种调用必须是构造器中的第一条语句。 -
返回当前对象的引用:
在某些情况下,this
可以用于返回当前对象的引用。这在实现链式调用(如StringBuilder
类中的方法)时非常有用。 -
区分隐藏的成员:
当子类从父类继承了一个成员(字段或方法),并且子类定义了同名的成员时,子类成员会隐藏父类的成员。此时,在子类中可以通过this
关键字引用子类成员,通过super
关键字引用父类成员。
public class Teacher {private int id;private String name;private int age;public Teacher() {}public Teacher(int id, String name, int age) {this.id = id;this.name = name;this.age = age;}public void setIid(int id ){if (id<0||id>100){System.out.println("Nope!");}else {this.id=id;}}public void setName(String name){if (name.length()>3||name.length()==0){System.out.println("Nope!");}else {this.name=name;}}public void setAge(int age){if (age<0||age>130){System.out.println("Nope!");}else {this.age=age;}}public int getId() {return id;}public String getName() {return name;}public int getAge() {return age;}public String toString() {return "Teacher{id = " + id + ", name = " + name + ", age = " + age + "}";} }
import java.util.Scanner;public class text {static Scanner sc =new Scanner(System.in);public static void main(String[] args) {Teacher teacher = new Teacher();System.out.println("ID");int id=sc.nextInt();teacher.setIid(id);System.out.println(teacher.getId());System.out.println("NAME");String name= sc.next();teacher.setName(name);System.out.println(teacher.getName());System.out.println("AGE");int age = sc.nextInt();teacher.setAge(age);System.out.println(teacher.getAge());} }
10.构造方法
在Java中,构造方法(Constructor)是一种特殊类型的方法,用于在创建对象时初始化对象。它不具有返回类型,连void
都不写。构造方法的名称必须与类名完全相同,并且可以通过不同的参数列表来重载构造方法,就像重载普通方法一样。
以下是构造方法的一些关键特点:
- 名称与类名相同:构造方法的名称必须与类名完全匹配。
- 没有返回类型:连
void
都不写。 - 主要作用是初始化:在创建对象时自动调用,用于初始化对象的成员变量。
- 可以被重载:一个类可以有多个构造方法,只要它们的参数列表不同即可。
- 默认构造方法:如果类中没有显式定义任何构造方法,则编译器会自动提供一个无参的默认构造方法。但是,一旦定义了至少一个构造方法,编译器就不会再提供默认构造方法了。
11.标准类
12.无参数构造方法应用场景
小练习:
package NumberSystem; import java.util.Scanner; public class NMM {String name;int count;double price;public NMM() {}NMM [] shopList =new NMM[100];Scanner sc = new Scanner(System.in);public void Caidan (){for (;;) {System.out.println("------欢迎使用数据库管理系统------");System.out.println("1:Check Data");System.out.println("2:Change Date");System.out.println("3:Add Date");System.out.println("4:Del Date");System.out.println("5:Display All");System.out.println("6:Quit");System.out.println("输入编号:");int num = sc.nextInt();int temp = 0;if (num==1){System.out.println("正在使用数据查询功能,请输入name:");String name =sc.next();getMessage(name);}//1.查询功能if (num==2){System.out.println("正在使用数据修改功能,请输入name:");String name =sc.next();update(name);}//修改数据功能if (num==3){System.out.println("正在使用数据录入功能,请输入name:");String name =sc.next();System.out.println("正在使用数据录入功能,请输入count:");int count =sc.nextInt();System.out.println("正在使用数据录入功能,请输入price:");double price = sc.nextDouble();add(name,count,price);}//添加数据功能if (num == 4) {System.out.println("正在使用数据删除功能,请输入name:");String name =sc.next();del(name);} //删除数据功能if (num==5){for (int i = 0; i < shopList.length; i++) {if (shopList[i] != null) { // 首先检查 shopList[i] 是否为 nullif (shopList[i].getName() != null) {String na = shopList[i].getName();int con = shopList[i].getCount();double pri = shopList[i].getPrice();String str = toString(na, con, pri); // 假设 toString 是一个有效的方法System.out.println(str);} else {// 这里处理 getName() 返回 null 的情况System.out.println("位置 " + i + " 的商品名称为 null");break;}} else {// 这里处理 shopList[i] 为 null 的情况System.out.println("位置 " + i + " 的整个商品对象为 null");break;}}}if (num==6){break;}//跳出循环}}private void del(String name) {for (int i = 0; i< shopList.length; i++) {if(shopList[i].getName().equals(name)){shopList[i].setName(null);shopList[i].setCount(0);shopList[i].setPrice(0.0);System.out.println("删除成功!");break;}}}//删除数据private void update(String name) {for (int i = 0; i< shopList.length; i++) {if(shopList[i].getName().equals(name)){System.out.println("正在使用数据修改功能,请输入修改后的name:");String na =sc.next();System.out.println("正在使用数据修改功能,请输入修改后的count:");int con =sc.nextInt();System.out.println("正在使用数据修改功能,请输入修改后的price:");double pri = sc.nextDouble();shopList[i].setName(na);shopList[i].setCount(con);shopList[i].setPrice(pri);String str= toString(na,con,pri);System.out.println(str);break;}}}//更新数据模块private void getMessage(String name) {for (int i = 0; i< shopList.length; i++) {if(shopList[i].getName().equals(name)){String na= shopList[i].getName();int con =shopList[i].getCount();double pri= shopList[i].getPrice();String str= toString(na,con,pri);System.out.println(str);break;}} }//查询模块private void add(String name,int count,double price) {for (int i = 0; i< shopList.length; i++) {if(shopList[i]==null){shopList[i]=new NMM();//初始化!!!!!!!!!!!shopList[i].setName(name);shopList[i].setCount(count);shopList[i].setPrice(price);String str= toString(shopList[i].getName(),shopList[i].getCount(),shopList[i].getPrice());System.out.println(str);break;}System.out.println(shopList[i]);}}//添加模块public String toString(String name,int count ,double price) {return "添加后数据:{name = " + name + ", count = " + count + ", price = " + price + "}";}public NMM(String name, int count, double price) {this.name = name;this.count = count;this.price = price;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getCount() {return count;}public void setCount(int count) {this.count = count;}public double getPrice() {return price;}public void setPrice(double price) {this.price = price;}}