构造方法
首先什么是构造方法?
构造方法就是写在类中的一个方法,来对成员变量进行初始化的一个方法,并且在创建对象的时候,系统会自己调用的一个方法
构造方法的书写格式: 系统关键字 方法名( 参数类型 参数名…){ 语句体 };
注意⚠️:在写构造方法的时候要注意:首先构造方法是没有返回值的,也不用写void,并且构造方法的名字一定要和类的名字是一样的,并且构造函数是在初始化一个对象的时候,系统会自动调用
class Person
{
String name;
int age;
public Person()//构造方法,没有返回值类型也没有void,方法名要和类名一样
{
this.name = "张三";
this.age = 18;
}
}
上面写的是没有参数的构造方法,因此在初始化Person类的对象时,不用传入参数
Person person = new Person();//没有参数的构造方法的类初始化对象时
下面我们写一个由参数的构造方法
public Person(String name ,int age)
{
this.name = name;
this.age = age;
}
则当在初始化一个由参数的构造方法类的对象时
Person person = new Person("张三",18);
这里要注意几点:1,如果一个类中没写任何的构造方法,则系统在调用的时候会给你提供一个构造方法
2,如果你写了有参数的构造方法,则系统只会调用有参数的构造方法
所以建议在写有参数的构造方法的时候,尽量也把无参数的构造方法写一下,这样两者都可以使用了
静态变量
首先要知道什么是静态变量:静态变量就是类中存在于方法区中的静态区的变量,修饰的关键字是static
public Man
{
//创建了两个静态变量
static String name;
static int age;
public void sayHi()
{
System.out.println(name + age);
}
}
下面在main函数中定义两个Man类的对象,调用sayHi方法
class Demo{
public static void main(String[] args)
{
Man man1 = new Man();
man1.name = "李四";
man1.age = 18;
man1.sayHi;
Man man2 = new Man();
man2.sayHi;
}
}
输出的结果分别是:李四18 和李四18.
那么这里为什么man2这个对象我们并没有给予赋值,却也有值呢?
下面我们看一下,整个类在内存中的表现:
如下图所示:
程序运行的时候,首先是Demo类和Man类都被加载到方法区了,在方法区中有静态区和非静态区,因为Man类的俩变量是静态变量,存储在静态区,所以这时候静态变量name和age已经生成了,当程序走到main函数的时候,main函数开始入栈,然后开始初始化变量man1和变量man2,就在堆内存中相继产生了两片存储区域,分别是man1和man2在堆内存中的空间,在占内存的main函数中存储的其实man1和man2在堆内存中的内存地址,开始对man1赋值的时候,通过地址找到堆内存中的man1,其实就是对静态区中的name和age赋值.
所以当我们对man2做输出操作的时候,man2中的name和age其实就是静态区中的name和age,已经通过man赋值了,所以即使不对man2中的属性进行赋值操作,依然会输出和man1一样的结果.
由此可以看出静态变量的一个特点,就是共享性.
下面我们来介绍一下静态变量的一些特点
在上面的内存图中,可以看出,静态变量其实在对象还没有定义出来就已经产生在静态区了,所以静态变量其实并不依托对象,其实是依托于类的,所以当我们要调用静态变量的时候既可以用对象来调用,也可以用类名直接调用.
man1.name = 18;//有对象来调用
Man.name = 18;//用类名直接调用
所以,成员变量和静态变量的区别有哪些呢?
1.依托的对象不同:成员变量依托于对象,是随着对象的创建而生成的,静态变量依托于类,随着类的加载而生成的
2.在内存中存储的区域不同:成员变量存储在堆内存中,静态变量是存储在方法区的静态区中
3.生命周期不同:成员变量时随着对象的创建而产生一直到对象被系统回收;静态变量是开始于类的加载
4.调用的方法不同:成员变量只能有对象来调用,而静态变量一般都是用类来调用的,是不需要知道对象的
静态方法
首先什么是静态方法?
静态方法和静态变量有很多的类似之处,静态方法前面修饰的关键字是static,静态方法是随着类的加载就产生了.
class Car
{
String name;
static int price;
public void sayHi()
{
System.out.println(name);
System.out.println(price);
}
static public void sayHi1()
{
System.out.println(name);//这一行会报错
System.out.println(price);
}
}
运行程序,会发现系统报错,为什么?
是因为,当系统中有静态变量的时候,系统的动态方法里面,是可以使用动态变量和静态变量的,但是静态方法中是只能使用静态变量的,所以当静态方法sayHi1中调用动态变量name时会报错.
另外还要注意的是在同一个类中,静态方法里面是不允许有动态方法的.
例如:
class Demo
{
public static void main(String[] args)
{
sayHi();//这一行会报错
}
public void sayHi()
{
System.out.println("HelloWorld");
}
}
则如上图,会报错就是因为main方法是静态方法,sayHi方法是动态的,在同一类中静态方法中是不允许出现同类中的动态方法的.
下面总结一下静态变量和静态方法的一些主要特点
静态变量:依托于类,可以直接由类名来调用,并且存储在方法区中的静态区.
静态方法:依托于类,可以用类名直接调用,也是存储在方法区的静态区中的,并且静态方法中只能使用静态变量,且只能