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

如题所述

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

  //就写这么多吧,不断的为什么,我都要疯了,有错误的和遗漏的希望指正
温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-03-31

构造函数是负责这个类对象的创建过程,也就是说它负责了创建这个阶段的生命周期,如果说你这个类在创建的时候需要满足什么样的业务规则,那么这些规则的定义就应该在构造函数中。

1、java抽象类

使用了关键词abstract声明的类叫作“抽象类”。如果一个类里包含了一个或多个抽象方法,类就必须指定成abstract(抽象)。“抽象方法”,属于一种不完整的方法,只含有一个声明,没有方法主体。

2、对比接口

    语法定义层

在abstract class方式中,Demo可以有自己的数据成员,也可以有非abstract的成员方法,而在interface方式的实现中,Demo只能够有静态的不能被修改的数据成员(也就是必须是static final的,不过在interface中一般不定义数据成员),所有的成员方法都是abstract的。

    编程层面

abstract class在Java语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。

    设计理念层面

abstract class在Java语言中体现了一种继承关系,要想使得继承关系合理,父类和派生类之间必须存在"is a"关系,即父类和派生类在概念本质上应该是相同的。 对于interface 来说则不然,并不要求interface的实现者和interface定义在概念本质上是一致的,仅仅是实现了interface定义的契约(功能)而已。

本回答被网友采纳
第2个回答  推荐于2018-04-18
java抽象类的构造方法和普通类的构造方法一样
都是用来初始化类
只是抽象类的构造方法不能直接调用 因为抽象类不能实现实例
但是一旦一个普通类继承了抽象类 便也可以在构造函数中调用其抽象类的构造函数
也可以使用其方法

可以这么理解吧 抽象类就是一个不能实例化的不同类
不过如果方法加了abstract那么就必须在子类里面重写了本回答被网友采纳
第3个回答  2011-01-10
抽象类也是类,构造方法和普通构造方法没什么区别。
:)
就好比人生一样,一个不完整的人生他也是人生呀,即使我和抽象类一样没法为社会做出贡献,干出一番轰轰烈烈的事业,但这并不妨碍我也有期待、梦想和自己的优点啊:)。况且,我的这些优点是可以遗传给儿子的,你敢保证那一代不出现伟人:)
第4个回答  2014-10-24
抽象类可以有构造方法,构造方法不可继承,但是可以供子类用super()或者super(参数,参数。。。。)调用。
相似回答