一.抽象类
抽象类是用类做功能描述,但是没有具体的执行 。
声明 使用 abstract 关键来修饰的类 就是抽象类
抽象类可以有普通类的所有成员,还可以有抽象方法,必须使用abstract关键字修饰。
抽象类不能自己直接实例化自己,它可以使用匿名对象写法来重写抽象类中的抽象方法。
抽象类可以被子类继承,子类可以拥有父类的所有非私有非静态的成员,但必须重写父类中的所有抽象方法。
在实际开发中 尽量少使用抽象类。要想父类中的方法没有具体的实现,就使用接口来做。
接口和抽象类的区别
接口只有静态常量、静态方法、默认方法、抽象方法
抽象类可以有普通类的所有以及抽象方法
接口可以被实现,一个类可以实现多个接口
抽象类只能被继承,子类必须重写父类的所有抽象方法,要不想重写,子类也必须是抽象类
抽象类可以继承抽象类,接口可以继承接口
抽象类中的抽象方法的访问类型可以是public,protected和默认类型,但接口中的抽象方法只能是public类型的,并且默认即为public abstract类型。
两者在应用上的区别
接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约(方法规定)。而抽象类在代码实现方面发挥作用,可以实现代码的重用。
二.枚举类
枚举类用来指定固定的值的类,使用枚举类比如性别,星期 ,同时也是一个特殊的类,使用enum
语法:
public enum 类名{ }
规定:
枚举类中的属性是类 (是枚举类的一个实例对象)
枚举类中的属性必须写在类中的第一行
枚举类中的属性是私有的
枚举类中的构造方法是私有,不能被别人实例化
使用:
将枚举类当做参数类使用,使用类名.属性名
星期的枚举类
三.内部类
内部类就是在普通类的内部创建的类
1.成员内部类,全局内部类
在外部类的内部声明的类
class声明的类只能使用默认和public 修饰
**类的声明:**访问限定符 修饰符(static final abstract) 类型 名字
普通类可以使用final修饰 ,被final修饰的类称为最终类,不能被其他类所继承,可以继承其他类。
语法:直接在外部类中 声明
访问限定符 修饰符 类型 名字{ 类里面写什么,它就写什么}
如何使用: 怎么实例化内部类 来调用方法
可以在内部继承内部的类
使用:实例化内部类 来调用方法
在其他类中实例化car的内部类来调用内部类的run方法
外部类.内部类 名字 = new 外部类().new 内部类();
全局内部类 可以使用任意限定符、修饰符、类型
可以创建类中类,(内部类的内部类)
2.局部内部类
局部内部类就是在方法中创建类 (又称匿名内部类)
总结:
局部内部类 只有在方法中有效
局部内部类的属性默认是final修饰的(该属性是定义在方法中的局部变量 )
对于局部内部类而言,定义在外部方法中的局部变量,默认是使用final(在局部内部类中可以使用但是不能对其进行修改) jdk1.8 之后出现的会默认加上final
局部内部类中,类不可以使用static修饰,可以用final,abstract
3.静态内部类 全局静态内部类
全局内部类使用static修饰
声明:new 外部类名.内部类();
public class Car01 {
/**
* 静态内部类,属于类(Car01所有)
* 静态方法调用:类名.方法名
*静态内部类实例化:new 外部类名.内部类();
*/
public static class FDJ{
public void run() {
System.out.println("静态全局内部类");
}
}
}
实例化: 外部类.内部类 名字=new 外部类.内部类();
@Test
void test() {
Car01.FDJ fdj = new Car01.FDJ();
fdj.run();//静态全局内部类
}
局部内部类的出现会影响当前方法的局部变量的一个修饰,局部内部类的创建会影响局部内部类所在方法的局部变量的一个修饰改变,变成final。
四.final关键字
final是修饰符,可以用来修饰类、修饰属性、修饰方法
final修饰的类称为最终类,最终类不能被其他类所继承
被final修饰的属性称为常量
名字要全大写,其值在运行期间是不能被改变的,在运算期间类型也不会进行自动转换。final修饰的变量必须赋予初始值(声明并赋值)
package com.xingyun.final1;
public class final01 {
//全局变量,声明时赋值
final int num=20;
public void sum() {
//局部变量使用前必须赋值
final int num;
num=10;
System.out.println(num);
}
}
final修饰的方法称为最终方法,不能被子类所继承和重写