抽象类 and 接口

目录


抽象类

一个类,如果有抽象方法(没有方法体),则该类必须被限定为抽象类(abstract);当然,我们也可以创造出一个没有任何抽象方法的抽象类,仅仅是我们不想它产生对象;

抽象类中,依然是有构造器的,只是我们不能创造对象 ;但是,它跟普通类并没有多大区别,比如,抽象类可以有静态方法,我们也可以直接通过类名使用它的静态方法 ;

跟普通类,其实没差,就多了一项:可以用抽象方法 ;


抽象类的方法的权限;

上文讲了,其实抽象类跟普通类,没差,就多了一项:可以用抽象方法 ;

那么,抽象类的域和方法的权限,基本 就像普通类那样,根本就没啥特别的,没有啥 默认权限,不像下面的接口那样,总有一些默认的权限,烦的一比 !

唯一需要注意的,就是有的权限不能和 abstract 一起用

  1. private 因为 抽象方法 需要被子类重写,而定义为私有,子类访问不到,将无法重写。
  2. static 因为定义为 static 可以通过类名直接调用该方法,而 抽象方法 连方法体都不存在,更谈不上被调用执行了。
  3. final 因为 final 修饰的方法只能被继承,不能被覆盖,而 抽象方法 必须被覆盖。
  4. 我们发现 ,限定都在 abstract 上,而 abstract 只能修饰方法,不能修饰 字段,因此,抽象类 的权限,完全跟普通类一样;

只要把上面的几点想明白,就不用去死记那些权限 ;


接口

抽象类,是可以部分抽象;那接口就是完全抽象,不允许提供任何方法体 ;

一个类实现了某个接口,是允许向上转型为接口类型的,这样,就可以实现 java多继承 了, 因为,java 里面虽然不能直接多继承,但是可以通过实现多个接口,达到多继承的目的 ;

由于接口,本身就是需要类来实现的;多个类,可以实现同一个接口,因此接口可以看做是类与类之间建立的协议 ;


接口中的方法的权限;

接口中可以包含域;所有的域都是隐式的被指定为 public、static、final

而接口中的方法,默认是 public、abstract 权限的;

并且由于接口中没有方法体,方法都需要类来实现,因此,接口中的方法,不能是 final 权限,因为 final 权限,代表不可以覆盖,而接口中方法,必须覆盖 ;

而接口中东西,都是需要被其他类访问到,因此,不能有 private

算了,记住好了 ;

接口本身自己,有两种修饰权限:可以在前面加上 public,那么就可以跨包访问;如果不加 public,则为包访问权限 ;

对了,接口中不能有 空白final


实现多个接口

实现多个接口的时候,可以向上转型为其中任意一个接口 ,给我们很大的灵活性 ;

实现多接口的时候,当多个接口中有相同方法签名的方法时,实现类只需要 实现一个即可

这样有一个小问题,就是实现多个接口的时候,如果有方法的方法签名一样,但是返回值不同;是无法直接区分这样的情况的,需要使用一定的技巧,内部类 来完成这样的操作 ;


接口继承

在接口继承体系中,一样的方法,只看做一个 ;


接口嵌套

  • 类中嵌套接口把它当做类的成员变量即可,访问权限跟普通成员变量一致 ;

    当接口被修饰为 private 的时候,该接口只能在本类中实现,并且实现的类,只能本在类中使用 ;

        public class Test1 {
            // 修饰为 private
            private interface MyTest{
                void print();
            }
    
        //    不能在外部实现该接口
            class MyTestImpl implements MyTest{
    
                @Override
                public void print() {
                    System.out.println("aha !");
                }
            }
    
    
            @Test
            public void test() {
                new MyTestImpl().print();
            }
        }
    
    
    

  • 接口与接口之间嵌套

    一个类实现的接口, 假如这个接口中嵌套了其他接口,嵌套的接口 中的方法是不需要实现的

    public interface BB {
    
        public interface AA{
            void mmm() ;
        }
    
        void sss();
    }
    
    -------------------------------------------
    
    class BBimpl implements BB{
    
        @Override
        public void sss() {
            System.out.println("ssss");
        }
    }

猜你喜欢

转载自blog.csdn.net/youngyouth/article/details/80312826