JAVA抽象类、接口及内部类

JAVA抽象类、接口及内部类

抽象类

1、抽象类定义

  • 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。
  • 抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
  • (1)abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。
    (2)在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法。
    (3)实现抽象类必须实现其中的所有抽象方法(非抽象方法)。抽象类中可以有非抽象方法。
    (4)抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

2、抽象类实现

public abstract class person {

    String property = "属性";

    public abstract void run_01();

    void run_02(){
        System.out.println("程序运行");
    }

}
class Myperson extends person{

    @Override
    public void run_01() {

    }
}

接口

1、接口定义

  • 接口是一种约束形式,其中只包括成员定义,不包含成员实现的内容。
  • Java里面由于不允许多重继承,所以如果要实现多个类的功能,则可以通过实现多个接口来实现。
  • 接口声明的方式与声明类的方式相似,但使用的关键字是interface,而不是 class。
  • 接口只包含方法、属性、索引器和事件的签名。方法的实现是在实现接口的类中完成。

2、接口成员定义

  • 与类成员的定义相似。
  • 不允许使用访问修饰符(private,protected 或 internal),所有的接口成员都必须是公共(public)的。
  • 接口方法不能包含代码实体。
  • 接口成员不能定义变量;但可以通过public static final关键字(可以省略关键字)来定义常量。
  • 接口成员不能用关键字virtual,abstrac t或 sealed 来定义。

3、接口实现

public interface InterFace {

    public static final String PROPERTY_01 = "属性";
    String PROPERTY_02 = "属性"; //省略关键字。

    public abstract void run_01();
    void run_02(); //默认接口成员都是public,且public abstract可以省略。
}


class MyInterFace implements InterFace{

    @Override
    public void run_01() {
        
    }

    @Override
    public void run_02() {

    }
}

抽象类和接口联系及区别

  • abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface。
  • 在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是public static final的,不过在 interface中一般不定义数据成员),所有的成员方法默认都是public abstract的。
  • abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。
  • 实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。
  • 接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。
  • 抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

内部类

1.内部类定义

  • 内部类(Inner Class),是 Java 中对类的一种定义方式,是嵌套类的一个分类,即非静态嵌套类(Non-Static Nested Class)。内部类(非静态嵌套类)分为成员内部类、局部内部类和匿名内部类三种。
  • Java 编程语言允许一个类被定义在另一个类中,这样的类就称为嵌套类。嵌套类分为两种:静态的和非静态的。没有用 static 关键字来声明的嵌套类,就称为非静态嵌套类。非静态嵌套类,又称为(成员)内部类。内部类还有两个特殊的类型:局部(内部)类(Local Class)和匿名(内部)类(Anonymous Class)。
  • 包含嵌套类的类,可称为外围类(Enclosing Class)或外部类(Outer Class)。非静态嵌套类(内部类)可访问其外围类的其他成员,即使这些成员被声明为私有的。若内部类作为其外部类的成员,则它可声明为 private、public、protected 或包私有的。
  • 提示:外部类只能声明为 public 或包私有的。

2、内部类实现

(1)成员内部类(内部类)
  • 通过外部类实例化对象调用并创建内部类实例对象
//外部类
public class Outer {
    private String property ="属性";

    public String getProperty() {
        return property;
    }

    public void setProperty(String property) {
        this.property = property;
    }

    public void out(){
        System.out.println("这是外部类");
    }
    //内部类,相当于类中属性
    public class Inner{
        public void in(){
            System.out.println("这是内部类");
        }
        //内部类获取外部类私有属性
        public void getProperty(){
            System.out.println("获得外部类属性"+property);
        }
    }

    public static void main(String[] args) {
        //外部类实例化对象
        Outer out = new Outer();
        //通过外部类对象调用并创建内部类对象
        Outer.Inner in = out.new Inner();
        in.getProperty();
    }

}
(2)局部内部类(局部类)
  • 在方法中实例化对象,仅在本方法有效
//外部类
public class Outer {
    private String property ="属性";

    public void out(){
        System.out.println("这是外部类");
    }

    public void Inner(){
        //局部内部类,相当于方法中属性
       class Inner{
           public void out(){
               System.out.println("这是内部类");
           }
           public void getPorperty(){
               System.out.println("获取外部类私有变量"+property);
           }
       }
       //在方法中实例化对象,仅在本方法有效
       Inner in = new Inner();
       in.getPorperty();
    }

    public static void main(String[] args) {
        //外部类实例化对象
        Outer out = new Outer();
        out.Inner();
    }

}
(3)匿名内部类(匿名类)
  • 外部类实例化对象,并创建匿名内部类,匿名内部类继承外部类,用于重写外部类(父类)方法,常见于抽象类和接口。
//外部类
public class Outer {
    private String property ="属性";

    public void out(){
        System.out.println("这是外部类");
    }

    public static void main(String[] args) {
        //外部类实例化对象,并创建匿名内部类,匿名内部类继承外部类,用于重写外部类(父类)方法,常见于抽象类和接口
        Outer out = new Outer(){
            @Override
            public void out() {
                System.out.println("这里是匿名内部类");
            }
        };
        out.out();
    }

}
(4)lmabda表达式(内部类特殊简化)
  • 只能用于函数式接口
public class Outer {
    public static void main(String[] args) {
        //lmabda表达式
        InterFace_01 interface_01 =()->System.out.println("这里是lmabda表达式");
        interface_01.run();
        InterFace_02 interface_02 =(str)->System.out.println("这里是lmabda表达式:"+str);
        interface_02.run("你好");
    }
}
//函数式接口,只含有一个抽象方法
interface  InterFace_01{
    public abstract void run();
}
interface InterFace_02{
    public abstract void run(String str);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值