提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
抽象,接口
练习
提示:这里可以添加本文要记录的大概内容:
提示:以下是本篇文章正文内容,下面案例可供参考
一、基础概念练习
-
static 修饰的属性,相较于实例变量,有哪些特别之处(>=3点)
1.只访问静态的变量或方法
2 不需要对象来访问,有类直接调用。
3 静态变量用完后不能被回收。 -
final 可以用来修饰哪些结构,分别表示什么意思?
-
1变量:普通数据类型,值不能改变,引用数据,地址不能改变,地址指向的值可以改变。
2 方法不能被重写
3类不能被继承。 -
类的属性赋值的位置有哪些?先后顺序为何?
1.默认初始化
2.显示初始化、代码块中初始化
3.构造器中初始化
4.通过“对象.属性”或“对象.方法”井下赋值 -
abstract 能修饰哪些结构? 修饰以后,有什么特点?
-
可以修饰类
修饰后的类不能实例化,需要我们提供一个子类进行继承,如果这个子类是一个普通的类(非抽象类)的话就必须覆写抽象类中的所有抽象方法。 -
可以修饰方法
抽象方法之定义了一种功能的标准,具体的执行和实现需要子类去实现,接口的方法就是抽象方法。定义了方法而不实现,正因为这样,其子类可以有更多的展现空间和实现能力。 -
抽象类可以粗略的理解为可以写抽象方法的普通类,但是这个抽象类中也可以没有抽象方法,就好比只是给了一个普通类有了写抽象方法的资格但是不能实例化而已,下面是几个常见的问题
-
接口是否能继承接口? 抽象类是否能实现(implements)接口? 抽象类是否能继承非抽象的类?
接口可以继承接口
抽象类能实现接口
抽象类能继承非抽象类
一个普通的类可以实现接口的同时并继承抽象类 -
抽象类和接口有哪些共同点和区别?
可以由普通和抽象类来继承和实现。
都有抽象方法。
但接口方法都是抽像的,抽象类可以有非抽象的方法。
二、基础应用练习
1.1) 动物类Animal包含了抽象方法 abstract void shout();
2) Cat类继承了Animal,并实现方法shout,打印“猫会喵喵叫”
3) Dog类继承了Animal,并实现方法shout,打印“狗会汪汪叫”
4) 在测试类中实例化对象Animal a1 =new Cat(),并调用a1的shout方法
5) 在测试类中实例化对象Animal a2 =new Dog(),并调用a2的shout方法
代码如下(示例):
package catandog;
public class catanddogTest {
public static void main(String[] args) {
Animal a1=new Cat();
a1.shout();
Animal a2= new Dog();
a2.shout();
}
}
2./定义一个抽象类Person,
有name,age,sex三个属性,创建构造函数,给这三个属性赋值,重写打印描述信息方法,打印三个属性值;这个类中有两个抽象方法work和hello;
定义两个子类Teacher,Student;教师的work实现是:教书育人,hello实现是:“同学好”;
学生的work实现是:认真学习,hello实现是“老师好”。/
代码如下(示例):
package Persondemo;
public abstract class Person {
private String name;
private int age;
private String sex;
public Person(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public abstract void work(String name);
public abstract void hello();
public class Student extends Person {
public Student(String name, int age, String sex) {
super(name, age, sex);
}
@Override
public void work(String name) {
System.out.println( name+"认真学习");
}
@Override
public void hello() {
System.out.println("老师好");
}
}
public class Teacher extends Person{
public Teacher(String name, int age, String sex) {
super(name, age, sex);
}
@Override
public void work(String name) {
System.out.println("教书育人");
}
@Override
public void hello() {
System.out.println("同学好");
}
}
public class PersonTest {
public static void main(String[] args) {
Person a1=new Student("xiaoming",16,"nan");
Person a2= new Teacher("wanglaoshi",29,"nv");
a1.work("xiaoming");
a2.hello();
}
}
}
3.编写工资系统,实现不同类型员工(多态)的按月发放工资。如果当月出现某个
Employee对象的生日,则将该雇员的工资增加100元。
实验说明:
(1)定义一个Employee类,该类包含:
private成员变量name,number,birthday,其中birthday 为MyDate类的对象;
abstract方法earnings();
toString()方法输出对象的name,number和birthday。
(2)MyDate类包含:
private成员变量year,month,day ;
toDateString()方法返回日期对应的字符串:xxxx年xx月xx日
(3)定义SalariedEmployee类继承Employee类,实现按月计算工资的员工处
理。该类包括:private成员变量monthlySalary;
实现父类的抽象方法earnings(),该方法返回monthlySalary值;toString()方法输
出员工类型信息及员工的name,number,birthday。
(4)参照SalariedEmployee类定义HourlyEmployee类,实现按小时计算工资的员工处理。该类包括:
private成员变量wage和hour;
实现父类的抽象方法earnings(),该方法返回wage*hour值;
toString()方法输出员工类型信息及员工的name,number,birthday。
(5)定义PayrollSystem类,创建Employee变量数组并初始化,该数组存放各类雇员对象的引用。利用循环结构遍历数组元素,输出各个对象的类型,name,number,birthday,以及该对象生日。当键盘输入本月月份值时,如果本月是某个Employee对象的生日,还要输出增加工资信息
package wagedemo;
import Info.Employee;
import java.util.Scanner;
public class wagedemoTest {
public static void main(String[] args) {
PayrollSystem payrollSystem= new PayrollSystem();
MyDate myDate = new MyDate(2000,3,16);
Employee e= new SalariedEmployee("xd",1,myDate,3000.0);
Employee e2 = new SalariedEmployee("xd",2,myDate,3000.0);
Employee[] employees={e,e2} ;
payrollSystem.setEmployees(employees);
Scanner sc = new Scanner(System.in);
for (int i = 0;i<employees.length;i++){
System.out.println(employees[i])
}
System.out.print("请输入月份:");
int s2 = sc.nextInt();
for (int i=0;i<employees.length;i++){
if (employees[i].getBirthd.getMonth==s2){
System.out.println(employees[i].getName()+"该月生日,奖励100元");
}
}
}
}
}
4.定义一个接口用来实现两个对象的比较。
interface CompareObject{
public int compareTo(Object o); //若返回值是 0 , 代表相等; 若为正数,代表当前对象大;负数代表当前对象小
}
定义一个Circle类,声明radius属性,提供getter和setter方法
定义一个ComparableCircle类,继承Circle类并且实现CompareObject接口。在ComparableCircle类中给出接口中方法compareTo的实现体,用来比较两个圆的半径大小。
定义一个测试类InterfaceTest,创建两个ComparableCircle对象,调用compareTo方法比较两个类的半径大小。
思 考 : 参 照 上 述 做 法 定 义 矩 形 类 Rectangle 和 ComparableRectangle 类 , 在
ComparableRectangle类中给出compareTo方法的实现,比较两个矩形的面积大小。
`package comparedemo;
public interface CompareObject {
public void compareTo(Object o);
public class Circle {
private int radius;
public Circle(int radius) {
this.radius = radius;
}
public int getRadius() {
return radius;
}
public void setRadius(int radius) {
this.radius = radius;
}
}
public class ComparableCircle extends Circle implements CompareObject{
public ComparableCircle(int radius) {
super(radius);
}
@Override
public void compareTo(Object o) {
if (this.getRadius()>((Circle)o).getRadius()){
System.out.println("右边大");
}else if (this.getRadius() == ((Circle) o).getRadius()){
System.out.println("相等");
}else {
System.out.println("左边大");
}
}
public class comparTest {
public static void main(String[] args) {
ComparableCircle comparableCircle=new ComparableCircle(4);
ComparableCircle comparableCircle1 = new ComparableCircle(5);
comparableCircle.compareTo(comparableCircle1);
}
}
}