抽象类
1、概述
比如动物来说,它并不是一个具体的事物,只是一个抽象的概念,只有具体到真正的一个个体,比如到猫、狗,这样才算是具体的动物,理解了这句话,我们理解抽象类就不难了。
抽象类就是将一个笼统范围内的不同个体的行为给出具体的体现,比如猫和狗的睡觉方式不一样,那么我们一个大的动物类里面可以只给出一个关于睡觉的声明,而由猫、狗的具体类去填充他们自己的特有行为。
在Java中,一个没有方法体的方法,可以定义为抽象方法,而类中有抽象方法,这个类就必须是抽象类,但是抽象类中也可以有别的方法,这二者不是相互的。
2、格式
格式:
abstract class 类名 {}
abstract 修饰符 返回值类型 方法名(参数列表);
abstract就是抽象修饰符
没有方法体,与大括号不共存
3、抽象成员
-
成员变量
可以是常量也可以是变量,没有要求 -
构造方法
抽象类含有构造方法,但是它的构造方法不能实例化,只是为了让子类可以通过构造方法访问该抽象类。 -
成员方法
4可以有抽象方法,也可以由其他方法,提高了代码的复用性。
4、特点
- 有抽象方法的一定是抽象类,但是抽象类不一定有抽象方法。
- 抽象类按照多态的方式由子类进行实例化。
- 抽象类的子类要是抽象类就是普通的继承,如果不是抽象类,那么 必须重写抽象类中所有的抽象方法。
- 抽象类不可以用final修饰,final与abstract是不共存的。
- 抽象类的抽象方法:用于限定子类必须完成某些动作
- 抽象类的非抽象方法:用于提高代码的复用性
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 类名/接口名() {重写方法 ;}
- 本质: 是一个实现了接口或继承了类的子类