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

Python021

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)

   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编程一直以来都是互联网上使用比较广泛的一种编程语言,所以我们今天就一起来了解一下java编程中的抽象类是如何来实现的,希望通过对本文的阅读,大家能够对java编程技术有更深刻的认识,下面昆明电脑培训http://www.kmbdqn.cn/就开始今天的主要内容吧。

AbstractMap抽象类实现了一些简单且通用的方法,本身并不难。但在这个抽象类中有两个方法非常值得关注,keySet和values方法源码的实现可以说是教科书式的典范。

抽象类通常作为一种骨架实现,为各自子类实现公共的方法。上一篇我们讲解了Map接口,此篇对AbstractMap抽象类进行剖析研究。

Java中Map类型的数据结构有相当多,AbstractMap作为它们的骨架实现实现了Map接口部分方法,也就是说为它的子类各种Map提供了公共的方法,没有实现的方法各种Map可能有所不同。

抽象类不能通过new关键字直接创建抽象类的实例,但它可以有构造方法。AbstractMap提供了一个protected修饰的无参构造方法,意味着只有它的子类才能访问(当然它本身就是一个抽象类,其他类也不能直接对其实例化),也就是说只有它的子类才能调用这个无参的构造方法。

在Map接口中其内部定义了一个Entry接口,这个接口是Map映射的内部实现用于维护一个key-value键值对,key-value存储在这个Map.Entry中。AbstractMap对这个内部接口进行了实现,一共有两个:一个是可变的SimpleEntry和一个是不可变的SimpleImmutableEntry。

publicstaticclassSimpleEntryimplementsEntry,java.io.Serializable

实现了Map.Entry接口,并且实现了Serializable(可被序列化)。

它的方法比较简单都是取值存值的操作,对于key值的定义是一个final修饰意味着是一个不可变的引用。另外其setValue方法稍微特殊,存入value值返回的并不是存入的值,而是返回的以前的旧值。需要重点学习的是它重写的equals和hashCode方法。

publicstaticclassSimpleImmutableEntryimplementsEntry,java.io.SerializableSimpleImmutableEntry

定义为不可变的Entry,其实是事实不可变,因为它不提供setValue方法,在多个线程同时访问时自然不能通过setValue方法进行修改。它相比于SimpleEntry其key和value成员变量都被定义为了final类型。调用setValue方法将会抛出UnsupportedOperationException异常。

它的equals和hashCode方法和SimpleEntry一致。

接下来查看AbstractMap抽象类实现了哪些Map接口中的方法。

publicintsize()

Map中定义了一个entrySet方法,返回的是Map.Entry的Set集合,直接调用Set集合的size方法即是Map的大小。

publicbooleanisEmpty()

调用上面的size方法,等于0即为空。

publicbooleancontainsKey(Objectkey)

这个方法的实现较为简单,通过调用entrySet方法获取Set集合的迭代器遍历Map.Entry,与参数key比较。Map可以存储为null的key值,由于key=null在Map中存储比较特殊(不能计算hashCode值),所以在这里也做了判断参数key是否为空。