深入探讨6.5版本的抽象类原理与应用

更新:11-07 民间故事 我要投稿 纠错 投诉

今天给各位分享深入探讨6.5版本的抽象类原理与应用的知识,其中也会对进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

如何使Shape 类包含calPerimeter() 方法而不提供其方法实现?这个要求可以通过使用抽象方法来满足:抽象方法是只有方法签名而没有方法实现的方法。

6.5.1 抽象方法和抽象类

抽象方法和抽象类必须使用abstract修饰符定义。新创建的类只能定义为抽象类。抽象类不需要抽象方法。

抽象方法和抽象类的规则如下。

1、抽象类必须用abstract修饰符修饰,抽象方法也必须用abstract修饰符修饰。抽象方法不能有方法体。

2、抽象类不能实例化,不能使用new关键字调用抽象类的构造函数来创建抽象类的实例。即使抽象类不包含抽象方法,这个抽象类也不能创建实例。

3、抽象类可以包含五个组成部分:成员变量、方法(普通方法和抽象方法都可以)、构造函数、初始化块、内部类(接口、枚举)。抽象类的构造函数不能用于创建实例,主要用于被其子类调用。

4. 包含抽象方法的类(包括定义了抽象方法的亲信;或者集成了抽象父类,但没有完全实现父类中包含的抽象方法;或者实现了接口,但没有完全实现接口)三种情况下的方法)只能定义为抽象类。

注:综上所述,抽象类可以用四个字来形容:“得失”。 “增益”意味着抽象类多了一项能力:抽象类可以包含抽象方法; “失去”意味着抽象类失去了一项能力:抽象类不能用来创建实例。

定义抽象方法只需在普通方法上加上abstract修饰符,去掉普通方法的所有方法体(即方法后面用大括号括起来的部分),并在方法后面加上分号。

注意:抽象方法和空方法体不是同一个概念。例如,public Abstract void test();是抽象方法,它根本没有方法体,即方法定义后面没有一对大括号;单个public void test(){} 方法是一个普通方法,它定义了一个方法体,但是方法体是空的,即它的方法体什么都不做,所以这个方法不能用abstract修饰。

定义抽象类只需在普通类上添加abstract修饰符即可。即使是普通的类(不包含抽象方法的类),加上abstract修饰符后也会变成抽象类;

这是一个形状抽象类:

公共抽象类形状{

{系统.out。 println("执行Shape的初始化块.")};

私有字符串颜色;

//定义一个计算周长的抽象方法

公共抽象双calPerimeter();

//定义一个返回形状的抽象方法

公共抽象字符串getType();

//定义Shape构造函数。此构造函数不用于创建Shape 对象。其次,它是用来被子类调用的。

公共形状(){}

公共形状(字符串颜色){

System.out.println("执行Shape的构造函数.");

this.颜色=颜色;

}

}

上面的Shape类包含了两个抽象方法:calPerimeter和getType,所以这个Shape类只能定义为抽象类。 Shape 类包含初始化块和构造函数。这些在创建Shape 对象时不会被调用,但会在创建其子类的实例时被调用。

抽象类不能用来创建实例,只能作为父类被其他子类继承。

下面是一个三角形类。三角形替代品被定义为普通类,因此必须实现Shape 类中的所有抽象方法。

公共类三角形扩展形状{

//定义三角形的三边

私人双a;

私人双b;

私人双c;

公共三角形(字符串颜色,双a,双b,双c){

超级(颜色);

this.setSides(a,b,c);

}

公共无效setSides(双a,双b,双c){

if(a=b + c || b=a+c || c=b+c){

System,out.println("三角形的两条边之和必须大于第三条边");

}

这个.a=a;

这个.b=b;

这个.c=c;

}

//重写Shape类计算周长的抽象方法

公共双calPertimeter(){

返回a+b+c;

}

//重写Shape类的抽象方法返回形状

公共StringgetType(){

返回“三角形”;

}

}

上面的Triangle类集成了Shape抽象类,并在Shape类中实现了两个抽象方法。它是一个普通类,因此可以创建Triangle类的实例,Shape类型的引用变量只能引用Triangle对象。

接下来,定义一个Circle普通类。 Circle 类也是Shape 类的子类。

公共类圆扩展形状{

私有双半径;

公共圆(字符串颜色,双半径){

超级(颜色);

this.radius=半径;

}

公共无效setRadius(双半径){

this.radius=半径;

}

//重写Shape类计算周长的抽象方法

公共双CalPerimeter(){

返回2 * Math.PI * 半径;

}

//重写Shape类的抽象方法返回形状

公共字符串getType(){

返回“圆”;

}

公共静态无效主(字符串[] args){

形状s1=new 三角形("黑色",3,4,5);

形状s2=new Circle("黄色",3);

System.out.println(s1.getType());

System.out.println(s1.calPerimeter());

System.out.println(s2.getType());

System.out.println(s2.calPerimeter());

}

}

上面的main()方法中定义了两个shap类型的引用变量,分别是Triangle对象和Circle对象。由于calPerimeter()方法和getType()方法是在Shape类中定义的,因此程序可以直接调用s1变量和s2变量的calPerimeter()和getType()方法,不需要强制类型转换为其子类类型。

利用抽象类和抽象方法,我们可以更好地利用多态性,使程序更加灵活。

使用abstract修饰类时,只能集成表名类;当使用abstract修饰方法时,表名方法必须由子类实现(即重写)。被final修饰的类不能被集成,被final修饰的方法不能被重写。因此final和abstract永远不能同时使用。

注意:abstract不能用来修改成员变量或局部变量。既没有抽象变量,也没有抽象成员变量。 Abstract 不能用于修改构造函数。抽象类中没有定义抽象构造函数或构造函数。只能是普通的构造函数。

另外,当使用static修饰方法时,表明该方法属于类本身,即可以通过类来调用该方法。如果该方法已被定义为抽象方法,则会导致该方法通过类被调用。调用方法时出错(调用没有方法体的方法肯定会出错)。因此,static和abstract不能同时修改一个方法,即不存在所谓的类抽象方法。

注意:静态和抽象并不绝对相互排斥。虽然static和abstract不能同时修改一个方法,但是它们可以同时修改内部类。

注意:关键字修饰的方法必须被其子类重写才有意义,否则这个方法永远不会有方法体,所以抽象方法不能定义为私有访问,即私有和抽象都不能修改该方法同时。

6.5.2 抽象类的作用

从前面的示例程序可以看出,抽象类不能创建实例,只能作为父类集成。从语义上看,抽象类是从多个具体类抽象出来的父类,它具有更高层次的层次结构。抽象类是由多个具有相同特性的类抽象出来的,并用这个抽象类作为其子类的模板,从而避免了子类设计的随意性。

抽象类代表模板模式的设计。抽象类充当多个子类的公共模板。子类在抽象类的基础上进行扩展和改造,但子类一般会保留抽象类的行为。

如果编写一个抽象父类,则父类为多个子类提供公共方法,并留下一个或多个方法供其子类实现。这是一个模板模式。模板模式也是最常见、最简单的设计模式之一。一。比如前面介绍的Shape、Circle、Triangle这三个矿就已经使用了模板模式。接下来我们就来介绍一下模板模式的返利。在本次返利的抽象父类中,父类的普通方法依赖于一个抽象方法,而抽象方法则推迟给子类提供实现。

SpeedMeter类提供了速度计的通用算法,一些具体的实现细节则推迟到其子类CarSpeedMeter类中。这也是一个典型的模板模式。

模板模式常用于面向对象的软件中。它的原理很简单,实现也很简单。以下是使用钢模板图案的一些简单规则:

用户评论

|赤;焰﹏゛

终于明白了什么是抽象类了!

    有13位网友表示赞同!

古巷青灯

以前一直对抽象的概念感到模糊,这个讲解很清晰。

    有5位网友表示赞同!

冷风谷离殇

学习编程的时候总是会遇到抽象类,这下好好理解了!

    有7位网友表示赞同!

哭着哭着就萌了°

抽象类在代码设计中确实起到关键作用。

    有18位网友表示赞同!

弃我者亡

6.5的内容刚好是我想了解的,太感谢分享了!

    有18位网友表示赞同!

猫腻

感觉抽象类很像一个蓝图,具体的实现由子类来决定。

    有19位网友表示赞同!

浅巷°

学习编程真的需要从基础概念开始慢慢来。

    有5位网友表示赞同!

苏莫晨

这篇文章讲解得很深入,让我对抽象类有了更全面的理解。

    有5位网友表示赞同!

今非昔比'

这个标题直接点明主题,让人一看就明白要了解什么内容。

    有14位网友表示赞同!

无望的后半生

以后写代码的时候可以尝试用抽象类的概念进行设计了。

    有17位网友表示赞同!

心已麻木i

抽象类看起来复杂,但其实还是挺有用的。

    有11位网友表示赞同!

温柔腔

学习新知识总是充满挑战,也要保持好奇心!

    有18位网友表示赞同!

?娘子汉

对编程的理解越深入,会发现很多看似复杂的知识点其实很有逻辑性。

    有13位网友表示赞同!

肆忌

期待看到更多关于抽象类的实践案例吧!

    有9位网友表示赞同!

咆哮

6.5这个版本似乎很不错,更新内容也很丰富。

    有9位网友表示赞同!

淡淡の清香

学习一门技术需要不断积累和实践,才能真正掌握。

    有8位网友表示赞同!

眷恋

对于初学者来说学习编程的确需要从基础开始一步步来 。

    有8位网友表示赞同!

心贝

抽象类的概念应用广泛,在很多项目中都很有用处。

    有5位网友表示赞同!

发型不乱一切好办

这篇文章让我对抽象类有了更清晰的认识。

    有5位网友表示赞同!

【深入探讨6.5版本的抽象类原理与应用】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:专业定制微信投票方案服务,人工投票团队助力活动成功 下一篇:七律·台风山竹:自然灾害中的壮美与思考