Java---面向对象高级程序设计

内部类

抽象类

接口

final

1.内部类
1.1 成员内部类的定义
1.非静态内部类的定义
Java不允许在非静态内部类中定义静态成员,非静态内部类可以访问外部类的任意成员,外部类访问非静态内部类成员时,需要先创建内部类对象;

2.静态内部类的定义
在静态内部类中,可以定义静态成员,也可以定义非静态成员,静态内部类只能访问外部类的静态成员,同样,外部类需要访问静态内部类成员时,需要创建内部类对象,但是静态内部类的静态成员在外部类中被访问时,可以直接使用静态内部类的类名对静态成员进行调用;

1.2 成员内部类的使用
1.在外部类内部使用内部类
在外部类中不能直接访问非静态内部类的成员,如果要访问非静态内部类成员需要先创建内部类的对象,通过对象进行访问;
在外部类的静态成员中创建内部类对象时,需要通过外部类实例来调用内部类的构造器;
在外部类中不能直接访问静态内部类成员,但是可以通过静态内部类类名来访问内部类的静态成员;访问静态内部类的非静态成员需要创建内部类实例;
在外部类的静态成员中创建静态内部类的对象并不需要先创建外部类的对象,可以直接通过new 关键字调用静态内部类的构造器来创建内部类对象;

2 在外部类外部使用内部类
在外部类定义内部类变量格式 :
[外部类的包前缀] [ 外部类名 ] .内部类名 varname;
创建静态内部类对象 :
new 外部类类名.内部类构造器();
创建非静态内部类对象:
外部类实例.new 内部类构造器 ();

1.3 匿名内部类
定义匿名内部类和创建对象的语法如下:
new 接口名()| 父类构造器名(){};

匿名内部类会隐式继承一个父类或实现一个接口,匿名内部类不能时抽象类,如果父类是抽象类,需要实现父类的所有抽象方法,在实现接口时,也需要实现接口的所有抽象方法;

在使用匿名内部类时需要注意几点:
(1) 创建匿名内部类时,必须继承一个类或实现一个接口;
(2) 匿名内部类没有类名,所有不能定义构造器,可以使用普通初始化块来完成相应初始化工作;
(3) 匿名内部类不能存在任何静态成员,包括静态初始化块,静态成员变量,静态成员方法和静态内部类;
(4) 匿名内部类属于局部内部类(即在方法体中定义的内部类),jdk1.8 之前的Java规定被局部内部类访问的局部变量必须显式使用final修饰,但jdk1.8对此限制做了修改: 如果局部变量被匿名内部类访问,该局部变量等同于自动使用了final修饰;

2 抽象类
2.1 抽象类和抽象方法
抽象方法没有方法体,只有方法声明;
抽象类和抽象方法必须用abstract修饰,具有抽象方法的类必须定义为抽象类,但抽象类可以没有抽象方法;
(1) 抽象类不能创建对象,虽然抽象类具有构造器,但无法使用new 关键字调用抽象类的构造器来创建对象;即使抽象类中没有抽象方法,也不能创建对象,但是可以使用抽象类创建引用变量,也可以调用其中的抽象方法;
(2) 包含抽象方法的类包括三种情况:在类中直接定义了抽象方法;继承抽象父类,但是没有完全实现父类的抽象方法,实现一个接口,但是没有完全实现接口的抽象方法;

abstract 关键字在使用时具有如下几个特点:
(1) 用abstract修饰的类必须要被继承才能调用相应方法,用abstract修饰的方法只能通过重写才能提供具体实现;而用final修饰的类不能被继承,用final修饰的方法不能被重写,所以abstract和final不能同时使用;
(2) 不能同时使用static和abstract 修饰方法;
(3) 不能使用abstract修饰构造器,也不能使用abstract修饰变量;
(4) 抽象方法必须要被子类重写才具有实质的功能,用private修饰的方法不能被继承,也就不能重写,所以abstract和private不能同时修饰方法;

3 接口
jdk 1.8 之前的接口中所以方法均为抽象方法,jdk1.8对接口进行了改进,允许在接口中定义具有方法体的默认方法;

3.1 接口的定义
定义接口使用interface 关键字

(1) 修饰符:interface关键字修饰符为public 或缺省;
(2)extends : 直接继承一个或多个父类接口,但是不能继承类;
(3)接口中的成员默认使用public访问权限,如果要指定其访问控制符,也只能为public;
(4) 接口体中可以包含0到多个静态常量,即在接口中定义的成员变量默认带有 public static final ; 因为接口中没有初始化块和构造器,因此接口中定义的成员变量只能在声明时指定初始值;接口体中的变量只能定义为静态常量;
(5) 抽象方法默认修饰符为 public abstract;
(6) 类方法必须加上static修饰,默认方法必须加上default修饰,不能同时使用static和default;接口中方法不能使用final修饰;

3.2 接口继承和使用
接口的继承为多重继承;一个接口继承多个父类接口,将会拥有父类接口中的所有静态常量和抽象方法,默认方法;
接口使用的常用方式:
(1) 定义引用变量,也可用用于强制类型转换;
(2) 使用接口名调用接口中的常量和类方法;
(3) 被其他类实现;

如果实现类的多个接口具有相同的抽象方法,则实现类只能实现其中一个;

4 final修饰符
4.1 final修饰成员变量
类变量在类初始化时进行初始化,实例变量在对象初始化时初始化;
final修饰的成员变量必须显式的指定初始值;

根据成员变量前是否具有static修饰符,用final修饰的成员变量赋值方式如下:
(1) 类变量: 必须在静态初始化块或声明该变量时指定初始值,并且只能在这两个位置选择;
(2) 实例变量 : 必须在普通初始化块中,声明该变量时或构造器中指定初始值;如果类中有多个重载构造器,并且实例变量指定在构造器中赋值,则每个构造器中都应该为该变量赋值;

4.2 final修饰局部变量
显式指定初始值;因为系统不会自动为局部变量初始化;

4.3 final修饰变量的本质
final限制了该变量中的数据不能改变;如果该变量是引用,则该变量保存的地址不能被改变,但是可以修改该地址上的数据;

4.4 final修饰方法
被final修饰的方法不能被子类重写;

4.5 final修饰类
被final修饰的类不能被继承;

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值