java抽象类中的构造方法作用??如何理解?

java抽象类中的构造方法作用??如何理解?,第1张

  /学好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);

Systemoutprint(sonname+":"+sonage);

  }

  }

  class Father {

String name="李四"; //姓名

int age=24; //年龄

 /public Father() { //空参构造

  Systemoutprintln("Father 空参构造");

 }/

  public Father(String name,int age) { //有参构造

 //super(); 系统默认的,你知道是继承谁的吗 最高父类Object

thisname = name;

thisage = age;

 }

 public void setName(String name) { //设置姓名

 //super(); 系统默认的,你知道是继承谁的吗最高父类Object

 thisname = name;

 }

 public String getName() { //获取姓名

 return name;

 }

  public void setAge(int age) { //设置年龄

 thisage = 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);

 Systemoutprint(name+":"+age);

  }

 }

 // 子类构造方法另外种写法对吗

  class test{

 public static void main(String[] args) {

 Son son = new Son("王五");

 Systemoutprint(sonname+":"+sonage);

 }

  }

  class Father {

 String name; //姓名

 int age; //年龄

 / public Father() { //空参构造

 Systemoutprintln("Father 空参构造");

   }

  /

 public Father(String name,int age) { //有参构造

 //super(); 系统默认的,你知道是继承谁的吗 最高父类Object

 thisname = name;

 thisage = age;

 }

 public void setName(String name) { //设置姓名

 //super(); 系统默认的,你知道是继承谁的吗最高父类Object

 thisname = name;

 }

 public String getName() { //获取姓名

 return name;

 }

  public void setAge(int age) { //设置年龄

 thisage = 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);

  Systemoutprint(name+":"+age);

  }

 }

  //就写这么多吧,不断的为什么,我都要疯了,有错误的和遗漏的希望指正

创建对象的时候(一般都是new 一个对象,也有比如单例模式给一个方法,其实内部还是new),会调用构造方法,构造方法名和类名一致,默认的构造方式是无参数的方法,如public User(){}

再说下构造方法重载,重载的意思就是方法名相同,参数列表不同,如 public User(String id){ thisid = id;}

或者多个参数

public User(String id,String username){ thisid = id; thisusername=username;}

java 不支持复制构造方法,就是没有复制构造方法这一说

权限 +类名 :注意无返回类型。可以有参数。

比如 class A{

public A(){} //可以

public A(arg1,arg2,)//可以

private A(args);//括号里可有参数。注意这里的权限是private 所以这里不能在类外面用:new A()

}

Java类至少包含一个构造器,如果没有定义,那么系统会为这个类提供一个无参构造器。

构造函数是在创建给定类型的对象时执行的类方法,它通常用于初始化数据成员

如果该类中定义了一个私有的构造函数,那么这个类就不能被new

class Rectangle{

int width;

int height;

// A constructor

Rectangle(int width,int height) {

thiswidth = width;

thisheight = height; /////////////

}

}

什么是构造函数,问的好。

开始的时候我也不理解为什么要构造函数。因为那时候的设计思想还停留在面向过程编程。即我要干什么事,这件事有几个步骤,然后我决定怎么干。

面向对象不是这么直接简单,它的设计思想就是要代码重用。即我以前干过类似的事,那么我找出以前可以用到的代码,完成一部分。以前没有的我重新写。这样就有了类。

回到你提的问题。有了类,就是有了可以重用的代码,但是我怎么产生这个对象呢。必须要实例化这个类(当然这不是唯一产生对象的途径,比如单例模式,但本质上说所有途径都是一样的)。那么就要用到构造函数。即告诉程序我现在要实例化一个对象了,你给我马上分配内存。将内存的首地址赋给我指定的类对象。而且有时候你需要传递参数到函数里面,有了构造函数就方便了,构造函数可以有无数个。当然,传递参数到到对象里面也可以其它方法,比如直接赋一个值给成员变量,举例:

class point2{

int x,y;

point2(){

}

point2(int a,int b){//构造函数;含参的构造函数;构造方法必须要和类名一致

//且没有返回值

x=a;

y=b;

}

void output(){

Systemoutprintln(x);

Systemoutprintln(y);

}

public static void main(String args[]){

point2 pt=new point2();//实例化对象,这时候x,y没有赋值,默认初始值为0;

ptoutput();

ptx=3;pty=3;

ptoutput();

}

}

参数就是在这个方法中,需要用到这个方法外部的数据,通过参数的方式,传到该方法内

初始化用的程序代码,顾名思义,就是该类被调用的时候,此段代码会先执行,就是说,调用这个类的时候,会给它一个初始的状态或者值

public Animal(int 1)

{

legs = 1;

}

public Animal()

{

legs =4;

}

二者区别很明显,一个有参一个无参那么结果就是第一个方法legs的值是可以通过改变参数的值来改变而第二个方法legs的值是不受外部的控制,要修改的话,必须进入到这个方法中去修改

不要晕,也不要着急,慢慢来,知道什么地方不明白才是最重要的,语言很难学,那么多人学,开始可能感觉很简单,到后来就到瓶颈了,原因主要就是最基本的原理不是真的明白,一步一步来,下面是问题的解答:

首先构造方法就是构造函数,英文名字是constructor,接下来是作用,以下面的例子为例:

class Car

{

public Car(int size,String name) //这就是Car类的构造方法

{

thissize = size;

thisname = name;

}

String name;

int size;

}

public class Test

{

public static void main(String[] args)

{

Car car1 = new Car(5,"BMW"); //这是通过构造方法初始化 Systemoutprintln("size = "+car1size+"; name = "+car1name);

Car car2 = new Car(3,"QQ"); //这是通过构造方法初始化

Systemoutprintln("size = "+car2size+"; name = "+car2name);

}

}

在这个例子当中,开始定义Car类的时候,我们没有给Car这个类的属性name和size赋值,但是后面我们实例化Car类的实例的时候(car1,car2)我们想给实例化出来的实例赋值了,这时候就要通过构造方法来完成这个任务。

构造方法是类实例化是调用的方法,优先于所有方法(不包括静态代码块)。作用就是用来初始化实例的。希望帮到你,祝你成功:-D

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/12162877.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-21
下一篇2023-05-21

发表评论

登录后才能评论

评论列表(0条)

    保存