抽象类,接口,内部类,

系列文章目录

记录了一些自己对抽象类,接口,内部类,枚举的一些理解,使用方法以及注意事项

仅供参考!!!

一、抽象类(本质上还是一个类)

抽象的定义就是不具体的,高度概括的,就是将一组具有共同的属性和方法的类,抽象为一个抽象类。

1.抽象类和抽象方法的定义

        抽象类使用abstract关键字修饰,抽象方法也是使用abstract修饰,抽象方法没有方法体。

2.抽象方法和抽象类

抽象方法:抽象方法没有方法体,因为在父类中不知道具体的实现

抽象类:抽象类中有构造器,它的构造器是给子类使用的,抽象类的本质还是一个类,它可以继承其他类,也可以实现接口。抽象类中可以没有抽象方法,但是有抽象方法的类一定是抽象类。

3.注意点

1.抽象类不能够实例化对象

2.当有子类继承抽象类的时候,子类必须全部重写抽象类的全部抽象方法。

3.子类继承抽象类,子类也可以是一个抽象类,也可以写自己的抽象方法,可以不重写父类的抽象方法,也可以重写父类的抽象方法。(换句话来说:如果子类继承了抽象类,没有全部重写抽象方法,那这个子类一定是抽象类)。

4.抽象类也符合多态的机制。

二、interface(接口)

引用数据类型:数组,类,接口

1.接口的概述

        接口是一种引用数据类型,是用interface关键字修饰,它是一种功能的实现。接口中没有构造器,不能实例化对象,符合多态机制。

1.在接口中的变量,默认被public static final修饰,是公共静态常量。

2.接口中的方法,默认被public abstract修饰,是抽象方法。

3.JDK8之后,接口中可以有静态和默认方法。(静态方法只能使用接口名去调用,默认方法在实现接口的子类还可以被重写)

4.JDK9之后,接口中可以有私有方法。

2.关于接口的继承

1.接口和接口之间可以进行多继承,一个接口去继承多个接口,实现功能拓展

2.类和接口之间可以进行多实现,一个类实现多个接口(但必须全部重写接口的抽象方法)。一个类可以继承一个类并实现多个接口。

3.接口和抽象类的区别

1.定义方式,接口 是interface修饰的,抽象类是abstract修饰的

2.数据成员:接口中只能包含static final 修饰的数据成员,抽象类中可以有普通数据成员和静态数据成员。

3.成员方法:接口中只能包含抽象方法,抽象类中可以有具体的方法实现(基本一个类有的功能都有)。

4.构造函数:接口没有构造函数,抽象类有构造函数(是给它的子类提供的)

5.实现方式:一个类可以继承一个抽象类,但可以实现多个接口

6.多继承:Java不支持多继承,一个类只能继承一个抽象类,但可以实现多个接口

4.抽象类和接口的选择

1.当一组没有关系的类,如果仅仅事项扩展某些功能的时候,就可以使用 接口去进行实现。

2.当一组有关系的类,这些类有着共同的属性和行为,那么就可以抽象成一个父类,如果这个类不需要去实例化对象,并且某些方法没有具体的实现,可以定义为抽象方法和抽象类。

三、内部类

1.成员内部类

成员内部类就是外部类中的一个成员

1.成员内部类中不能定义静态成员和方法。

2.成员内部类可以访问外部类的所有属性和方法(包括private修饰的),内部类访问外部类的普通成员,通过类名.this.成员,访问静态成员通过类名.。

3.外部类可以访问内部类的所有属性和方法,只需要创建一个对象即可。

4.在其他类中实例化成员内部类格式:

外部类.内部类 变量 = new 外部类().new 内部类();

2.静态内部类

静态内部类就是外部类的一个静态成员(由static修饰),静态的只能访问静态的。

1.静态内部类中可以定义静态的成员

2.静态内部类只能访问外部类的静态成员。

3.外部类访问内部类的成员,只需要创建一个内部类对象。

4.在其他类中实例化成员内部类格式:

外部类.内部类 变量 = new 外部类.内部类();

3.局部内部类(不常用)

定义在方法中的,作用范围只在方法里

1.局部内部类中不能定义静态的成员

2.局部内部类的创建必须是在声明之后

3.该内部类无法被外部类或者其他类进行创建对象并使用

4.局部内部类访问该方法中的局部变量,默认被final修饰

4.匿名内部类(常用)

一种没有名字的内部类,它必须依托于一个接口或者一个类     

主要功能为了简化接口实现的过程/子类继承父类的过程  

1.匿名内部类如果是基于一个接口,那么这个匿名内部类就是这个接口的实现类对象

2.如果基于一个类,那个这个匿名内部类就是这个类的子类。

3.需要重写接口和抽象类的抽象方法

4.匿名内部类在声明的时候就创建出对象,只能创建一次

5.匿名内部类一般也是定义在方法内部的,所以生命周期较短

6.定义格式(没有构造器)

接口或者类 变量 = new 接口或者类(){};
// {}内部用来当成类的内部去写,但要记住,匿名内部类没有名字,所以也就不存在构造器

5.内部类的选择

首先判断这个内部类是否重复使用(是否有名字)

1.在这个类中,如果想要需要 定义静态的成员,那么选静态内部类

2.在这个类中,如果想要需要访问外部类的非静态的成员,那么选成员内部类

3.匿名内部类只使用一次 。

四、枚举

jdk1.5之后引入枚举,本质上是一个类,当一个类的对象是固定的(例如星期,性别等),那么就可以定义为一个枚举类

1.枚举本质上是一个类,可以有类的所有内容

2.枚举的构造器是私有的,private修饰的,枚举的对象必须在第一行

3.其他类不能实例化枚举

4.所有的枚举类型默认由final修饰,默认继承Enum,所以枚举不能继承其他类。

5.枚举可以实现接口,有两种实现方法,一种是由枚举类统一实现,一种是由枚举对象单独实现。

如果同时实现的话,执行的时候执行的是枚举元素重写的方法。

6.枚举中可以存在抽象方法,但是必须由枚举对象立刻进行实现,使用的方式是匿名内部类

7.枚举类,没有显示定义构造器,系统默认提供private修饰的无参构造器,用户定义的构造器应该用private修饰。

枚举类实例化对象:
枚举类 变量名 = 枚举类.枚举元素;

枚举对象:
默认是 public static final修饰的 

public static final Week MON = new Week();

枚举的常用方法:

非静态方法: 

1.ordinal():找到每个枚举元素的索引

2.name():获取枚举元素名(字符串)

静态方法:
1.values(): 获取枚举的所有元素,返回一个枚举数组

2.valueof():返回指定字符串值的枚举常量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值