Java的抽象类

编程入门 行业动态 更新时间:2024-10-07 13:25:55

Java的<a href=https://www.elefans.com/category/jswz/34/1764686.html style=抽象类"/>

Java的抽象类

今天学习了Java的抽象类,在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类;抽象来除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法、初始化块和构造方法和普通类一样。由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。
接下来我们可以通过一些练习题来深入的了解抽象类

1、为“无名的粉”写一个类class WuMingFen

//一般情况下,不允许定义类在default包中,因为default包中的类其它包无法访问
//包名称的命名规则:全小写,采用域名反转
package com.yan;
//类名称,一般名词,采用大写字母开头,大写字母分词
public class WuMingFen {
private String theMa;
private int quantity;//采用简单类型定义属性,最大的问题是很难判定是默认值还是赋的值
private boolean likeSoup=true;//按照一般的业务规则,可以一般有汤
//一般在具体开发中,建议采用私有属性,公有的get/set方法的形式定义属性
public String getTheMa() {
return theMa;
}
//业务规则:面码一旦告知则不能修改,所以可以不提供这个set方法,则面码属性就是只读属性
public void setTheMa(String theMa) {
this.theMa = theMa;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
//通过get/set方法可以进行一些参数的合法性验证
if(quantity<1) quantity=1; 
//也可以通过抛出异常终程序运行 throw new RuntimeException()
this.quantity = quantity;}public boolean isLikeSoup() {//如果针对boolean类型的属性,默认get方法的命名规则是isXxxx不 是getXxx;但是如果将属性修改为Boolean,则还是getxxxreturn likeSoup;}public void setLikeSoup(boolean likeSoup) {this.likeSoup = likeSoup; }}

2.写一个构造方法 以便于简化初始化过程 如 WuMingFen f1 = new WuMingFen(“牛肉”,3,true);

// 添加一个带参构造器。如果不定义构造器则系统自动提供一个默认的的无参构造器;如果自定义构造器则系统 不再提供构造器。所以一般定义带参构造器时建议同时添加无参构造器 // 构造器不是成员,所以不能继承 // 构造器方法不能有返回值类型,连void都不能有,否则就是普通方法,不是构造器 // 构造器方法名称必须和类名称一致 // 构造器如果不定义,则系统自动提交默认的无参构造器方法;如果定义构造器方法则系统不再提供构造器public WuMingFen(String theMa, int quantity, boolean likeSoup) {
// 方法参数likeSoup和属性名称一致,在当前方法中的likeSoup实际上就是局部变量,而不是属性;如果 需要使用属性,则必须通过this.进行引用
this.likeSoup = likeSoup;
this.theMa = theMa;
this.quantity = quantity;
}public WuMingFen() {}

IDE工具自动生成的构造器方法

public WuMingFen(String theMa, int quantity, boolean likeSoup) {super(); //调用父类的无参构造器,在构造器中这个语句可写可不写,如果不写则默认第一句就是 super()this.theMa = theMa;this.quantity = quantity;this.likeSoup = likeSoup; }

证明

public class Fen{public Fen(int k){} }//可以看到class WuMingFen extends Fen则super()报错,因为Fen类中没有无参构造器 public WuMingFen(String theMa, int quantity, boolean likeSoup) { super(10);//如果父类中没有无参构造器则调用父类的带参构造器则是必须的this.theMa = theMa;this.quantity = quantity;this.likeSoup = likeSoup; }

3.重载构造方法 使得初始化过程可以多样化 WuMingFen f2 = new WuMingFen(“牛肉”,2);

//方法的重载//方法名称相同,参数不同[个数、顺序、类型],和返回值类型无关,和参数名称无关 public WuMingFen(String theMa,int quantity){ this(theMa,quantity,true);//调用上面定义的构造器,并传入相关的参数 }

4.如何使得下列语句构造出来的粉对象是酸辣面码、2两、带汤的 WuMingFen f3 = new WuMingFen();

//方法的重在,但是按照业务规则,给属性赋默认值public WuMingFen(){//方法1:酸辣面码、2两、带汤 this.likeSoup=true;this.theMa="麻辣";this.quantity=2;//方法2 this("麻辣",2,true); }

5.写一个普通方法 check() 用于查看粉是否符合要求。即将对象的三个属性打印在控制台上。

public void check() {System.out.println("无名粉:面码" + this.theMa + ",重量" + quantity + "," + (likeSoup ? "有汤" : "无汤")); }

补充: 三元表达式的用法

public class T1 {public static int getMax(int a1, int a2) {if(a1>a2) return a1; elsereturn a2; }public static void main(String[] args) {System.out.println(getMax(4, 2)); } }

java提供了一种三元表达式的写法用于简化一些判断求值的处理,有地方也称之
为三目运算符

语法规则: 表达式1?表达式2:表达式3

处理规则: 当表达式1计算结果为true时,计算表达式2的结果并返回,否则计算表达式3的结果并返回

if(表达式1){return 表达式2; }else return 表达式3;
int k1 = 4; 
int k2 = 2; 
int max = k1 > k2 ? k1 : k2; 
System.out.println(max);

考核一般和++以及–整合在一起
2、定义一个名为Vehicles交通工具的基类 该类中应包含String类型的成员属性brand商标和color颜色 还应包含成员方法run行驶,在控制台显示“我已经开动了” showInfo显示信息,在控制台显示商标和颜色 并编写构造方法初始化其成员属性。

public class Vehicles {
private String brand;// 商标,get
private String color;// 颜色,set/get
public Vehicles() {
this.brand="linken";
this.color="red";
}public void run() {
System.out.println("我已经开动了");}
public void showInfo() { 
System.out.println("品牌为:" + this.brand + ",颜色" + public class A{ public void pp(Pig pig){} //如果进行切换类型,则必须进行修改源代码 }//------------- public class A{ public void pp(Animal animal){} //这里可以任意更换Animal的子类 }class Animal{} class Pig extends Animal{} class Cat extends Animal{}}

抽象类

面向对象编程的核心是面向抽象编程,一般依赖抽象不依赖具体

public class A{public void pp(Pig pig){} //如果进行切换类型,则必须进行修改源代码}//------------- public class A{ public void pp(Animal animal){} //这里可以任意更换Animal的子类 }class Animal{}class Pig extends Animal{}class Cat extends Animal{}
public class 游戏 {public void 玩() {//定义父类时,有些方法必须声明,因为不做声明则无法正常调用 游戏 a=new 篮球(); //但是在游戏类中由于具体不够明确,所以没有办法具体定义 }}

包含了抽象方法的类叫作“抽象类” 所谓的抽象方法是指没有函数体的方法,抽象方法必须在子类中给出具体实现,而抽象类本身不能创建对象

抽象类的特点

方法只有声明没有实现时,该方法就是抽象方法【不是空实现方法体,没有{}】,需要被abstract修饰,否则语 法报错。抽象方法必须定义在抽象类中,该类必须也被abstract修饰

不能定义抽象构造函数

抽象类中可以定义构造器,也可以不定义构造器,使用系统默认提供的无参构造器,但是自定义构 造器不能private

抽象类不能是Õnal class,Õnal类不能被继承,从语法的角度上说不允许继承,不是构造器的原因。

不能定义抽象静态方法

抽象类中可以有静态方法,但是必须有方法体,不能是抽象方法

允许抽象类直接调用静态方法

抽象类不能直接创建对象,只能通过继承的方式由子类实现对应的抽象方法;

一般的使用方法为【动物 x=new 人();】

所有抽象类的子类必须实现抽象父类中的所有抽象方法或者自己也声明成抽象类[没有实现所有的抽象方法]

抽象类除了可以有抽象方法,也可以有非抽象方法,允许静态方法【没有抽象静态方法的概念】

没有任何限制,允许属性、方法,也允许抽象方法

抽象类不可以被实例化

是因为调用抽象方法没有意义?

抽象类必须有其子类覆盖了所有的抽象方法后,该子类才可以实例化,否则这个子类还是抽象类

强调:注意抽象类中可以包含构造器、析构器、抽象方法和方法以及静态方法等,也可以没有抽象方法

什么时候使用抽象类
当一个类的一个或多个方法为抽象方法时

当该类为一个抽象类的子类,并且没有为所有抽象方法提供实现细节或方法主体时

当一个类实现一个接口,并且没有为所有抽象方法提供实现细节或方法主体时

抽象类和普通类的区别
抽象类不能直接实例化,并且对抽象类使用 new 运算符是编译时错误

抽象类允许(但不要求)抽象类包含抽象成员

抽象类不能被密封:简单说就是被Õnal修饰的类,密封类不能被继承,防止了恶意的派生

模板模式

定义抽象类的目的是提供可由其子类共享的一般形式,子类可以根据自身需要扩展抽象类

什么是模板模式

在模板模式Template Pattern中一个抽象类公开定义了总体的算法【算法骨架】,把没有办法在父类中实现的方法 延迟到子类中具体实现。这种类型的设计模式属于行为型模式

何时使用
有多个子类共有的方法,且逻辑相同

重要的、复杂的方法,可以考虑作为模板方法
注意事项
为防止恶意操作,一般模板方法都加上 final 关键词
优点
封装不变部分,扩展可变部分

提取公共代码,便于维护

行为由父类控制,子类实现。

缺点

每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
抽象类的作用
在面向对象方法中,抽象类主要用来进行类型隐藏。构造出一个固定的一组行为的抽象描述,但是这组行为却能够 有任意个可能的具体实现方式。这个抽象描述就是抽象类,而这一组任意个可能的具体实现则表现为所有可能的派 生类。模块可以操作一个抽象体。由于模块依赖于一个固定的抽象体,因此它可以是不允许修改的

通过从这个抽象体派生,也可扩展此模块的行为功能。为了能够实现面向对象设计的一个最核心的原则开闭原则 OCP,抽象类是其中的关键所在

抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具 体概念的抽象

OOP的核心是面向抽象编程 在父类中固化算法骨架,在子类中实现特殊的方法 依赖抽象

更多推荐

Java的抽象类

本文发布于:2024-02-19 15:28:02,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1764781.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:抽象类   Java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!