面向对象之抽象类内部类

Posted scanner小霸王

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象之抽象类内部类相关的知识,希望对你有一定的参考价值。

1.抽象类(抽象类的本质还是类)

在这里插入图片描述

2抽象类和接口的区别

a)两者都不能直接实例化,对于抽象类:如果抽象类要实例化,那么抽象类定义的变量必须指向一个子类对象,子类需要继承抽象类的所有抽象方法;对于接口,定义的变量要指向一个子类对象,这个子类必须实现了这个接口所有的方法。
b)接口只能方法声明,抽象类可以方法的声明或者实现。
c)抽象类需要被子类继承,接口需要被子类实现
d)抽象类所有抽象方法都需要被实现,如果不能全部实现,子类也需要是抽象类;
e)抽象类里面可以没有抽象方法
f)类中有抽象方法,那么这个类一定是抽象类
g)抽象类方法都要被实现,所以抽象类是不能是静态的static,也不能是私有的private
h)接口可以实现接口,或者继承实现多个接口,而类只能继承一个抽象类。

3.内部类(4种)

a)局部内部类
在这里插入图片描述
ii)局部内部类是定义在外部类的局部位置,
可以直接访问外部类的所有成员,包括私有;
ii)不能添加访问修饰符(相当与局部变量),但可以加final修饰符
ii)作用域仅仅在当前方法内或者代码块内
ii)内部类可以直接访问外部类的成员
ii)外部类可以创建内部类的实例,在进行访问进行
在这里插入图片描述

 //局部内部类
    public void OutTest(){
        class InClass{
            public InClass(){
                System.out.println("内部类的构造方法");
            }
            public void InTest(){
                System.out.println("内部类");
            }
        }

        new InClass();
    }

b)匿名内部类
ii)本质是类
ii)内部类
ii)没有名字
ii)还是一个对象
ii)不能添加修饰符,因为相当是个局部变量
ii)内部类访问的时候,遵循就近原则,
在这里插入图片描述

ii)内部类访问外部类的成员变量

外部类的名字.this.变量
在这里插入图片描述

例子:
在这里插入图片描述
在这里插入图片描述

//匿名内部类
    public void niMingTest(){
        person p = new person(){
            @Override
            public  void eat() {
                System.out.println("person--eat");
                System.out.println(OutClass.this.outName);
                OutClass outClass = new OutClass();
                System.out.println(outClass.outName);
            }
        };
        p.eat();
    }

c)成员内部类(相当于类的某个成员)
ii)可以访问类的所有成员
例子:
在这里插入图片描述
ii)可以有修饰符

ii)外部类访问内部类
内部类 a = new 内部类(),直接创建对象调用

ii)外部其他类访问成员内部类
第一种:
在这里插入图片描述
主方法

public class OutOtherClass {
    public static void main(String[] args) {
        OutClass outClass = new OutClass();
        OutClass.ChengYuanClass chengYuanClass = outClass.new ChengYuanClass();

    }
}

在这里插入图片描述

第二种方式:
外部类中有访问内部类的方法
在这里插入图片描述
d)静态内部类
说明:定义在外部类的成员位置,并且static 修饰
ii)可以直接访问外部的静态成员
ii)外部类访问静态内部类(和成员内部类相同)

(StaticClass 静态内部类,OutClass外部类)
StaticClass staticClass = 
new OutClass.StaticClass();

ii)外部其他类访问静态内部类(两种方式)
在这里插入图片描述
地位相当于类的成员(静态类不能通过new获取,static修饰的只能加载一次,而new 代表可以多次创建)
在这里插入图片描述
静态内部类 vs 成员内部类
1)静态内部类相对与外部类是独立存在的,在静态内部类中无法直接访问外部类中静态变量、静态方法;但可以通过创建对象来访问
在这里插入图片描述

2)静态内部类如果要访问的话,必须要new一个外部类的对象,使用new出来的对象来访问。但是可以直接访问静态的变量、调用静态的方法;
在这里插入图片描述

普通内部类作为外部类一个成员而存在,在普通内部类中可以直接访问外部类属性,调用外部类的方法。
在这里插入图片描述

4枚举

a)构造私有话,目的防止 直接 new
b)去掉setXXX方法,防止被修改
c)在类内部, 直接创建固定对象
d)优化:可以加上 final
在这里插入图片描述
e)如果将class 改为enum,上述代码中的
public static final Season SPRING = new Season(“春天”,”温暖“);
改为 SPRING (“春天”,”温暖“);
ii)如果使用enum来实现枚举,要求常量对象要写在前面
在这里插入图片描述
ii)如果使用无参构造器,可以直接****,例如
BOY,GIRL都是调用Gender的无参构造器
在这里插入图片描述

public enum  Season {

    BOY,
    GIRL("mary");
    Season(){

    }
    String name;
     Season(String name){
        this.name = name;
    }

    public void turn(){
        System.out.println("季节变化");
    }

}
class TestClass{

    public static void main(String[] args) {
        System.out.println(Season.BOY.name);
        Season.BOY.turn();
        System.out.println("---");
        Season.GIRL.turn();
    }
}

5基本的注解说明

在这里插入图片描述

6.元注解:修饰注解的注解

在这里插入图片描述

以上是关于面向对象之抽象类内部类的主要内容,如果未能解决你的问题,请参考以下文章

JAVA07 面向对象(高级)类变量类方法代码块final抽象类接口内部类

JAVA07 面向对象(高级)类变量类方法代码块final抽象类接口内部类

JAVA07 面向对象(高级)类变量类方法代码块final抽象类接口内部类

面向对象--01--类属性方法static代码块抽象类接口内部类

C++之面向对象的三个基本特征

浅谈面向对象之封装继承多态!如何使用内部类模拟多继承