java笔记9-abstract和接口

这一节讲一下abstract抽象的关键字和接口  abstract可以修饰类和方法

修饰的方法叫做抽象方法:有方法的结构没有方法体(没有大括号)的方法(native修饰的也没有方法体但不属于抽象方法),有抽象方法的类 必须改成抽象类或者接口;

abstract修饰的类是抽象类 抽象类里面不一定有抽象方法,

抽象类可以继承抽象类和普通类(正经不这么干)
抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。

//接口不能被实例化 也没有构造方法 不能有块
//接口可以继承多个接口 一个类也可以实现多个接口



//声明接口的时候 不用写abstract默认是隐式抽象的
public abstract interface InterfaceAnimal extends A,B{
    //接口的属性默认被public static final修饰
    //被final修饰的属性需要赋值
    public static final String name="人";
    //接口的方法都是共有的抽象方法不写也默认被abstract public修饰
    //类实现接口的时候 方法的返回值必须一致
    public abstract String eat();

}


interface A{
    void sleep(String name);

}

interface B{
    void talk();

}
//抽象类  被abstract修饰的类叫做抽象类
//抽象类不能被实例化(初学者很容易犯的错),如果被实例化,就会报错,编译无法通过。只有抽象类的非抽象子类可以创建对象。
//抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类。
abstract class TestAbstact implements InterfaceAnimal{
    //抽象类可以包含属性、静态变量、常量、块 静态块
    String name;
    static String  address;
    final int number=1;
    //抽象类可以包含构造方法、静态方法、一般方法、final修饰的方法
    //抽象类不能调用构造方法 只能子类通过继承使用
  //构造方法,类方法(用 static 修饰的方法)不能声明为抽象方法。
    public TestAbstact() {}
    public TestAbstact(int a) {
        System.out.println(a);
    }
    //静态方法
    //静态方法不能是抽象方法,否则可以直接类名调用静态方法且没有方法体
    public static void teststaticmethod(){

        System.out.println("我是静态方法");
    }
    //一般方法
    public void talk(){
        System.out.println("我把接口的说话方法实现了,现在是一个普通的方法");
    }

    //抽象方法 抽象方法是没有方法体的({}这种叫有方法体方法体没内容,不要混淆)
    public abstract String eat();
    //抽象方法的重载
    public abstract void eat(String name);
     //子类继承(或实现)父类(接口)的抽象方法时权限应该放的更开,接口所有方法都是public方法所以只能是public权限修饰
    //抽象类继承(或实现)抽象方法后可以不用具体实现 下面代码可以不写
    public  void sleep(String name){
        System.out.println("抽象类睡觉的方法");
    };
}

//子类是普通类继承抽象类(接口)必须把所有的抽象方法都重写包含抽象类继承的接口的抽象方法
//抽象类的子类必须给出抽象类中的抽象方法的具体实现,除非该子类也是抽象类。

class SunTestAbstact extends TestAbstact{
    String name="1";
    //需要实现父类的抽象方法
    public String eat(){
        System.out.println("子类吃饭的方法");
        return "吃的放回值";
    }
    //需要实现父类的抽象方法的重载
    public void eat(String name){
        System.out.println(name);
    }
    //需要实现父类继承的接口继承的接口的抽象方法 如果父类做了实现子类就不需要再次实现了
    public void sleep(String name){
        System.out.println("继承抽象类子类的睡觉方法");
    }
    //需要实现父类继承的接口继承的接口的抽象方法
    public void talk(){
        System.out.println("子类讨论的方法");
    }

}





//普通类
public class AbstractClass {
    public static void main(String[] args) {
        SunTestAbstact sun =new SunTestAbstact();
        System.out.println("123");


    }

//implements InterfaceAnimal
}

 

1、定义了A、B两个接口
2、InterfaceAnimal接口继承了A,B接口
3、抽象类TestAbstact继承了InterfaceAnimal
4、普通类SunTestAbstact继承了抽象类
posted @ 2019-05-29 11:26  国际惯例  阅读(609)  评论(0编辑  收藏  举报