1.接口:
类 和 对象 对象 is a 类
例子:
小鸟 is a 动物
飞机 is a 交通工具
子弹 is a 武器
卫星 is a 通讯工具
问题?
01. 小鸟 飞机 子弹 卫星 虽然不是一类! 但是却有一个公共点!!!都会飞!
02. 我们能不能把这个飞行的方法 写在 动物或者交通工具这些类中???
不能??为什么??
因为一旦我们把 飞行这个方法写在了 动物类中,代表所有的动物都会飞了!!!!
小鸟具有飞行的能力!
飞机具有飞行的能力!
子弹具有飞行的能力!
卫星具有飞行的能力!
这种关系 我们称之为 has a!
我们把 飞行这个能力! 写在一个叫 接口 的地方!
谁具有飞行的能力,就去 实现这个接口即可!
接口 : interface
特点:
01.接口不能被实例化,也不能有构造方法!
02.实现类必须重写接口中所有的方法!除非子类是抽象类或者接口!
03.接口中所有的变量 都是 静态常量!(必须赋予初始值) static final
04.接口中所有的方法都是 抽象方法! public abstract
05.解决了java中单根继承的问题,一个类只能extends一个类!但是可以implements N个接口
每个接口之间,使用逗号 隔开!
接口本身 只提供 某种功能,但是这个功能的具体实现,接口并不关注!
谁关注??谁实现了这个接口,谁关注!
接口A{
方法A();
}
接口B{
方法B();
}
接口C{
方法C();
}
接口D extends A,B,C{
}
实现类 implements 接口D{
方法A();
方法B();
方法C();
}
/*
* 动物类
*/
public abstract class Animal {
public abstract void eat();
/**
* 因为 不是所有的动物都会飞行!
* 所以这个fly()压根 就不能定义在animal类中
*/
// public abstract void fly();
}
/**
* 飞行的接口!
* 小鸟 飞机 以及 子弹 飞行的方式 一样吗?? 不一样!!
* 所以说 这个fly()有必要写方法体吗?? 没必要!!
* 说明这个fly()就是一个抽象方法!
*
*
*
*/
public interface FlyInterface {
/**
* 静态常量
*/
static final int NUM = 5;
/**
* 飞行的能力
*/
public abstract void fly();
}
public class Bird extends Animal implements FlyInterface {
@Override
public void eat() {
System.out.println("小鸟在吃虫子!");
}
@Override
public void fly() {
System.out.println("小鸟在飞翔.......");
}
}
public class Cat extends Animal {
@Override
public void eat() {
System.out.println("СèßäÔÙ³ÔÓã");
}
}
2.内部类:
内部类:把一个类写在了另一个类或者方法中!
分类:
01.成员内部类
可以访问我们外部类的所有属性和方法!
如果我们想访问内部类,必须要有外部类,只能通过外部类来访问内部类!
// 01.实例化外部类对象
Father father = new Father();
// 02.通过外部类对象创建内部类对象
Father.Son son = father.new Son();
// 03.调用内部类的方法
son.sayHello();
特点:
01.成员内部类可以拥有private,protected访问权限修饰符
02.如果外部类和内部类有相同的属性和方法的时候,就近原则,使用内部类的!
想使用外部类的属性和方法时:
外部类名.this.属性/方法!
02.局部内部类
类被定义在一个方法体或者作用域中!
特点:
仅限于方法体内使用 ,可以理解成局部变量!
03.匿名内部类 ******
001.没有名称!看不到类的定义!
002.所有的匿名内部类必须继承一个类或者实现一个接口
04.静态内部类
01.在内部类上加static
02.不依赖于外部类,可以直接new
03.不能访问外部类的非静态方法和属性
public class Father { // 外部类
/**
* 外部类的成员变量
*/
private static int age = 5;
private String name = "小黑";
class Son { // 成员内部类
int age = 50;
String name = "小白";
/**
* 内部类打招呼的方法
*/
public void sayHello() {
System.out.println("外部类的姓名:" + Father.this.name);
}
}
/**
* 外部类的方法
*/
public void getSon() {
class Son { // 局部内部类 只能在getSon()中使用
public void sayBye() {
System.out.println("局部内部类 bye ");
}
}
Son son = new Son(); // 仅限于方法体内使用
son.sayBye();
}
static class Son2 { // 静态内部类
public void sayBye() {
System.out.println("静态内部类====》 bye " + age);
}
}
}
public interface Animal {
void eat();
void sleep();
}
import cn.bdqn.bean.Father.Son2;
public class InnerClassTest {
public static void main(String[] args) {
// 使用内部类???
// 01.实例化外部类对象
Father father = new Father();
// 02.通过外部类对象创建内部类对象
Father.Son son = father.new Son();
// 03.调用内部类的方法
son.sayHello();
// 使用局部内部类
father.getSon();
// 使用静态内部类
Son2 son2 = new Son2();
son2.sayBye();
}
// 当我们所在方法的形参需要在内部类中使用的时候,这个形参必须是final 修饰的!
class Son {
public void eatSomething(String something, final int age) {
// 使用匿名内部类
Animal dog = new Animal() {
@Override
public void sleep() {
System.out.println("小狗在睡觉");
}
@Override
public void eat() {
System.out.println(age);
}
};
dog.eat();
dog.sleep();
}
}
}