Java学习——面向对象(三)抽象类/接口/内部类

本文详细介绍了Java中的抽象类、接口和内部类。抽象类作为有抽象方法的类,用于定义共性行为,不提供实例化;接口用于规定实现特定功能的契约,可以多继承;内部类提供了封装和访问特性,包括成员、局部、静态和匿名内部类,具有直接访问外部类成员的特性。

抽象类

1、概述

比如动物来说,它并不是一个具体的事物,只是一个抽象的概念,只有具体到真正的一个个体,比如到猫、狗,这样才算是具体的动物,理解了这句话,我们理解抽象类就不难了。

抽象类就是将一个笼统范围内的不同个体的行为给出具体的体现,比如猫和狗的睡觉方式不一样,那么我们一个大的动物类里面可以只给出一个关于睡觉的声明,而由猫、狗的具体类去填充他们自己的特有行为。

在Java中,一个没有方法体的方法,可以定义为抽象方法,而类中有抽象方法,这个类就必须是抽象类,但是抽象类中也可以有别的方法,这二者不是相互的。

2、格式
格式:

 abstract class 类名 {}

 abstract 修饰符 返回值类型 方法名(参数列表);

abstract就是抽象修饰符

没有方法体,与大括号不共存
3、抽象成员
  1. 成员变量
    可以是常量也可以是变量,没有要求

  2. 构造方法
    抽象类含有构造方法,但是它的构造方法不能实例化,只是为了让子类可以通过构造方法访问该抽象类。

  3. 成员方法
    4可以有抽象方法,也可以由其他方法,提高了代码的复用性。

4、特点
  1. 有抽象方法的一定是抽象类,但是抽象类不一定有抽象方法。
  2. 抽象类按照多态的方式由子类进行实例化。
  3. 抽象类的子类要是抽象类就是普通的继承,如果不是抽象类,那么 必须重写抽象类中所有的抽象方法。
  4. 抽象类不可以用final修饰,final与abstract是不共存的。
  5. 抽象类的抽象方法:用于限定子类必须完成某些动作
  6. 抽象类的非抽象方法:用于提高代码的复用性
5、举例
abstract class Worker  //抽象类
{  
    private String name;  //成员变量
    private int age;  
    Worker(String name,int age,int id)  //构造方法
    {  
        this.name =  name;  
        this.age =  age;  
    }  
    void show()  //成员方法
    {  
        System.out.println("Name :" + name + ";Age :"+age); 
    } 
abstract void work();//由于不同的人员的工作不同 无法确定如何工作,所以使用抽象方法,注意抽象方法没有大括号。
}  
class Manager extends Worker  //子类继承抽象类
{  
    Manager(String name,int age)  
    { 
        super(name,age); //调用有参构造方法
    }  
    void show()  //重写所有方法
    {  
        super.show();  
    }  
    void work()  //重写所有方法
    {  
        System.out.println("Just sleep!");  
    }  
}  
class Test  
{  
    public static void main(String []args)  
    {  
        Manager m = new Manager("zhangsan",20); //实例化对象,括号里面传入有参构造方法的参数
        m.show();  //调用方法
        m.work();  
    }  
}

接口

1、概述

上面讲过抽象类就是具体到一个个小猫小狗,但是没个小猫小狗也都不一样,有导盲犬,宠物犬,搜救犬等等,那么这些特殊的行为,就需要用到接口这个概念,这是Java中提供的实现额外功能的一个部分,并不给出具体实现,有哪些个体需要具备特殊行为,就让他们来实现接口。

2、格式
interface  接口名{}//创建接口

class 类名  implements 接口名//实现接口
3、特点
  • 成员变量
    只能是常量,不可以设为private和protected

  • 构造方法
    接口没有构造方法

  • 成员方法
    在 jdk1.8之前,接口中必须是抽象方法,但是在1.8版本之后,接口中可以存在有方法体的成员方法,但是必须由static或者default修饰,如果在1.8之后,你没有定义类型,例如public void Max();系统会默认为是抽象方法,调用时要注意。

  • 接口不能实例化,想要完成实例化,也要通过子类实例化去调用,也是多态的一种体现。

  • 实现接口的类,就是用implentments表示的类,可以理解为是接口的子类,但是只是理解,跟继承是不一样的,实现接口的类,要么是抽象类,要么就重写所有接口中的抽象方法。

  • 一个类可以实现多个接口,但是接口不可以实现接口,只能继承,并且接口支持多继承。

4、举例
interface Fly { //接口
 public static final int a = 100;
 int b = 20;        //必须是常量
 void fly();         //默认是抽象方法
 static void eat() {            //成员方法
   System.out.println("吃的很香");
 }
 default void sleep() {
   System.out.println("睡的不咋地");
 }
}
interface FlyFly extends Fly   //接口继承接口
}
class FlyMan implements Fly{        //实现接口
 @Override    //重载方法标识符
 public void fly() {
   System.out.println("我要飞得更高");
 }
 }
}
5、抽象类和接口的区别
  • 1、抽象类可以定义常量也可以是变量,接口只能定义常量。
  • 2、类只能单继承,接口可以多继承,类还可以实现多个接口。
  • 3、抽象类设计是为了共性的功能,接口设计是为了扩展的功能。
  • 4、抽象类可以声明和使用字段,接口不可以。
  • 5、接口的方法只能是public,抽象类中则都可以。
  • 抽象类可以定义构造函数,接口不可以。

内部类

1、概述

内部类的定义其实很好理解,就是一个类定义在另一个类里面,只是根据定的位置不同,产生了不同的类别。

2、特点
  • 内部类可以直接访问外部类的所有成员,包括私有属性的。
  • 外部类访问内部了必须创建对象访问。
  • 例如:外部类名.内部类名 对象名 = new 外部类名().new 内部类名();
3、分类

(1)成员内部类

  • 定义在成员变量的位置。
  • 可以无限制的访问外部类成员。
外部类名.this.成员
  • 成员内部类中不可以定义静态成员。

  • 总结:
    在这里插入图片描述(2)局部内部类

  • 定义在方法中的内部类。

  • 局部内部类只能在方法中被识别,除了方法没人可以调用。

  • 局部内部类不可以被public,private,protected修饰

  • jdk1.8之前局部内部类的变量必须使用final,但是之后就不用了。

  • 可以直接访问外部类的成员

  • 可以创建内部类对象,通过对象嗲用内部类方法。

(3)静态内部类

  • 用static修饰的内部类
  • 静态内部类既可以定义静态成员,也可以定义非静态成员。
  • 有静态成员的内部类一定是静态内部类。
  • 调用方法 :
外部类名.内部类名.静态成员;//静态的
new 外部类名 .内部类名().非静态成员//非静态的

(4)匿名内部类

  • 概念:内部类的简化写法
  • 产生前提:必须存在一个类或者接口,类可以是抽象类也可以是具体类
  • 格式: new 类名/接口名() {重写方法 ;}
  • 本质: 是一个实现了接口或继承了类的子类
4、修饰符

在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值