抽象类、接口、匿名内部类

本文详细介绍了Java中接口与抽象类的区别,包括方法权限、变量类型和继承方式等。同时,讨论了Java8引入的接口新特性,如静态方法和默认方法的使用。此外,还深入探讨了内部类的概念,包括成员内部类、局部内部类以及匿名内部类的创建和应用场景,展示了如何在实际编程中灵活运用这些概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、接口和抽象类区别

2、java8中接口的新特性

3、内部类


1、接口和抽象类区别

        1.1、抽象类可以存在普通成员函数,接口只能存在public abstract方法(省略系统会默认添加)

        1.2、抽象类中的成员变量可以是各种类型的,接口只能是public static final类型的(省略系统会默认添加)

        1.3、抽象类单继承,可以实现多个接口。接口多继承        

        1.4、抽象类不能被实例化,只能用来继承。抽象方法没有方法体,必须被子类实现

2、java8中接口的新特性

        除了定义全局变量和抽象方法外,还可以定义静态方法和默认方法

        2.1、接口中定义的静态方法(使用static修饰)只能通过接口来调用

        2.1、接口中定义的默认方法(使用default修饰)只能通过实现类的对象调用

3、内部类

        定义:将一个A声明在另一个类B中,类A称为内部类,类B称为外部类

        3.1、成员内部类(静态、非静态),

                3.1.1、可以调用外部类的结构。调用外部类属性:B.this.属性名

                3.1.2、静态成员内部类创建:B.A a = new B.A();

                3.1.3、非静态成员内部类创建: B b = new B;        B.A a = b.new A();

        3.2、局部内部类(类在方法体、代码块内、构造器内)

                常见场景:

 方式一:
       public 接口  a() {
           class b implements 接口{
                 @Override
                       重写的方法;
        }
           retrun b;
}

方式二:匿名内部类写法
/*
注意接口是不能被new的,这里new 接口()时后面接了{},这种写法
实际上时new了一个实现接口的匿名内部类,
new 接口(){} === class 类名 implements 接口()
*/
        public 接口  a() {
             return  new 接口() {
                    @Override
                    重写的方法;
} 

        3.3、匿名内部类

                定义:没有名字的内部类,只能使用一次。

                前提条件:必须继承一个父类或者实现一个接口

                3.3.1、使用抽象类举例:不使用内部类用法

abstract class Person {
    public abstract void eat();
}
 
class Child extends Person {
    public void eat() {
        System.out.println("eat something");
    }
}
 
public class Demo {
    public static void main(String[] args) {
        Person p =new Child();
        p.eat();
    }
}

                3.3.2、使用匿名内部类写法(直接将抽象类Person中的方法在大括号中实现了)

abstract class Person {
    public abstract void eat();
}
 
public class Demo {
    public static void main(String[] args) {
        Person p =new Person() {
            public void eat() {
                System.out.println("eat something");
            }
        };
        p.eat();
    }
}

                3.3.3、在接口上使用匿名内部类

interface Person {
    public void eat();
}
 
public class Demo {
    public static void main(String[] args) {
        Person p = new Person() {
            public void eat() {
                System.out.println("eat something");
            }
        };
        p.eat();
    }
}

                3.3.4、常见场景多线程Thread类或者Runable接口写法

                Thread类匿名内部类实现(因为继承thread类才能创建线程,符合匿名内部类前提条件)

public class Demo {
    public static void main(String[] args) {
        Thread t = new Thread() {
            public void run() {
                for (int i = 1; i <= 5; i++) {
                    System.out.print(i + " ");
                }
            }
        };
        t.start();
    }
}

                  Runnable接口的匿名内部类实现(符合匿名内部类前提条件)

public class Demo {
    public static void main(String[] args) {
        Runnable r = new Runnable() {
            public void run() {
                for (int i =1; i <=5; i++) {
                    System.out.print(i +" ");
                }
            }
        };
        Thread t =new Thread(r);
        t.start();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值