面向对象中的构造方法以及关键字static的理解

构造方法

首先什么是构造方法?
构造方法就是写在类中的一个方法,来对成员变量进行初始化的一个方法,并且在创建对象的时候,系统会自己调用的一个方法
构造方法的书写格式: 系统关键字 方法名( 参数类型 参数名…){ 语句体 };
注意⚠️:在写构造方法的时候要注意:首先构造方法是没有返回值的,也不用写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方法是动态的,在同一类中静态方法中是不允许出现同类中的动态方法的.
下面总结一下静态变量和静态方法的一些主要特点
静态变量:依托于类,可以直接由类名来调用,并且存储在方法区中的静态区.
静态方法:依托于类,可以用类名直接调用,也是存储在方法区的静态区中的,并且静态方法中只能使用静态变量,且只能

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值