Java面向对象(一)

注:本章节用来复习抽象和接口。

一、抽象abstract

①被abstract关键字修饰的方法称为抽象方法,抽象方法没有方法体;

②被abstract关键字修饰的类是抽象类,如果一个类中包含了抽象方法,那么这个类必须是抽象类;

③当一个子类继承了抽象父类后,两种解决方案:

  • 方案1:变成抽象子类,子类也不实现,继续抽象;

  • 方案2:变成普通子类,实现抽象父类中的所有抽象方法。

④抽象类不可以创建对象(实例化)。

⑤抽象类是有构造函数的,但不是自己使用,是为了子类super()使用;

⑥抽象类中可以定义成员变量和成员常量;

⑦抽象类中可以全部都是普通方法或者全是抽象方法,或者半普半抽;

⑧如果一个类不想被外界实例化,可以把这个类声明成抽象类。

1.2abstract的注意事项

抽象的方法要求子类必须重写,那么当abstract与下列关键字一起使用时,在抽象类中是没有意义的:

  • private:被私有化之后,子类就无法重写,与abstract相违背;
  • static:静态优先于对象存在,存在加载顺序的问题;
  • final:被final修饰后,无法重写,与abstract相违背。
/**本类用作抽象类的入门案例*/
public class AbstractDemo {
    public static void main(String[] args) {
        /**4.抽象类不可以创建对象(实例化);
         * */
       // Animal a1 = new Animal();
        Animal a2 = new Pig();
        a2.eat();
        a2.fly();
        a2.fly2();
    }
}
/**2.被abstract关键字修饰的类是抽象类,如果
 * 一个类中包含了抽象方法,那么这个类必须被声明成一个抽象类*/
abstract class Animal{
    public void eat(){
        System.out.println("吃啥都行~");
    }
    public void play(){
        System.out.println("玩啥都行~~");
    }
    /**1.被abstract关键字修饰的方法称为抽象方法,抽象方法没有方法体*/
    public abstract void fly();
    public abstract void fly2();
}
/**3.当一个子类继承了抽象父类以后,有两种解决方案:
 * 方案1:变成抽象子类,子类也不实现,继续抽象
 * 方案2:变成普通子类,实现抽象父类中的所有抽象方法*/
//abstract class Pig Animal(){}  ---方案1

class Pig extends Animal{
    @Override
    public void fly() {
        System.out.println("可以还清~~起飞~");
    }

    @Override
    public void fly2() {
        System.out.println("抽象父类中所有的抽象方法都需要被实现~!");
    }
}

/***********************************************************/
**本类用于抽象类中构造方法的测试
 * 1.抽象类是有构造方法的;
 * 2.抽象类不能创建对象,有构造方法,不是为了自己创建对象时使用,而是为了子类创建对象时使用super()
 * */
public class AbstractDemo2 {
    public static void main(String[] args) {
       // Animal2 a = new Animal2();
        Pig2 p = new Pig2();
    }
}
/**1.抽象类中可以定义成员变量;
 * 2.抽象类中可以定义成员常量;
 * 3.抽象类中可以定义普通方法;
 * 4.抽象类中可以都是普通方法;
 * 5.如果一个抽象类都是普通方法,为什么还要被声明成抽象类?
 * 因为抽象类不可以被实例化,所以如果不想让外界创建本类的对象,就可以把普通类声明成抽象类
 *6.抽象类中可以定义抽象方法,也可以都是抽象方法
 *  */
abstract class Animal2{

    public Animal2(){
        System.out.println("这是抽象类的含参构造函数");
    }
}
/**抽象类不能创建对象,抽象类有构造方法*/
class Pig2 extends Animal2{
    public Pig2(){
        super();//调用父类的无参构造
        System.out.println("这是Pig2的构造方法~");
    }
}

二、接口

接口在Java中是一种抽象类型,接口中的内容是抽象形成的需要具体实现的功能,接口更像是一种规则和一套标准。

接口特征:

  • 通过interface来定义,通过implements让子类实现接口;
  • 接口里是没有构造方法的;
  • 如果一个类没有明确指定自己的父类,默认继承顶级父类Object;
  • 接口里没有成员变量,有的是静态常量,会默认拼接成public static final  int n = XX;
  • 接口里的抽象方法可以简写,会默认拼接public abstract。
  • 可以把接口理解成一个特殊的抽象类,但是接口不是类!!!
  • 描述类的是一类事物的属性和方法,接口则是包含实现类要实现的方法;
  • 接口和类之间可以多实现,接口与接口之间可以多继承;
  • 接口是对外暴露规则,是一套开发规范;
  • 接口提高了程序的扩展性,降低了耦合性;
/**本类用于测试面向接口编程*/
public class TestTeacherInter {
    public static void main(String[] args) {
        CGBTeacher ct = new CGBTeacher();
        ct.ready();
        ct.play();
        ct.teach();
    }
}
//创建老师接口,接口是先天设计的结果吗,最先设计的就是接口,要制定规则
interface Teacher{
    void teach();//public abstract void teach()
    void play();//public abstract void play()
    void ready();
}
class CGBTeacher implements Teacher {
    @Override
    public void teach() {
        System.out.println("授课电商项目~");
    }
    @Override
    public void play() {
        System.out.println("备课电商项目~");
    }
    @Override
    public void ready() {
    }
}
class SCDTeacher implements Teacher{
    @Override
    public void teach() {
    }
    @Override
    public void play() {
    }
    @Override
    public void ready() {
        System.out.println("正在备课....");
    }
}

/******************************************************************/
/**本类用于测试接口中的成员*/
public  class TestUserInter2 {
    public static void main(String[] args) {
        UserInter2Impl i2 = new UserInter2Impl();
        System.out.println(i2.n);
        System.out.println(i2.NAME);
        System.out.println(UserInter2.NAME);
        //UserInter2.n = 40;//常量的值不可以被修改
        /**3.接口中可以定义抽象方法*/
        /**4.接口中的抽象方法定义时可以简写,会自动给方法拼接上public abstract*/
    }
}
interface UserInter2{
    /**1.接口中不可以定义成员变量
     * 2.接口中的是静态常量,实际上的写法是:public static final int age = 20;
     * 只不过接口中可以省略不写,会默认拼接,我们写成int age = 20;也可以
     * */
    public static final int n = 100;
    final String NAME = "swx";
}
//创建接口的实现类
class UserInter2Impl implements UserInter2{
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值