今天宠物迷的小编给各位宠物饲养爱好者分享java构造函数的作用的宠物知识,其中也会对java中的构造函数有什么用?用它有什么好处?在什么地方用?(java构造函数和方法的区别)进行专业的解释,如果能碰巧解决你现在面临的宠物相关问题,别忘了关注本站哦,现在我们开始吧!
构造函数是类的一个特殊方法,这个方法用来生成实例时由系统自动调用,程序员无法直接调用。构造函数方法名同类名相同且参数为空。子类继承父类后默认继承父类的构造函数,即:子类存在隐含方法:super(),如果子类重写构造函数则子类也隐含调用super()。
如下例:
例一:
package sample;
public class A{
A(){
System.out.println("主类构造函数调用");
}
public static void main(String args[]){
A g=new A();
subA s=new subA();
}
}
class subA extends A{
}
执行结果为:
主类构造函数调用
主类构造函数调用
本例中子类subA中没有任何方法,所以隐含调用super(),super()指向A()。
例二:
package sample;
public class A{
A(){
System.out.println("主类构造函数调用");
}
public static void main(String args[]){
A g=new A();
subA s=new subA();
}
}
class subA extends A{
public subA(){
}
}
执行结果为:
主类构造函数调用
主类构造函数调用
本例中子类subA只有一个空方法suba()中没有任何方法,所以也隐含调用super(),super()指向A()。
例三:
package sample;
public class A{
A(){
System.out.println("主类构造函数调用");
}
public static void main(String args[]){
A g=new A();
subA s=new subA();
}
}
class subA extends A{
public subA(){
System.out.println("子类构造函数调用");
}
}
执行结果为:
主类构造函数调用
主类构造函数调用
子类构造函数调用
本例中子类subA的方法subA()虽然后输出但同上例中相同都为构造函数,所以也隐含调用super(),super()指向A()。
什么是构造函数,问的好。
开始的时候我也不理解为什么要构造函数。因为那时候的设计思想还停留在面向过程编程。即我要干什么事,这件事有几个步骤,然后我决定怎么干。
面向对象不是这么直接简单,它的设计思想就是要代码重用。即我以前干过类似的事,那么我找出以前可以用到的代码,完成一部分。以前没有的我重新写。这样就有了类。
回到你提的问题。有了类,就是有了可以重用的代码,但是我怎么产生这个对象呢。必须要实例化这个类(当然这不是唯一产生对象的途径,比如单例模式,但本质上说所有途径都是一样的)。那么就要用到构造函数。即告诉程序我现在要实例化一个对象了,你给我马上分配内存。将内存的首地址赋给我指定的类对象。而且有时候你需要传递参数到函数里面,有了构造函数就方便了,构造函数可以有无数个。当然,传递参数到到对象里面也可以其它方法,比如直接赋一个值给成员变量,举例:
class point2{
int x,y;
point2(){
}
point2(int a,int b){//构造函数;含参的构造函数;构造方法必须要和类名一致
//且没有返回值
x=a;
y=b;
}
void output(){
System.out.println(x);
System.out.println(y);
}
public static void main(String args[]){
point2 pt=new point2();//实例化对象,这时候x,y没有赋值,默认初始值为0;
pt.output();
pt.x=3;pt.y=3;
pt.output();
}
}
什么是构造函数,问的好。
开始的时候我也不理解为什么要构造函数。因为那时候的设计思想还停留在面向过程编程。即我要干什么事,这件事有几个步骤,然后我决定怎么干。
面向对象不是这么直接简单,它的设计思想就是要代码重用。即我以前干过类似的事,那么我找出以前可以用到的代码,完成一部分。以前没有的我重新写。这样就有了类。
回到你提的问题。有了类,就是有了可以重用的代码,但是我怎么产生这个对象呢。必须要实例化这个类(当然这不是唯一产生对象的途径,比如单例模式,但本质上说所有途径都是一样的)。那么就要用到构造函数。即告诉程序我现在要实例化一个对象了,你给我马上分配内存。将内存的首地址赋给我指定的类对象。而且有时候你需要传递参数到函数里面,有了构造函数就方便了,构造函数可以有无数个。当然,传递参数到到对象里面也可以其它方法,比如直接赋一个值给成员变量,举例:
class point2{
int x,y;
point2(){
}
point2(int a,int b){//构造函数;含参的构造函数;构造方法必须要和类名一致
//且没有返回值
x=a;
y=b;
}
void output(){
System.out.println(x);
System.out.println(y);
}
public static void main(String args[]){
point2 pt=new point2();//实例化对象,这时候x,y没有赋值,默认初始值为0;
pt.output();
pt.x=3;pt.y=3;
pt.output();
}
}
1.构造函数的命名必须和类名完全相同;在java中普通函数可以和构造函数同名,但是必须带有返回值。
2.构造函数的功能主要用于在类的对象创建时定义初始化的状态。它没有返回值,也不能用void来修饰。这就保证了它不仅什么也不用自动返回,而且根本不能有任何选择。而其他方法都有返回值,即使是void返回值。尽管方法体本身不会自动返回什么,但仍然可以让它返回一些东西,而这些东西可能是不安全的。
3.构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用;而一般的方法是在程序执行到它的时候被调用的。
4.当定义一个类的时候,通常情况下都会显示该类的构造函数,并在函数中指定初始化的工作也可省略,不过Java编译器会提供一个默认的构造函数.此默认构造函数是不带参数的。而一般的方法不存在这一特点。
5.当一个类只定义了私有的构造函数,将无法通过new关键字来创建其对象,当一个类没有定义任何构造函数,C#编译器会为其自动生成一个默认的无参的构造函数。
构造函数是当你创建一个类对象时自动调用的,set和get一个是设置值另一个是获取值,它和构造函数是没有任何关系的!
public class Test {
public String str1;
public String str2;
public Test(){}//无参构造函数①
public Test(String str1,String str2){//有参构造函数②
this.str1=str1;
this.str2=str2;
}
}
以上代码说明:①,②都是构造函数,但是 ②就是①的重载,因为重载就是:在一个类中,方法名相同,参数列表不同(个数不同或类型不同)
函数的复制,我估计就是重写咯:子类继承父类重写父类的方法:方法名相同,返回类型相同,参数列表相同(个数不同或类型不同)
希望能帮到你!
返回值:比如,你给我了十块钱,叫我去给路边的一个要饭的流浪汉,然后我回来了,你要知道我到底给没有给。 这个例子里面:十块钱就是函数的参数,给路边流浪汉钱就是函数的过程,我给没有给就是函数的返回值。 构造函数:就是类刚创建时第一个需要执行的函数,且必定会执行那个函数、 不懂加我,我详细给你说
/*学好java基础,学深java基础,才能走的更远(为什么呢?百度有更好的解释),愿我们共同探讨学习,用通俗易懂的话语来了解java
1.抽象类也是类,只不过本身不能实例化,要通过子类实例化。
2.是类就有构造方法,如果我们没有给出构造方法,系统将自动提供一个无参构造方法,如果我们给出了构造方法,系统将不会提供。
那么问题来了,为什么非得有构造方法呢?
构造方法(函数)的作用:(1)用于创建对象,初始化参数;(2)接受子类传来的参数,初始化参数,子类堆内存的某块位置存放父类的初始化参数
那么问题又来了,问题1:抽象类有构造方法怎么不能创建对象?问题2:它与接口又有什么关系呢?
问题1:请看构造函数的作用,还要补充下,用抽象类就要写个继承它的子类,然后通过父类引用指向子类这也是多态的表现,Father f = new Son();引用地址f就可以调用抽象类中的一般方法;
那么问题又来了抽象类怎么访问子类的方法呢?好了,自己考虑去
对于抽象类和一般类,接口来个例子
话说我去兰州拉面馆吃面,拿着菜单
抽象类的说法:
我:老板来碗面
老板:你需要什么面?
我:就是面啊?---------->描述抽象,既然抽象类都这么抽象了,那它有什么作用呢?简单来 说,就是抽取某个类的共性功能,方便分类调用(编程就需要逻辑思维清晰,可读性强,就像书为什么要目录);举个例子,假如有哥们想吃面,想吃辣点的(面的共性辣),就快速选个方向去四川面馆,到了面馆就有查渣面,鸡丝凉面(具体类)选择...
老板:...
类的说法:
我:老板来碗面
老板:你需要什么面?
我:油泼面 ------------>描述具体
接口:从广义的角度讲对外提供规则的都是接口,来个例子
话说你家大门锁,你可以用匹配的钥匙打**,可我不一定非得要用你那型号的钥匙去开你家大门,我可以用铁丝就可以了,想想,实际生活中当真可以么,去问盗贼,他们"接口"倒是学的不赖
为什么用铁丝也可以开门呢?因为实现了锁孔内几个顶针同时顶上然后什么什么的方法,现在我们来看,我们可以用钥匙这个对象可以**,用铁丝这个对象**,他们共同的特点就是实现了
**的一些规则要求,也就是实现了**的要求的方法
需要说明的是:接口是没有构造方法的,它只是用来对外提供规则,其他类都可以实现这个接口,重写里面的方法
问题2:抽象类和接口的关系?
一般类继承抽象类,extends
一般类也可继承一般类 ----->类与类可以继承,单继承,儿子和父亲的关系(一个儿子不能来自两个父亲的基因,能吗?)
一般类和抽象类可以实现一个或多个接口,implements--->....干儿子和干爹的关系
那么问题来了:有没有人有个奇葩的问题,接口可不可以有父亲?干爹呢?
......收住,回到正题
3.子类中所有的构造方法默认都会访问父类中空参构造方法-->为什么呢?
因为子类会继承父类中的数据,可能还会使用父类的数据,
所以,子类初始化之前,一定要先完成父类数据的初始化。
4.那么问题来了,要是父类没有无参构造呢?
不会有人认为父类没构有造方法吧?。。。
系统会默认加的(前面有提到),这里是指父类手动写了有参构造,子类继承也要手动写出构造方法(请看下面例子)
5.继承的注意事项
(1):子类只能继承父类所有非私有的成员(成员方法和成员变量)--->皇帝老儿的妃子,你太子能继承享用,恩...只代表大众的想法,特殊的除外,不钻牛角尖
(2):子类不能继承父类的构造方法,但是可以通过super关键字去访问父类构造方法。
*/
/* 1.父类没有无参构造方法,子类怎么办?
super解决
this解决
2.注意事项
super(…)或者this(….)必须出现在构造方法的第一条语句上
*/
class test{
public static void main(String[] args) {
Son son = new Son("张三",23);
System.out.print(son.name+":"+son.age);
}
}
class Father {
String name="李四"; //姓名
int age=24; //年龄
/*public Father() { //空参构造
System.out.println("Father 空参构造");
}*/
public Father(String name,int age) { //有参构造
//super(); 系统默认的,你知道是继承谁的吗? 最高父类Object
this.name = name;
this.age = age;
}
public void setName(String name) { //设置姓名
//super(); 系统默认的,你知道是继承谁的吗?最高父类Object
this.name = name;
}
public String getName() { //获取姓名
return name;
}
public void setAge(int age) { //设置年龄
this.age = age;
}
public int getAge() { //获取年龄
return age;
}
}
class Son extends Father {
//String name = "张三";
//int age=23;
/*public Son() { //由于父类没有无参构造(子类不继承父类构造放法),但是可以通过加this(值)或super(值)去访问父类构造方法
//super(); 系统默认的,你知道是继承谁的吗?可惜上面 Father类没有无参构造
//this(name,age); //注意,这种写法错误,虽然name,和age为成员变量,但是,无参构造方法没有参数传进来,(说到底无参构造方法终究还是个方法而已)
this("张三",23); //这种方法可以,为什么?因为它会在本类中寻找有参构造,通过 super(name,age)将值传入父类(因为父类只有有参构造)
//留下个疑问?要是下面有参构造,形参少了参数,即public Son(String name){ super(name,age);}还起作用吗?试试
//super(name,age); //同上
super("李四",24); //同上,注意this(值)和super(值)不能同时在构造方法的第一条语句上,但系统默认super()除外
}
public Son(String name,int age) {
//super(name);
//super(); 系统默认的,你知道是继承谁的吗?可惜上面 Father类没有无参构造
super(name,age);
System.out.print(name+":"+age);
}
}
// 子类构造方法另外种写法对吗?
class test{
public static void main(String[] args) {
Son son = new Son("王五");
System.out.print(son.name+":"+son.age);
}
}
class Father {
String name; //姓名
int age; //年龄
/* public Father() { //空参构造
System.out.println("Father 空参构造");
}
*/
public Father(String name,int age) { //有参构造
//super(); 系统默认的,你知道是继承谁的吗? 最高父类Object
this.name = name;
this.age = age;
}
public void setName(String name) { //设置姓名
//super(); 系统默认的,你知道是继承谁的吗?最高父类Object
this.name = name;
}
public String getName() { //获取姓名
return name;
}
public void setAge(int age) { //设置年龄
this.age = age;
}
public int getAge() { //获取年龄
return age;
}
}
class Son extends Father {
//String name = "张三";
//int age=23;
/* public Son() { //由于父类没有无参构造(子类不继承父类构造放法),但是可以通过加this(值)或super(值)去访问父类构造方法
//super(); 系统默认的,你知道是继承谁的吗?可惜上面 Father类没有无参构造
//this(name,age); //注意,这种写法错误,虽然name,和age为成员变量,但是,无参构造方法没有参数传进来,(说到底无参构造方法终究还是个方法而已)
this("张三",23); //这种方法可以,为什么?因为它会在本类中寻找有参构造将值传入父类(因为父类只有有参构造)
//留下个疑问?要是下面有参构造,形参少了参数,即public Son(String name){ super(name,age);}还起作用吗?试试
//super(name,age); //同上
super("李四",24); //同上,注意this(值)和super(值)不能同时在构造方法的第一条语句上,但系统默认super()除外
}*/
public Son(String name) { //我们说子类不继承父类的构造方法,也可以这样写对吗?
//super(name);
//super(); 系统默认的,你知道是继承谁的吗?可惜上面 Father类没有无参构造
super(name,24);
System.out.print(name+":"+age);
}
}
//就写这么多吧,不断的为什么,我都要疯了,有错误的和遗漏的希望指正
除了静态类,一般我们使用一个java 类, 都要先构造一个此类的对象.构造方法就是用来构造这个对象的.比如 Object obj = new Object(); 这里就是Object的构造方法.至于更细致的知识, 建议去找一些教程去了解.
本文由宠物迷 百科常识栏目发布,非常欢迎各位朋友分享到个人朋友圈,但转载请说明文章出处“java中的构造函数有什么用?用它有什么好处?在什么地方用?”
下一篇
兔皮制作的加工方法?