1、接口:interface关键字
(1)语句定义格式:
interface 接口名{}
(2)接口是如何实现的呢?
接口不能直接实例化,需要一个关键字供其他类实现该接口:implements
使用多态的形式进行实现,由具体的子类进行实例化,其实这是多态的一种,叫做接口多态。
(3)也可以用一个抽象类去实现。
到目前为止,我们学过了三种多态的表现实现:
(1)具体的类中的多态 (最后才是具体类的多态)
(2)抽象类中的多态 (其次是抽象多态)
(3)接口中的多态 (今后大数据开发最常见的是接口多态)
2、接口中成员的特点:
(1)成员变量:
只能是常量,并且是静态的。 JVM在真正运行之前会自动补齐修饰符:public static final
(2)构造方法:
接口中没有构造方法。所以直接实现接口的类都继承Object类,完成构造方法的初始化。
(3)成员方法:
接口中的方法只能是抽象方法。 JVM在真正运行之前会自动补齐修饰符:public abstract
//创建一个接口 interface Animal{ public static final int age = 30; //默认修饰符: public static final,可以不写 // Animal(){ //不能有构造方法 // // } public abstract void show(); //默认修饰符: public abstract,可以不写 } //定义猫类,继承Object类(Object是所有类的父类),实现Animal接口 class Cat extends Object implements Animal{ @Override public void show() { System.out.println("猫会跳舞"); } } //测试类 public class InterfaceDemo { public static void main(String[] args) { //接口类多态 Animal animal = new Cat(); animal.show(); } }
注意:
(1)当一个具体的类实现接口的时候,必须实现接口中所有的抽象方法。
(2)当一个抽象类实现接口的时候,可以选择不实现接口中的方法,也可以选择性的实现。
类与类,类与接口,接口与接口的关系
(1)类与类:
存在的是继承关系,只能进行单继承,不可以进行多继承,但是可以是多层继承。
(2)类与接口:
存在的是实现关系,可以是单实现,也可以是一次性实现多个接口,也可以在继承一个类的同时,实现多个接口。
(3)接口与接口:
存在的是继承关系,可以进行单继承,也可以进行多继承。
interface Inter1{ } interface Inter2{ } interface Inter3 extends Inter1,Inter2{ //接口可以继承多个接口 } public class Demo extends Object implements Inter1,Inter2{ //类可以在继承一个类的同时实现多个接口 }
3、将来我们更多的面向接口开发会将代码进行分类开发,这样会提高我们开发效率和排错效率。
通常情况下,会在一个包里分4层:
bean: 一般存放的是将来要new的实体类。
controller: 一般是数据的入口类。
dao: 具体对数据做操作的地方,放在dao层,这一层一般情况下,都是对数据库做操作的。
service: 一般在这里面放的是接口,和实现类。
4、方法的形式参数是引用数据类型时:
(1)类:当类作为方法的形式参数时,实际需要的是该类的对象。
(2)抽象类:当抽象类作为方法的形式参数时,实际需要的是该类子类实现对象的地址值,利用多态的形式创建。
(3)接口:当接口作为方法的形式参数时,实际需要的是该接口的实现类对象的地址值,利用接口多态的方式创建。
//创建一个抽象的人类 abstract class Person { public abstract void study(); } //创建一个人类2接口 interface Person2 { public abstract void playGame(); } //创建一个学生类继承人类,实现人类2接口 class Student extends Person implements Person2 { @Override public void study() { System.out.println("好好学习天天向上"); } @Override public void playGame() { System.out.println("天天玩英雄联盟"); } } //创建一个Demo类 class StudentDemo { // 1) 当看到一个方法的参数是一个类的类型时,实际传的是该类对象的地址值 public void fun(Student stu) { //Student stu = new Student(); stu.study(); } // 2) 当看到一个抽象类作为参数的类型时,实际需要的是该类子类实现对象的地址值,利用多态的形式创建 public void fun2(Person person) { //Person person = new Student(); person.study(); } // 3) 当看到一个方法的参数类型是一个接口的时候,实际上需要的是该接口的实现类对象的地址值,利用接口多态的方式创建 public void fun3(Person2 person2) { //Person2 person2 = new Student(); person2.playGame(); } } //测试类 public class StudentTest { public static void main(String[] args) { //创建Demo类对象 StudentDemo stuDemo = new StudentDemo(); // 1) 类作为形参 Student stu = new Student(); stuDemo.fun(stu); // 2) 抽象类作为形参 //Person p = new Student(); //第一种方式 多态的形式 //stuDemo.fun2(p); stuDemo.fun2(new Student()); //第二种方式 链式编程 // 3) 接口作为形参 //Person2 p = new Student(); //接口多态的形式 //stuDemo.fun3(p); stuDemo.fun3(new Student()); } }
5、方法的返回值是引用数据类型时:
(1)类: 当一个类作为方法的返回值时,实际返回的是该类对象的地址值。
(2)抽象类: 当一个抽象类作为方法的返回值时,实际返回的是该抽象类的子类对象。
(3)接口: 当一个接口作为方法的返回值时,实际返回的是实现该接口的类的对象。
//定义一个抽象类 -- 人类 abstract class Person { public abstract void study(); } //定义一个玩游戏接口 interface PlayGame { public abstract void playLol(); } //创建一个学生类, 继承人类,实现接口玩游戏 class Student extends Person implements PlayGame { @Override public void study() { System.out.println("好好学习天天向上"); } @Override public void playLol() { System.out.println("天天玩英雄联盟"); } } //创建一个Demo类 class StudentDemo { // 1) 当看到方法的返回值是一个类的类型时,实际返回的是该类对象的地址值。 public Student fun() { //Student s = new Student(); //第一种方法 //return s; return new Student(); //第二种方法 } // 2) 当看到方法的返回值是一个抽象类的类型时,需要返回的是该抽象类的子类对象 public Person fun2() { //Person p = new Student(); //第一种方法 //return p; return new Student(); //第二种方法 } // 3) 当看到方法的返回值是一个接口的类型时,需要的是实现该接口的类的对象 public PlayGame fun3() { //PlayGame pg = new Student(); //return pg; return new Student(); } } //测试类 public class StudentTest { public static void main(String[] args) { //创建Demo类对象 StudentDemo stuDemo = new StudentDemo(); // 1) 方法Student做返回值 Student stu = stuDemo.fun(); stu.study(); // 2) 抽象类Person做返回值 Person p = stuDemo.fun2(); //Person p = new Student(); p.study(); // 3) 接口PlayGame做返回值 // PlayGame pg = stuDemo.fun3(); // pg.playLol(); //链式编程 stuDemo.fun3().playLol(); } }
6、package、import、class它们三个之间有没有顺序呢?
package: 到达的路径,所在文件的路径,它最终以包结束。 (在最前面)
import: 导入外界你想要使用的类,它最终以你想要导入的那个类/.java结束。 (在package与class之间)
要想导入某一包下所有的类: .* (开发不推荐)
只要当你需要导入大于30个类的时候,可以考虑 .*
class: 表示定义一个类,java的最基本的单位 (在import后面,即最后)
7、访问权限修饰符:
同一类下 同一包子类中,其他类 不同包的子类 不同包的其他类
public √ √ √ √
protected √ √ √
默认的 √ √
private √
(√ 代表可以访问)
常见的修饰符组合:
(1)成员变量:public static final
(2)成员方法:
1) public abstract
2) public static
3) public final