接口)
标签: java
内部类
1)成员内部类
1.1)编写在类的成员位置
1.2)外部类的私有属性,内部类可以访问
内部类的私有属性,
外部类也可以实例化对象调用
1.3)当内部类和外部类有同名成员时
在内部类中使用
Outer.this.成员的方式指定外部类成员
1.4)所有内部类都有独立的class文件
2)匿名内部类
2.1)匿名内部类通常编写在方法中
2.2)匿名内部类必须通过继承一个父类
或实现一个接口来编写
2.3)匿名内部类也可以访问外部类的私有成员
匿名内部类也是使用
Outer.this.xxx来调用重名成员的
2.4)匿名内部类使用它所在的方法的
局部变量时
1.不能修改
2.该局部变量只能被赋值一次
计时器
1)编写的步骤
1.1)实例化计时器对象(java.util.Timer)
1.2)使用匿名内部类,实现一个TimerTask的
子类
并在匿名内部类中重写run方法
1.3)使用计时器对象调用
task对象中的run方法,并设置运行间隔
#接口
##1.什么是接口
java中的接口是一种特殊的数据类型
类似于生活中的一种能力,人的能力之类的
##2.为什么需要接口
使用接口能实现java中的多继承
一个类除了继承父类的能力,还想有其他很多公有的能力
相当于认另外的干爹,可以实现多继承的能力
java语言是一个单继承语言,使用接口可以曲线救国,实现“多继承”
##3.怎么定义一个接口
在一个java文件中
interface 接口名{
}
就是把class替换成interface
新建的为class,进去再改成interface都行
##4.接口的特征
可以暂时理解为(只有抽象方法的抽象类)
4.1 接口中的所有属性都是:
公有静态常量
4.2 接口中的所有方法都是:
公有抽象方法
4.3 接口中不允许有构造方法
子类的构造只能调用父类的,不能调用接口的,所以接口不需要也没有构造
4.4 接口不能实例化
eg:
public interface Aoo {
//所有属性都有公有静态常量,不是默认,是就是这个类型,不能改成其他类型
int NUM = 100;
//编译时会变成 (相当于)
//public static final int NUM = 100;
//所有方法都是公有抽象方法,不是默认,是就是这个类型,不能改成其他类型
void abc();
//编译时会变成(相当于)
//public abstract void abc();
}
##5.编写类实现接口
(注意说法:实现接口、继承父类)
5.1 在类名后通过
implements关键字实现接口
5.2 一个类可以实现多个接口
接口名用“,”分割
5.3 如果该类继承了父类
应该在父类名后编写implements关键字
先继承父类,再实现接口
5.4 实现接口的子类,必须重写
接口中的所有方法
除非这个实现类是抽象类
eg:
public class Child extends Father implements Aoo,Boo{
@Override
public void abc() {
// TODO Auto-generated method stub
}
}
//这个实现的类为抽象类,则不需要实现接口(或抽象父类中的)方法
//public abstract class Child extends Father implements Aoo,Boo{}
##6.接口类型的使用
6.1 通常情况下
接口也是向上造型的类型
Aoo a=new Child();
实现类对象赋给接口类型引用
接口类型的引用
只能调用到接口中声明的方法,不能调用子类独有的方法(除非强转)
6.2 接口类型也可以使用匿名内部类实现
eg:
//匿名内部类实现接口
Aoo a = new Aoo(){
@Override
public void abc() {
}
};
##7.接口的注意事项
7.1 接口也可以继承接口
使用 extends 关键字(只有类实现接口时才用implements)
多个接口用,分割
子接口的实现类需要重写:子接口和其父接口中的所用方法
7.2 接口和实现类应该是has-a的关系有一个
7.3 接口方法同名
eg:
public interface Coo extends Aoo,Boo{
@Override
default void abc() {
}
}
##8.理解接口的含义
接口代表一种能力
实现接口的同时就代表这个类型的对象拥有了这种能力
##9.接口的意义
9.1 使java程序间接实现了多继承
9.2 接口更加直接的,设计了整个程序的结构,方便程序的扩展和维护
9.3 程序的设计人员可以通过面向接口编程,减少设计工作的复杂度
#一些小练习
1.定义一个抽象类Bird,其中包含
年龄和性别属性和抽象的eat(吃)方法
2.定义两个接口
飞(Fly)接口中有方法void fly();
游泳(Swimming)接口中有方法 void swim();
//不是所有鸟都会飞或者游泳,子类会哪个能力就实现哪个能力的接口
3.定义一个子类(实现类)Duck(鸭子)
继承鸟,实现飞和游泳
定义一个子类(实现类)Magpie(喜鹊)
继承鸟,实现飞
4.在创建测试类
将鸭子对象赋给Swimming类型,调用swim方法
将喜鹊对象赋给Fly类型,调用fly方法
代码
class 鸟{
}
class XX鸟 extends 鸟 implements 飞,游泳{
}
class XX鸟 extends 鸟 implements 飞{
}
class XX鸟 extends 鸟{
}
每个人都是这个人类型的唯一对象
public class ZhangSan extends Person
implements Driver,Swimming,Cooking
{
}
我们工作中的接口的形态
public interface 用户管理{
//这个方法用于用户登录
//username是用户名
//pwd是密码
//登录成功,返回用户对象
void User login(String username,
String pwd);
}
public class 用户管理实现类
implements 用户管理 {
void User login(String username,
String pwd){
.....
}
}