今天给各位分享深入探讨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类中。这也是一个典型的模板模式。
模板模式常用于面向对象的软件中。它的原理很简单,实现也很简单。以下是使用钢模板图案的一些简单规则:
【深入探讨6.5版本的抽象类原理与应用】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于明白了什么是抽象类了!
有13位网友表示赞同!
以前一直对抽象的概念感到模糊,这个讲解很清晰。
有5位网友表示赞同!
学习编程的时候总是会遇到抽象类,这下好好理解了!
有7位网友表示赞同!
抽象类在代码设计中确实起到关键作用。
有18位网友表示赞同!
6.5的内容刚好是我想了解的,太感谢分享了!
有18位网友表示赞同!
感觉抽象类很像一个蓝图,具体的实现由子类来决定。
有19位网友表示赞同!
学习编程真的需要从基础概念开始慢慢来。
有5位网友表示赞同!
这篇文章讲解得很深入,让我对抽象类有了更全面的理解。
有5位网友表示赞同!
这个标题直接点明主题,让人一看就明白要了解什么内容。
有14位网友表示赞同!
以后写代码的时候可以尝试用抽象类的概念进行设计了。
有17位网友表示赞同!
抽象类看起来复杂,但其实还是挺有用的。
有11位网友表示赞同!
学习新知识总是充满挑战,也要保持好奇心!
有18位网友表示赞同!
对编程的理解越深入,会发现很多看似复杂的知识点其实很有逻辑性。
有13位网友表示赞同!
期待看到更多关于抽象类的实践案例吧!
有9位网友表示赞同!
6.5这个版本似乎很不错,更新内容也很丰富。
有9位网友表示赞同!
学习一门技术需要不断积累和实践,才能真正掌握。
有8位网友表示赞同!
对于初学者来说学习编程的确需要从基础开始一步步来 。
有8位网友表示赞同!
抽象类的概念应用广泛,在很多项目中都很有用处。
有5位网友表示赞同!
这篇文章让我对抽象类有了更清晰的认识。
有5位网友表示赞同!