构造方法

类和对象的区别?

我们可以把类理解成对于一个物品的设计图纸,对象就是那个具体的物品.也即类的实例化.比如下面的这个类

1
2
3
4
5
6
7
8
public class Person {
    public int age;
    public String name;
 
    public void sleep(){
        System.out.println("睡觉");
    }
}

这个person类中声明了它所包含的属性和方法,也就是人所具有的特征和行为方式.但这时候我们是不能够直接使用它的,需要对他进行实例化把它变成一个对象之后才能调用它的属性和方法.那么如何才能把类变成对象呢?只需要new 一下就能获得一个对象了.

1
2
3
4
5
6
public static void main(String[] args){
    Person person = new Person();
    person.name="张三";
    person.age=10;
    person.sleep();
}  

在类向对象的转变过程中用到了什么方法呢?答案是构造函数.如何证明类的实例化过程中是构造函数在起作用?我们可以在构造函数的方法体中加上一句输出语句,如果对象的实例化是用到构造方法的话,那么这句输出语句就会被打印在控制台上.或者把构造方法的访问修饰符改为private,接着再看看new 对象的时候还能不能成功.实验过后会发现new对象本质上就是在调用构造方法.

1
2
3
4
5
6
7
8
9
10
11
public class Person {
    public int age;
    public String name;
 
    //类的实例化过程中调用的是构造函数,就算不写也会默认生成空的构造函数
    public Person(){System.out.println("输出一句话")}
 
    public void sleep(){
        System.out.println("睡觉");
    }
}  

构造函数的方法名与类名相同,没有返回值,构造函数的作用就是对类进行初始化.所有的类都有构造函数,就算你不写,系统也会默认生成无参构造函数,如果你有自定义构造函数,那么默认的无参构造方法就会被覆盖失效.

1
2
3
4
5
6
public static void main(String[] args){
    //由于默认的无参构造函数被自定义函数覆盖,对象的实例化不能成功,会出现编译时异常
    Person person = new Person();
    //此时对象的实例化调用的是自定义的有参构造函数,对象创建成功
    Person p1 = new Person(20, "张三");
}

  

为了避免这种情况的发生,我们需要在自定义构造方法后再补写一个无参构造方法.此时就会构成方法的重载(同名不同参,对返回值没有要求),但除了构造方法的重载以外,普通方法也能够进行重载,使用重载的好处就是我们可以在不改变原方法的基础上新增功能.此时main方法里的两种实例化方式都会成功.另外需要无参构造函数的另一个原因是与继承相关.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Person {
    public int age;
    public String name;
 
    //多参构造
    public Person(int age,String name){
        this.age=age;
        this.name=name;
    }
    //无参构造
    public Person(){}
 
    public void sleep(){
        System.out.println("睡觉");
    }
}  

在子类继承父类时,会自动继承父类的默认构造函数,如果父类当中只有自定义的有参构造而没有显示默认构造的话那么子类在继承父类后会报错(没有默认构造方法可用).此时有两种解决方式,一种是让子类也采用有参构造方法(其中调用父类的有参构造方法),实例化对象也就通过只能有参构造去new了,通过无参构造去实例化子类对象是行不通的,编译器会报错.还有一种就是在父类当中显示无参构造方法,此时不管是通过无参构造还是有参构造都能够完成类的实例化.这种方式要更推荐一些. 

1
2
3
4
5
6
7
public class Jinsang extends Person{
    //子类的有参构造方法
    public Jinsang(int age, String name) {
        //调用的是父类的有参构造
        super(age, name);
    }
}
1
2
3
4
5
6
public static void main(String[] args){
    //通过无参构造来实例化对象行不通,会报错
    Jinsang jinsang1 = new Jinsang();
    //可以有参构造来实例化对象
    Jinsang jinsang = new Jinsang(20, "zhangsan");
}

  

  

posted @   何大2333  阅读(117)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
点击右上角即可分享
微信分享提示