Java从入门到精通08
文章目录
一、关键字static
static是一个特殊的关键字,用于修饰方法、成员变量等。使用static修饰的成员表名它属于这个类本身,不属于该类的单个实例。所以用static修饰的方法和变量又称为静态方法、静态变量或者说是类方法、类变量,而不用static修饰的方法、变量我们通常称他们位实例方法、实例变量。
静态成员不能够直接访问非静态成员,因为静态成员随类的产生而产生,而非静态成员需要类的实例化即用类定义对象这样才能产生,所以出错原因很可能是静态成员存在,但是非静态成员还未存在,类还未实例化!!!
二、成员变量
1、什么是成员变量?
类中定义的变量,一般分为实例变量、静态变量(类变量)两大类
1、实例变量
没有static修饰的变量即实例变量,从该类的实例被创建起开始存在,知道系统完全销毁这个实例才消失。实例变量的作用域与对应实例的生存范围相同。
位置:类中方法外
和以前变量一样,只不过不用赋初始值
2、静态变量(类变量)
有static修饰的变量即静态变量(类变量),从类的准备阶段开始存在,知道系统完全销毁这个类。静态变量(类变量)的作用域与这个类的生存范围相同。
位置:类中方法外
和以前变量一样,只不过不用赋初始值
public class Demo1 {
public static void main(String[] args) {
Student.id=1;
System.out.println(Student.id);
Student student1 = new Student();
Student student2 = new Student();
student1.age=222;
student1.id=222;
System.out.println(student1.id);
System.out.println(student2.id);
}
}
public class Student {
static int id;
static String name;
int age;
}
解析:
- Java虚拟机jvm在代码区分配空间给Demo1.class
- Demo1里面main方法的调用在栈区划分一个区域给main方法
- 因为执行Student.id,所以jvm在代码区分配空间给Student
- Student里面划分区域给静态变量(类变量)id name
- 给Student类里面的类变量id赋值1,并且输出Student类里面的类变量id
- 在创建Student1和Student2两个对象,且在堆区开辟两个空间存放Student1和Student2,其地址值存放在栈区的Student1和Student2中。
- 给堆区的student1里面的age赋值222,并将Student类里面的类变量id赋值222
- 输出student1.id即Student类里面的类变量id即222
- 输出student2.id即Student类里面的类变量id即222
三、方法
Java中方法不能独立存在,它必须属于一个类或者对象,所以方法都必须使用----类.方法或者----对象.方法的形式来调用。
方法大白话说就是将一个功能抽取出来,吧代码单独定义在一个大括号内,形成一个单独的功能。
1、静态方法
有static修饰的方法属于类本省,既可以用类来调用,也可以使用该类实例化的对象来调用,使用不同的对象调用同一个静态方法时,产生的结果都相同,因为底层方法并没有改变。
位置:类中
格式:
public static 返回值类型 方法名称([参数类型 变量,参数类型 变量,…])
{方法体;
return[返回值];
}
2、实例方法
没有static修饰的方法属于该类的对象,不属于这个类的本身,所以只能使用该类实例化的对象来调用,使用不同的对象调用同一个方法时,可能产生不同的结果。
位置:类中
格式:
public方法返回值类型 方法名称([参数类型 变量,参数类型 变量,…])
{方法体;
return[返回值];
}
3、返回值
返回值(可有可无):返回值类型可以是基本类型和引用类型,若有返回值,则必须有一条有效的return语句,要没有返回值,则必须使用void定义声明一下
4、定义方法四种方式(以静态方法为例)
- 无参数,无返回值
public class Demo2 {
public static void main(String[] args) {
a();
}
public static void a(){
System.out.println("a");
}
}
- 有参数,无返回值
import java.util.Scanner;
public class Demo3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入一个数字");
int a=sc.nextInt();
System.out.print("请输入另一个数字");
int b=sc.nextInt();
a(a,b);
}
public static void a(int a,int b){
System.out.println(a+b);
}
}
- 无参数,有返回值
import java.util.Scanner;
public class Demo3 {
public static void main(String[] args) {
int c=a();
System.out.println(c);
}
public static int a(){
Scanner sc = new Scanner(System.in);
System.out.print("请输入一个数字");
int a=sc.nextInt();
System.out.print("请输入另一个数字");
int b=sc.nextInt();
return a+b;
}
}
- 有参数,有返回值
import java.util.Scanner;
public class Demo3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入一个数字");
int a=sc.nextInt();
System.out.print("请输入另一个数字");
int b=sc.nextInt();
int c=a(a,b);
System.out.println(c);
}
public static int a(int a,int b){
return a+b;
}
}
总结:各有优缺点!!!