抽象类、内部类和接口

本文详细介绍了面向对象编程中的核心概念,包括抽象类的定义和作用,抽象方法如何用于让子类重写,以及抽象类的特性。同时,讨论了接口作为更高程度抽象的特性,如接口中只有抽象方法和常量属性。最后,探讨了内部类的不同类型,如成员内部类、局部内部类和匿名内部类,并展示了它们的创建和使用方式。这些内容对于理解和应用面向对象编程至关重要。
摘要由CSDN通过智能技术生成

抽象类

什么是抽象类和抽象方法

在子类和父类中,有些父类中的方法的存在仅仅是为了让子类重写,实际上从不会调用,这时就可以用abstract关键字将它定义为抽象方法,其父类也用abstract修饰,成为抽象类。例如下面的例子:

public abstract class Animal{//存放抽象方法的类叫做抽象类,也要用abstract修饰
	int age;
	public abstract void eat();//在实际运用在,父类中的吃这个方法存在的目的仅仅是让子类重写,所以用abstract修饰成抽象方法
}
public class Dog{
	public void eat(){
	System.out.println("狗吃肉");
	}
}
public class Cat{
	public void eat(){
	System.out.println("猫吃鱼");
	}
}

抽象类的特点

  1. 抽象类中不一定有抽象方法,有抽象方法的类必须是抽象类
  2. 抽象方法中可以有普通方法
  3. 抽象类不能够实例化,但抽象类中依旧有构造方法
public abstract class Animal {
    int age;
    public void run(){//抽象类可以有普通方法,因为它可以被子类继承
        System.out.println("向前跑");
    }
    public abstract void eat();
}
public class Dog extends Animal{
    public void eat(){//重写父类的抽象方法
        System.out.println("狗吃肉");
    }
}
public class Test6 {
    public static void main(String[] args) {
        //Animal a=new Animal();    报错
        Dog d=new Dog();
        d.age=4;
        d.run();//子类Dog对象d调用继承自父类的普通方法
        d.eat();//子类Dog对象d调用重写父类的抽象方法
    }
}

接口

什么是接口

接口是不同于类的一个新的东西,它用interface关键字来定义,接口的功能和抽象类相似,但它比抽象类的抽象程度更高

public interface Demo{//定义一个接口
}

接口的特点

  1. 接口中只有抽象方法
  2. 接口不能创建对象
  3. 子类实现接口需要重写接口中的所有抽象方法
  4. 接口中的属性只有常量
public interface Demo{
	public static final int COUNT=10;//接口中只有常量,即使不写,也会默认存在public static final
	public abstract void method();//方法前默认有public abstract
	/*public void method1(){	报错,接口中只能有抽象方法,不能有任何带方法体的方法
	}*/
}
public class Demo1 implement Demo{
	public void method(){
		System.out.println("重写接口的抽象方法");
	}
}
public class Test{
	public static void main(String[] args){
		//Demo d=new Demo();	报错,接口不能创建对象
		Demo1 d=new Demo1();
		System.out.println(d.COUNT);//用子类对象调用接口中的常量属性
		System.out.println(Demo.COUNT);//也可以用接口名调用其常量属性
	}
}

内部类

成员内部类

定义位置

成员内部类定义在类的内部,方法的外部。

调用方式

在主方法中创建类的对象,通过对象调用类中的变量方法

对象的创建格式

假设成员内部类B定义在类A中,想要创建B的对象,因为B定义在A中,不能直接“看见”,所以要先创建A的对象,通过A来创建B的对象

A a=new A();
A.B b=a.new B();
两条语句可以合成一条语句
A.B b=new A().new B();

局部内部类

定义位置

局部内部类定义在方法的内部

调用方式

局部内部类定义在方法里面,因此也只能在方法里面调用

对象的创建格式

和普通类的创建格式一样

匿名内部类

匿名内部类的应用场景是:有一个接口,没有子类实现,在主方法中实现这个接口时就用到了匿名内部类
定义格式:假如有一个接口A

new A(){//new表示创建一个对象,()表示接口中的抽象方法
	public void method(){//重写接口A中的抽象方法
	}
};//这是条语句,所以用分号结尾

综合例子:

public class Demo5 {
    public class Inner{//若public改为private,Inner类是私有的,那么在Test5中通过Demo5类创建Inner对象时就会报错
        int a=20;
        public void method(){//若public改为private,这个方法是私有的,那么在Test5类中调用该方法就会报错
            System.out.println("成员内部类");
        }
    }
    public void method(){
        class Inner{
            int a=30;
            public void method(){
                System.out.println("局部内部类");
            }
        }
        Inner a=new Inner();//局部内部类只能在方法中创建对象和使用,因为局部内部类在方法内部,开始和结束都是跟随着方法
        a.method();
    }
}
public interface Demo5_1 {
    public abstract void method();//public abstract即使不写也会默认存在
    int COUNT=10;
}
public class Test5 {
    public static void main(String[] args) {
        Demo5 d=new Demo5();
        Demo5.Inner a=d.new Inner();//创建成员内部类的对象,因为成员内部类封装在类中,所以要先创建该类的对象,再通过该类创建成员内部类对象
        a.method();
        System.out.println(Demo5_1.COUNT);
        Demo5_1 d1;
        d1=new Demo5_1(){
            public void method(){
                System.out.println("匿名内部类");
            }
        };//new Demo5_1(){};是一条语句,所以加分号
        method(d1);
    }
    public static void method(Demo5_1 d1){
        d1.method();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值