Java抽象类,接口,多态

1、抽象类的定义:

   将公共的能实现的功能实现,不能具体实现的功能定义声明好抽象作为模板,子类根据模板暴露的声明去具体实现。

抽象方法:

   只有方法定义声明,无方法体的方法称为抽象方法,需要使用abstract修饰。

语法格式:

修饰符 abstract 返回值类型 方法名([参数列表]);

抽象类:

   含有抽象方法的类肯定是抽象类,必须被abstract修饰。

2、特征:

   成员变量:同普通类的成员变量。

   成员方法:可以是普通成员方法,也可以是抽象成员方法。

   抽象类不能实例化:抽象类的子类必须重写父类的抽象方法,并提供方法体,若没有重写全部的抽象方法,仍是抽象类。

3、总结:

  抽象类成员同普通类成员,并且可以有抽象方法,也可以没有抽象方法(限制使用new创建对象).

抽象类的注意事项:

   abstract不能修饰成员变量和常量。

   bastract不能和final,static,private修饰符一起使用。

   final:修饰符,最终的,最后的,定型的。

     (1)可以修饰成员变量,成员一旦赋值就不能被修改。

     (2)可以修饰成员方法,这个方法不能被修改。

     (3)可以修饰类,被修饰的类就是最终的类,不能被继承(不让子类重写其功能)


1、接口定义:

      当某个体系的向上抽取的共性数据全部是抽象的成员声明(规范,标准)称为接口,java中将接口用interface来表示(特殊的类)

广义的接口概念:对外暴露的规范和标准。

2、特征:

     接口用关键字:interface表示。       interfact  接口名{.....}

     子类实现接口用:implements表示。    class 子类名 implements  接口名{....}

2.1、接口不能实例化:

     按照多态的方法来实例化,即为让接口的子类指向接口引用。

2.2、接口中成员的特点:

      接口的成员属性全部是public   static  final 修饰的常量,成员方法全是抽象方法。以上的修饰符的可以省写(不建议,阅读性差)

注意:jbk1.8版本后接口中可以使用default修饰符的非抽象默认方法,用于扩展新接口功能,同时保留原有的接口的功能。

3、接口的子类:

    可以是抽象类,但意义不大。

    可以是具体类,要重写接口中的所有抽象方法。(推荐使用)

    类和接口是实现关系,子类可以使用implements多个实现。(同时实现多个接口)

    子类在继承和实现同时存在,要先extends父类,然后implements实现接口。

4、接口的意义:

     是用于对外提供扩展功能使用的(不是体系固有的功能)


1、多态的定义

     事物表现出来的多种形态,编译和运行时表现的形态不一样,这种现象称为多态。

2、多态表现形态

      父类型  引用变量 = 子类对象

      接口类型  引用变量 = 子类对象

3、多态的执行特点

    编译期:向上造型,编译期看多态左侧是否有对应成员(成员属性和成员方法)有则编译通过,无则不用报错。

   运行期:向下造型,运行时

              成员变量:看多态左侧

              成员方法:看多态右侧

总结:

   成员变量:编译看左侧,运行看左侧。

  成员方法:编译看左侧,运行看右侧。

package animls;
    abstract  class animal{
        String name="小黑";
        public abstract void call();//叫声的抽象方法,没法明确是什么动物叫
        //public abstract void eat();//吃的抽象方法,没法明确是什么动物吃
        public String getName() {
            return name;
        }
        public void setName(String name){
            this.name=name;
        }
        public void eat(){//吃的方法
            System.out.println("动物什么都吃");
        }
    }
     class Cat extends animal implements A,B{
        String name="小白";
        @Override
        public void call() {
            System.out.println(super.name+"喵喵叫");
            System.out.println(this.name+"喵喵叫");
        }

        @Override
        public void eat() {
            System.out.println(name+"的猫正在吃鱼");
        }
        public void DaiMa(){//自己特有的功能
            System.out.println(name+"正在敲代码");
        }
        @Override
        public void Game() {
            System.out.println(name+":打游戏");
        }

        @Override
        public void TingYinLe() {
            System.out.println(name+"正在听音了");
        }
    }
    interface A{
        abstract public  void Game();//打游戏的能力
    }
    interface B{
        abstract public  void TingYinLe();//听音乐的能力
    }

public class Lconog {
    public static void main(String[] args) {
        animal xb = new Cat();
        System.out.println(xb.name);//多态变量:编译看左侧,运行也看左侧。
        xb.eat();//多态方法:编译看左侧,运行看右侧。
        ((Cat)xb).eat();//向下转型
       // xb.DaiMa(); /*为什么这个就没法运行,因为animal左侧没有,这个方法,所以编译失败*/

    }
}

你可能感兴趣的:(java初学者,java,jvm,开发语言)