接口
- 概述:接口是一个比抽象类还抽象的类,只描述所应该具备的方法,没有具体实现(只定义,不实现),具体的实现由接口的实现类(接口的子类)来实现。
接口所有的方法都是抽象方法,直接new接口调用方法没有意义,不能new接口,接口和类是实现关系,类实现接口,使用implements。 - 接口成员的特点:
1、接口中只能有抽象方法,默认使用也只能使用public abstract修饰。
2、接口中只能有常量,接口中没有一行方法体,没有办法给变量初始化,只能是常量,默认使用public static final修饰。
3、接口不能创建对象,一个类实现一个接口,就必须实现这个接口的所有方法,子类只有覆盖掉接口中所有的抽象方法以后才可以实例化,否则子类也是一个抽象类。
public class InterfaceDemo{
public static void main(String[] args) {
Dog dog =new Dog();
dog.eat();
System.out.println(dog.num);
}
}
//定义一个接口
interface Animal {
public static final int num =10;
public abstract void eat();
}
//定义了Dog实现了这个Animal接口
class Dog implements Animal{
@Override
public void eat() {
System.out.println("dog重写了Animal的方法");
}
}
输出结果:
dog重写了Animal的方法
10
- 接口和类的关系:
1、类与类之间:继承关系,一个类只能直接继承一个父类,支持多层继承
2、类与接口之间:实现关系,一个类可以实现多个接口,如果多个接口中有一样的方法,只实现一个。
3、接口与接口之间:继承关系,一个接口可以多层继承接口 - 接口的优点:
1、对外提供规则
2、一个类可以实现多个接口,打破了继承的局限性。
3、降低了程序的耦合性(可以实现模块化开发,定义好规则,每个人实现自己的模块,提高了开发的效率) - 接口和抽象类的区别:
共性:都抽取出抽象的、没有具体实现的方法,都不能创建对象。
区别:
1、接口与类是实现关系,一个类可以实现多个接口,要把接口中的抽象方法都重写。类与类是继承关系,一个类只能继承与一个父类,但是可以多层继承。
2、抽象类中可以有成员变量,也可以有常量;接口中只能有常量,默认是public static final修饰。
抽象类中可以有抽象方法,也可以有非抽象方法,接口中只能有抽象方法,默认是public abstract修饰。
抽象类可以有构造方法,因为抽象类有成员变量,为子类提供,给成员变量初始化的。接口中没哟构造方法。
匿名对象
- 匿名对象时指直接使用new关键字来创建对象,没有变量引用。
- 匿名对象的使用场景:
当方法只调用一次是可以使用;可以当做参数进行传递,但在传参之前没有办法做其他的操作。
匿名对象可以调用成员变量并赋值,但是赋值没有任何意义。
public static void main(String[] args) {
new Student().name ="zhangsan";
System.out.println(new Student().name);
method(new Student());
}
public static void method(Student s){
}
输出结果:
学生类无参构造
学生类无参构造
null
学生类无参构造
多态
封装、继承和多态是面向对象的三大特性。
- 多态的前提是有子父类的继承关系,方法的重写和父类引用指向子类对象。
- 多态成员的特点:
多态成员变量:当子父类出现重名的成员变量时,多态调用时
1、在编译时:参考引用型变量的父类是否有这个变量,如果没有就会报错。
2、在运行时:调用的是父类中的成员变量,返回的仍然是这个父类中的值。
多态成员方法:
1、在编译时:参考引用型变量的父类是否有这个方法,如果没有就会报错。
2、在运行时:调用的是子类中的成员方法,返回的仍然是这个子类中的值。
多态静态方法:
1、在编译时:参考引用型变量的父类是否有这个方法,如果没有就会报错。
2、在运行时:调用的是父类中的成员方法,返回的仍然是这个父类中的值。
public class ExtendsDemo {
public static void main(String[] args) {
Person1 p = new Student1();
System.out.println("p.num="+p.num);
//System.out.println("p.name"+p.name);报错
p.eat();
//p.run();报错
p.speak();
Person1.speak();
}
}
//人
class Person1{
int num =20;
public void eat(){
System.out.println("吃饭");
}
public static void speak(){
System.out.println("说话");
}
}
//学生
class Student1 extends Person1{
int num=10;
String name ="zhangsan";
@Override
public void eat() {
// TODO Auto-generated method stub
System.out.println("学生去食堂吃饭");
}
@Override
public static void speak(){
System.out.println("学生说话");
}
public void run(){
System.out.println("学生跑步");
}
}
输出结果:
p.num=20
学生去食堂吃饭
说话
说话
注意: 变量去调用静态方法,就等于是类名直接去调用
- 向上转型和向下转型
向上转型:当把子类对象赋给一个父类引用时,便是向上转型,可以直接说小狗是动物。
向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,如果直接创建父类对象,无法向下转型。不能直接说动物就是小狗,要提前知道这个动物就是小狗以后,才可以说。
//根据上面的例子看
Person1 p = new Student1();//向上转型
Student1 s =(Student1)p;//向下转型
- 多态的优缺点:
多态的优点是可以提高可维护性,提高代码的可扩展性。
缺点是无法直接访问子类特有的成员,这时可以向下转型。