这一节讲一下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继承了抽象类