Java面向对象 Part 3
前言
在前面的两节中我们对面向对象已经有了差不多的了解了,
而这一节也是Java面向对象部分的一个结尾,
在这一节中我们会对抽象类,接口,修饰符,枚举,封装进行解析;
抽象类
什么是抽象类
我们将具有共同特点的类进行抽象后得到的一个类,而这个类本身的方法并没有任何具体的实现;
eg:定义一个抽象的动物类,然后定义几个抽象方法(动物共有的方法),比如设置有多少只脚的方法
public abstract void setFoods();
抽象类的定义:
一般使用abstract关键字修饰
抽象类: 修饰符 abstract 类名{//类的内容}
抽象方法: 修饰符 abstract 返回值类型 方法名();
抽象类的使用规则:
①如果一个类有一个抽象方法,那么这个类一定是抽象类;反之,如果一个类是抽象类,但可能包含有非抽象的方法
②如果一个类继承了一个抽象类,那么必须重写抽象类中所有的抽象方法,是所有!所有!如果没有全部实现的话
那么子类必须也要定义为一个抽象类
③abstract不能和static放在一起,否则会出现错误(因为static不能被覆盖,abstract为了生效,必须被覆盖)
④抽象类可不能定义为最终哦!abstract不能与final共存!
⑤注意区分方法的空实现和方法的抽象
eg:方法的空实现:private void show(){} 方法的抽象,无实现: private void show();
⑥抽象类不能够实例化哦!但是可以new的时候重写里面的抽象方法
抽象类使用实例
代码:
package com.jay.example;
/*
* 该代码是定义一个抽象类,汽车类,定义几个属性和抽象方法
* 然后定义客车,吊车类作为它的子类,
* 在客车类中即重写抽象方法,也重写了具体方法
* 在吊车类中,只是重写具体方法,不重写抽象方法,所以吊车类
* 需要被设置为抽象类,否则会报错
* */
abstract class Car
{
protected String color;
protected int sudu;
//定义一个具体的方法
public void speed()
{
System.out.println("加速");
}
//定义一个抽象方法,是方法的空实现哦,子类继承时需要覆盖该方法
public abstract void useful();
}
class Truck extends Car
{
public void speed()
{
System.out.println("卡车起步很慢");
}
public void useful() {
System.out.println("卡车是用于货运的!");
}
}
//定义吊车类,没有实现抽象方法,所以需为抽象类
abstract class Crane extends Car
{
public void speed() {
System.out.println("吊车走得更加慢!");
}
}
public class AbstractDemo {
//抽象类可不能直接实例化哦!Car c = new Car()是会报错的
//当然可以通过向上转型的规则:Car c = new Track();是可以的
public static void main(String[] args) {
Truck tr = new Truck();
tr.speed();
tr.useful();
//下面是演示protected修饰的作用于,子类或者同包可见
tr.color = "白色";
tr.sudu = 40;
System.out.println(tr.color + tr.sudu + "km/h");
}
}
运行截图:
代码解析:
该代码演示了抽象类的基本用法,定义抽象类父类Car,定义了一个抽象方法和具体方法
然后在卡车类中都重写了两个方法;在吊车类中仅仅重写了具体方法,所以吊车类需要被设置为抽象类
最后还演示了protected的作用域:子类与同包可见
接口
接口的介绍:
因为Java的数据结构是树型的,所以不像C++那样可以同时继承多个父类;但是Java通过接口和内部类实现了多继承
接口是一种特殊的抽象类,一个类实现一个接口,相当于它继承了一个抽象类
接口的定义:
修饰符 inteface 接口名{"内容"}
接口的实现:
一个类可以在继承一个父类同时实现多个接口,用","分隔
class 类名 extents 父类 implements 接口1,接口2...{}
使用规则:
①一个Java文件中只允许有一个public修饰的类或者接口,且需与文件名同名,是一个!!
②在一个接口中,所有方法都是公开的,抽象的方法!!所有的属性都是公开,静态,常量!
③如果一个类声明实现一个接口,但是没有实现接口中的所有方法,那么这个类必须是抽象类哦!
④接口只关心功能,并不关心功能的具体实现
⑤接口也可以通过extends继承哦!但是依旧需要实现子接口和父接口中的所有抽象方法
⑥接口中的方法可以不写public,但是子类实现接口中的抽象方法时,要写上public,不然会报错哦!
代码示例:
package com.jay.example;
/*
* 在这个代码中,我们定义了两个父接口,又用一个子接口对两个父接口进行了继承
* 同时为子接口又定义了一个抽象方法;然后定义了一个Person实现两个父接口
* 重写了两个抽象方法;又定义了一个Worker实现了子接口,但同时也需要把父接口
* 中的抽象方法进行覆盖
*
* */
//定义一个说话的接口
interface Speak
{
void speak();
}
//定义一个吃饭的接口
interface Eat
{
void eat();
}
//定义一个子接口,同时继承说话和吃饭的接口,同时定义一个走路的方法
interface Walk extends Speak,Eat
{
void walk();
}
//定义一个Person类,实现说话和吃饭接口,重写接口中的抽象方法
//子类在实现接口的时候,public修饰符不可以省略,不然会报错
class Person implements Speak,Eat
{
public void speak()
{
System.out.println("Person类可以说话");
}
public void eat()
{
System.out.println("Person类可以吃饭");
}
}
//定义一个Worker类直接实现walk接口,同时要实现两个父接口中的抽象方法
class Worker implements Walk
{
public void speak()
{
System.out.println("Worker类可以说话");
}
public void eat()
{
System.out.println("Worker类可以吃饭");
}
public void walk()
{
System.out.println("Worke