栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java语法-特殊类(抽象类、接口、内部类)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java语法-特殊类(抽象类、接口、内部类)

1)抽象类和接口

package AbstractClass;

public class AbstractClass {
    public static void main(String[] args) {
        // 抽象类 父类抽象设计 不能创建实例
        // abstract 修饰类 不可创建实例
        // 修饰方法 没有实现 子类非抽象类必须实现
        // 抽象类 不一定有 抽象方法,有抽象方法的一定的抽象类或接口
        // 匿名类 对象(匿名内部类)
        new Person(){
            @Override
            public void abstractDoing() {
                System.out.println("abstractDoing");
            }

            @Override
            public void do1() {

            }

            @Override
            public void do2() {

            }
        }.abstractDoing();
        // 设计模式之一:模板方法,已经定义了执行流程,实现声明的对应方法
        Person p = new Man();
        p.doAll();


        // 接口 interface 类不可多继承,接口多实现
        // 接口中不能有实例方法
        // 全局常量 public static final
        // 抽象方法 public abstract
        // jdk8 静态方法 默认方法
        // 打破了单继承局限性
        // 匿名接口实现类 对象
        // 区分默认方法冲突问题 this.子类方法 super.父类方法 接口名.super.接口方法
        new CanDoAble(){
            @Override
            public void do1() {
                System.out.println("do1");
            }

            @Override
            public void defaultDo() {
                CanDoAble.super.defaultDo();
            }
        }.defaultDo();
        // 设计模式之一:代理模式,另一个类实现对象接口,创建代理对象调用被代理对象处理
        CanDoAble obj = new CanDo();
        CanDoAble proxy = new CanDoAble() {
            @Override
            public void do1() {
                // 代理
                obj.do1();
            }
        };
        // 设计模式之一:工厂模式,工厂类方法获取对象 简单工厂
        Factory.createCanDo();
        Factory.createAnotherCanDo();
        // 工厂方法 工厂和产品作为接口 有新的实现就定义新的实现类
        // 抽象工厂 相比较工厂方法 有更多创建方法 更多的产品接口
        // 反射-工厂 将产品信息定义在配置中 无产品限制的工厂 Spring框架的核心


        // 变态题 区分继承属性和接口属性
        // super.继承属性 接口.接口属性
        // 接口多实现出现完全一致的抽象方法不会报错

        // 比较:抽象类定义抽象事物,如动物;接口定义抽象行为,如会飞的。
    }
}
// 抽象类
abstract class Person{
    // 不能创建实例 提供给子类实例初始化
    public Person(){}

    // 声明抽象方法 实例相关的 子类非抽象类就必须实现方法
    abstract void abstractDoing();

    // 抽象类可以有实现方法
    public void doing(){
        System.out.println("implement");
    }

    public void doAll(){
        this.do1();
        this.do2();
    }
    public abstract void do1();
    public abstract void do2();
}
// 抽象类子类
class Man extends Person{
    // 访问权限 >= 声明
    @Override
    public void abstractDoing() {
        System.out.println("man doing");
    }

    @Override
    public void do1() {
        System.out.println("do1");
    }

    @Override
    public void do2() {
        System.out.println("do2");
    }
}
// 接口
interface CanDoAble{
    // public static final 可省略
    public static final int i = 1;
    // public abstract 可省略
    public abstract void do1();
    // public 可省略
    public static void doSome(){

    }
    // public 可省略 实现子类实例可用
    public default void defaultDo(){
        System.out.println("defaultDo");
    }
}
// 接口实现类
class CanDo implements CanDoAble{

    public CanDo(){
        System.out.println(CanDo.this);
        //CanDo.super //Object
        //CanDoAble.super //CanDoAble
    }

    @Override
    public void do1() {

    }

    @Override
    public void defaultDo() {
        CanDoAble.super.defaultDo();
    }
}
// 工厂类
class Factory{
    public static CanDoAble createCanDo(){
        return new CanDo();
    }
    public static CanDoAble createAnotherCanDo(){
        return new CanDoAble() {
            @Override
            public void do1() {
                System.out.println("another do1");
            }
        };
    }
}

2)内部类

package InnerClass;

import java.io.Serializable;

public class OuterClass {
    public static void main(String[] args) {
        // 内部类 定义在类中的类
        // 成员内部类:成员位置
        // 局部内部类:局部位置
        // 局部内部类 无修饰符
        class Temp{
            public void hello(){
                System.out.println("hello");
            }
        }
        new Temp().hello();

        // 成员内部类使用
        // 静态
        OuterClass.Sinner s = new OuterClass.Sinner();
        // 实例
        OuterClass.Inner i = new OuterClass().new Inner();
        i.doSome();

        // 局部内部类:通常用于匿名创建对象参数传递,使用lambda表达式简写
        // 成员内部类:对此理解要区分 类对象 和 实例对象
        // 执行程序时,外部类加载了,static成员被加载,
        // 因此有了类对象之后,即可使用static成员,创建外部类对象,和静态的内部类对象,
        // 正如可以访问静态方法和属性一样
        // 创建外部类实例之后,可见实例成员,如属性,方法,实例代码块,实例内部类结构,
        // 所以可以使用实例this来new实例内部类
        // 反过来,获得静态内部类实例,与外部类实例毫无关系
        // 获得实例内部类对象,必定有外部类实例,所以可以访问外部实例内容
        // 理解(实质不保证,只保证理解):
        
    }


    static int sa;
    private int a = 1;
    // static final abstract 可修饰
    // 静态成员类 只能访问外部类静态属性
    static class Sinner{
        private int a;
        public void doSome(){
            int sa1 = OuterClass.sa;
            // 获取this的完整办法
            // OuterClass.Sinner.this
            // Object
            // OuterClass.Sinner.super
        }
    }
    // 实例成员类 能访问外部类实例
//    public class Inner{
//    class Inner{
//    protected class Inner{
    private class Inner implements Serializable {
        private int a = 2;
        public void doSome(){
            // 区分内部类实例与外部实例
//            Inner.this
//            OuterClass.this
            int a1 = OuterClass.this.a;
            int a2 = OuterClass.sa;
            System.out.println(this.a);             // 2
            System.out.println(OuterClass.this.a);  // 1
            // 获取this的完整办法
            System.out.println(Inner.this.a);
            System.out.println(OuterClass.this.a);
            // Object
//            Inner.super
//            OuterClass.super
        }
    }

    public void doSome(){
        // 外部类把内部类作为结构,创建对象使用
        new OuterClass.Sinner().doSome();
        // 对象可见实例内部类结构,创建实例使用
        OuterClass.this.new Inner();

    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/999219.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号