自助式网站制作,织梦校园招生网站源码,附近图文广告公司电话,更改wordpress主题名称同样#xff0c;我们由这道题引出抽象类#xff0c;抽象方法这个概念。
按下面要求定义类Converter及其子类WeightConverter
定义抽象类#xff1a;Converter#xff1a;
定义一个抽象类Converter#xff0c;表示换算器#xff0c;其定义的如下#xff1a;
一个私有…同样我们由这道题引出抽象类抽象方法这个概念。
按下面要求定义类Converter及其子类WeightConverter
定义抽象类Converter
定义一个抽象类Converter表示换算器其定义的如下
一个私有的String类型成员变量name表示换算器Converter的名称并定义name变量的getter方法一个带参数的构造器用于对name赋值一个公有的抽象方法double convert(); 表示进行换算操作。
定义Converter的子类WeightConverter
定义Converter的子类WeightConverter表示重量换算器。
对于WeightConverter类的要求如下
成员变量 value 表示原重量值并定义其getter方法成员变量 factor 表示换算系数比如 公斤-克的换算系数为1000因为1公斤1000克带三个参数的构造器在实例化WeightConverter对象时初始化换算器名称、原重量值以及换算系数实现父类Converter中的convert方法将原重量值换算为指定单位的重量值
Main类代码
import java.lang.reflect.Modifier;
import java.util.Scanner;
public class Main {public static void main(String[] args) throws ClassNotFoundException {Class? clazz Class.forName(Converter);Class? clazz2 Class.forName(WeightConverter);boolean isAbs Modifier.isAbstract(clazz.getModifiers()) ;System.out.println(clazz.isAssignableFrom(clazz2) Modifier.isAbstract(clazz.getModifiers()));Scanner scanner new Scanner(System.in);System.out.println(请输入换算器名称(比如斤-克)、原重量值和换算系数中间用空格分开);String name scanner.next();double value scanner.nextDouble();double factor scanner.nextDouble();WeightConverter converter new WeightConverter(name,value,factor);String[] units name.split(-);System.out.println(converter.getName()换算converter.getValue()units[0]converter.convert()units[1]);}
}
输入样例
在这里给出一组输入。例如
斤-克 2.5 500输出样例
在这里给出相应的输出。例如
true true
请输入换算器名称(比如斤-克)、原重量值和换算系数中间用空格分开
斤-克换算2.5斤1250.0克
先来看有关抽象类问题的需求 定义一个抽象类成员变量和构造器倒是和以前定义类时差不多唯一变了的就是方法这里要求我们定义一个抽象方法。
好嘞撸起袖子加油干——咱们来唠唠“抽象”。
抽象
抽象英文abstract,为什么要抽象Java为了符合现实生活中的逻辑有些类是不能被实例化的于是便有了抽象类。
举个例子我们要介绍一个人的爱好。这时候爱好就是个抽象的概念它看不见摸不着是只存在人类脑子里的概念。爱好可以是方方面面在写爱好类时我们可以标上爱好的名字但我们是敲不出方法体的——再细细道来
我们可以先写一个Person类然后Person类具有姓名职业以及爱好这个方法由上面分析可以知道在没有实例化Person时我们并不知道这个爱好究竟是什么。这时候我们利用abstract关键字把爱好这个方法写成抽象方法(具体格式在后面)既然这个类有个方法/行为是抽象的那么这个类也应该是抽象的。
因为对象我们又称作实例对象所有的属性和方法都得具体化。一旦抽象类被实例化一是它的逻辑上说不通二是抽象方法与具体、完整的实例方法相矛盾。
小总结
故抽象类是不能被实例化的且有了抽象方法就一定是抽象类
且看代码
public abstract class Person {//定义一个Person类private String name;private String career;//俩成员变量public Person(String name,String career){this.name name;this.career career;}//有参构造器public abstract String hobby();//未知爱好无法书写方法体故令其为抽象方法public String toString()//这里重写toString()方法改变返回类的信息不再是简单的地址_哈西玛{return name 是一位 career 爱好是 hobby();}//toString()方法是Person类继承Object类的方法对其进行重写}
题外话所有的类的拥有一个共同的父类:Object类一般默认不写但是默认继承。
虽说只能有一个直接父类但是间接父类是可以有很多的并且都会继承间接父类的属性和方法。有关继承和方法覆盖我们在这里详说感兴趣的小伙伴可移步这里
Java-继承-定义Student类继承于Person类(例)-CSDN博客
抽象类的语法格式
public abstract class 类名
{}//abstract关键字放在class前面
abstract是放在class前面抽象一般是公开的但一定不能是private。
抽象方法的语法格式
abstract 方法返回类型 方法名(参数列表)
{//方法体
}
问题来了抽象到底做什么用呢---抽象类的逻辑作用避免抽象类被实例化(这个我们上文解释过了)代码上的作用其实就是一种继承。
抽象方法的作用——用来对继承它的子类的行为作出某种规范实现方法的声明。
怎么又和继承挂上钩了好问题不过能问出这种问题说明还需要对继承有正确的认识。
对于上次说到的继承我们会使用继承是因为类与类之间具有传承。这里引入的抽象类其实本质上是对继承的扩大有些时候父类并不会是实实在在的类不能被实例化。
综上所述继承本质上是描述类与类之间抽象与具体的关系父类未完善的子类就对其补充。
而抽象也正是对继承的普遍化对于我们定义子类起着更加规范的作用因为抽象方法必须实现因为不实现编译都不给过。而子类继承非抽象类的父类的方法时对于方法重写需要我们主动Override。
了解了继承与抽象的关系那读懂抽象的语法规则简直易如反掌。
abstract的语法规则
1.abstract不能修饰private,抽象方法作父类肯定要被子类继承并一对一进行完善子类看不见显然是矛盾的。
2.抽象方法必须定义在抽象类中抽象方法意味着某个类在某个行为上抽象那沾了点抽象就是抽象类了。
3.抽象方法不能有实现被实现的抽象方法就不叫抽象方法了。注意在子类里被实现的抽象方法是叫实例方法也可以叫方法覆盖不过是强制性的。只有抽象类里的方法才能算抽象方法
咱们把这道题拿下抽象的知识点基本就掌握了。
回到题目 1、2要求我们还是直接上代码需要相应详细参考的可以移步定义类定义一个类Square表示正方形_定义一个square类,当客户访问该页面时,服务器创建该类的对象,只要客户给出正方形-CSDN博客
public abstract class Converter {//让我们定义一个抽象类则在class前面加一个abstractString name;//换算器名称public String getName(){return name;}//name的getter方法public Converter(String name){this.name name;}//有参构造器
}
3.抽象方法的书写
public abstract class Converter {//...public abstract double convert();//抽象方法是不是很像方法的声明不过确实是方法声明//抽象方法如果在声明里面abstract前面写上了public ,那后面在子类实现方法的时候一定也要加上public否则会报错
}
在抽象方法声明里面有了public,后面子类实现方法的时候一定要加上public。如果声明里面没有写public子类里面倒是可写 可不写。有觉得绕的同学可以记住要么都写要么都不写。 前俩题涉及定义类这个知识点。而3题涉及super关键字和继承要作详细了解的同学移步 Java-继承-定义Student类继承于Person类-CSDN博客
前仨的代码
public class WeightConverter extends Converter//子类继承抽象类/父类
{private double value;//原重量值public double factor;//换算系数public double getValue(){return value;}public WeightConverter(String name,double value,double factor){super(name);//调用父类的构造器实现该对象下的成员变量赋值this.value value;this.factor factor;}
} 子类对抽象方法的实现
public class WeightConverter extends Converter
{
//...public double convert(){return value * factor; }//根据题意得看不懂题由输入样例和输出样例结合一下可知就是value和factor相乘的结果}
完整代码:(合在一个java文件下只会有一个public类就是main类)
abstract class Converter
{String name;public String getName(){return name;}public Converter(String name){this.name name;}public abstract double convert();}class WeightConverter extends Converter
{double value;//原重量值double factor;//换算系数public double getValue(){return value;}public WeightConverter(String name,double value,double factor){super(name);this.value value;this.factor factor;}public double convert(){return value * factor; }}