C#和Java中的构造器constructor是啥?起啥作用?为啥不可以被override??
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#和Java中的构造器constructor是啥?起啥作用?为啥不可以被override??相关的知识,希望对你有一定的参考价值。
constructor,说简单点就是“构造方法”。构造方法的作用就是“为对象的初始化赋值”。在Java或C#中如果不声明构造方法的话,则系统会自动提供一个不带任何参数的构造方法。举例来说:Student stu1= new Student();其中的Student()就叫做构造方法,是不带参数的构造方法。在比如:Student stu2 = new Student("张三",18);这个Student("张三",18)就是构造方法,是带参数的构造方法。构造方法怎么声明:举个例子:无参数:public Student() 有参数public Student(String name,int age) this.name=name; this.age=age;至于构造方法为什么不能override?override是方法“重写”,而构造方法不能重写,只能“重载”。若还有疑问,可以继续追问。 参考技术A constructor是构造函数:在对象创建或者实例化时候被调用的方法。通常使用该方法来初始化数据成员和所需资源。 override可以翻译为覆盖,从字面就可以知道,它是覆盖了一个方法并且对其重写,以求达到不同的作用。对我们来说最熟悉的覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,我们在继承中也可能会在子类覆盖父类中的方法。在覆盖要注意以下的几点:1、覆盖的方法的标志必须要和被覆盖的方法的标志完全匹配,才能达到覆盖的效果;
2、覆盖的方法的返回值必须和被覆盖的方法的返回一致;
3、覆盖的方法所抛出的异常必须和被覆盖方法的所抛出的异常一致,或者是其子类;
4、被覆盖的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行覆盖。
Java构造器(构造方法/constructor)
我们先来看一下什么是构造器:
1、构造器也叫构造方法或构造函数,分为有参构造器和无参构造器;
2、构造器也是一种方法,只不过是一种特殊的方法,它会在对象创建的时候被调用;
3、构造器最大的作用就是在创建对象的时候进行对象的初始化,有参构造器可以实现对象传参(后面会比较着来看有参构造器方便在哪儿了);
4、一个类可以有零个(如果没有自己定义编译器会帮你提供无参构造器)或多个构造器(【重载】不知道重载定义的小伙伴可以先记下概念);
5、构造器不能被子类继承,Java中子类会自动调用父类的构造器(同样,不了解的可以先记下概念或者跳过)
前面既然说了构造器是一种特殊的方法,我们就来看一下构造方法和普通方法的区别:
1、命名:构造器的方法名必须和类名相同,一般方法的方法名在命名规范的情况下可以随便定义。
2、修饰符:构造器不能被static、final、synchronized、abstract和native修饰
3、返回值:构造器没有返回值(但是不需要写void),一般方法要有返回值或者无返回值(void)
来看一下无参构造器的代码,同时看一下无参构造器的情况下(不定义构造器同理)是如何给属性赋值的:
1 package test; 2 3 public class Student01 { 4 //定义属性 5 public String name; 6 public int age; 7 public String sex; 8 9 /** 10 * 无参的构造方法: 11 * 如果不写编译器会自动加上;只要定义了构造器,不管是有参还是无参,编译器都不会再帮你定义 12 */ 13 public Student01() {//new对象的时候会调用这个无参构造方法,它会给new出来的对象一个初始化值(了解即可:数字为 0,字符为 null,布尔为 false,所有引用都是 null) 14 System.out.println("创建对象的过程中调用我了,在s1.name = ‘张三’;前执行,所以我在main方法的打印语句前打印"); 15 } 16 17 public static void main(String[] args) { 18 Student01 s1 = new Student01();//执行这一步的时候会自动调用Student01() 19 //通过 对象.属性来给属性赋值 20 s1.name = "张三"; 21 s1.age = 18; 22 s1.sex = "男"; 23 System.out.println("姓名:"+s1.name+" 性别:"+s1.sex+" 年龄:"+s1.age); 24 } 25 26 }
结果:
创建对象的过程中调用我了,在s1.name = ‘张三’;前执行,所以我在main方法的打印语句前打印
姓名:张三
性别:男
年龄:18
再来看有参构造器(给属性赋值不用再一个一个通过对象.属性)
1 package test;
2
3 public class Student02 {
4 // 定义属性
5 public String name;
6 public int age;
7 public String sex;
8
9 //定义有参构造方法
10 public Student02(String name, int age, String sex) { //类似于普通带参方法 public void add(int a,int b){}
11 this.name = name; //将形参变量的值,赋给成员变量。 this指当前对象,这里不会的小伙伴不用慌它们的意思是:
12 this.age = age; //拿name来举例this.name = name;就是将下面传过来的name值(张翠花)赋值给上面定义属性的(public String name;)name
13 this.sex = sex;
14 }
15
16 public static void main(String[] args) {
17 Student02 s2 = new Student02("张翠花", 18, "女");//调用构造器的时候传参(改变默认初始化),类似于调用普通带参方法 add(1,1);
18 System.out.println("姓名:"+s2.name+"
性别:"+s2.sex+"
年龄:"+s2.age);
19 }
20
21 }
构造器不只可以定义一个,可以是零个(以前创建对象没写构造器的时候)或多个
1 package test; 2 3 public class Student02 { 4 // 定义属性 5 public String name; 6 public int age; 7 public String sex; 8 9 //定义有参构造方法 10 public Student02(String name, int age, String sex) { //类似于普通带参方法 public void add(int a,int b){} 11 this.name = name; 12 this.age = age; 13 this.sex = sex; 14 } 15 16 //定义无参构造方法 17 public Student02() { 18 19 } 20 21 //定义一个两个参数的构造方法(重载)不能和刚才的一样 注意:名字依然要和类名保持一致 22 public Student02(String name, String sex){ 23 this.name = name; 24 this.sex = sex; 25 } 26 27 public static void main(String[] args) { 28 Student02 s2 = new Student02("张翠花", 18, "女");//调用构造器的时候传参,类似于调用普通带参方法 add(1,1); 29 System.out.println("姓名:"+s2.name+" 性别:"+s2.sex+" 年龄:"+s2.age); 30 31 System.out.println("---------------------"); 32 33 //创建一个新的对象 34 Student02 s3 = new Student02("石榴姐", "女");//这里可以用前面三个构造器的任意一个 35 System.out.println("姓名:"+s3.name+" 性别:"+s3.sex+" 年龄:"+s3.age); 36 //因为这里用的是没有给年龄传值的构造器,所以打印的年龄是初始值0 37 } 38 39 }
结果:
姓名:张翠花
性别:女
年龄:18
---------------------
姓名:石榴姐
性别:女
年龄:0
以上是关于C#和Java中的构造器constructor是啥?起啥作用?为啥不可以被override??的主要内容,如果未能解决你的问题,请参考以下文章
c# 中的类和构造函数在不同程序集中的 c# 中的默认访问说明符是啥 [重复]