Java新手:接口、多态的知识点

接口
  1. 概述:接口是一个比抽象类还抽象的类,只描述所应该具备的方法,没有具体实现(只定义,不实现),具体的实现由接口的实现类(接口的子类)来实现。
    接口所有的方法都是抽象方法,直接new接口调用方法没有意义,不能new接口,接口和类是实现关系,类实现接口,使用implements。
  2. 接口成员的特点:
    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. 接口和类的关系:
    1、类与类之间:继承关系,一个类只能直接继承一个父类,支持多层继承
    2、类与接口之间:实现关系,一个类可以实现多个接口,如果多个接口中有一样的方法,只实现一个。
    3、接口与接口之间:继承关系,一个接口可以多层继承接口
  2. 接口的优点:
    1、对外提供规则
    2、一个类可以实现多个接口,打破了继承的局限性。
    3、降低了程序的耦合性(可以实现模块化开发,定义好规则,每个人实现自己的模块,提高了开发的效率)
  3. 接口和抽象类的区别:
    共性:都抽取出抽象的、没有具体实现的方法,都不能创建对象。
    区别:
    1、接口与类是实现关系,一个类可以实现多个接口,要把接口中的抽象方法都重写。类与类是继承关系,一个类只能继承与一个父类,但是可以多层继承。
    2、抽象类中可以有成员变量,也可以有常量;接口中只能有常量,默认是public static final修饰。
    抽象类中可以有抽象方法,也可以有非抽象方法,接口中只能有抽象方法,默认是public abstract修饰。
    抽象类可以有构造方法,因为抽象类有成员变量,为子类提供,给成员变量初始化的。接口中没哟构造方法。
匿名对象
  1. 匿名对象时指直接使用new关键字来创建对象,没有变量引用。
  2. 匿名对象的使用场景:
    当方法只调用一次是可以使用;可以当做参数进行传递,但在传参之前没有办法做其他的操作。
    匿名对象可以调用成员变量并赋值,但是赋值没有任何意义。
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、在运行时:调用的是子类中的成员方法,返回的仍然是这个子类中的值。
    多态静态方法:
    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
学生去食堂吃饭
说话
说话

注意: 变量去调用静态方法,就等于是类名直接去调用

  1. 向上转型和向下转型
    向上转型:当把子类对象赋给一个父类引用时,便是向上转型,可以直接说小狗是动物。
    向下转型:一个已经向上转型的子类对象可以使用强制类型转换的格式,将父类引用转为子类引用,如果直接创建父类对象,无法向下转型。不能直接说动物就是小狗,要提前知道这个动物就是小狗以后,才可以说。
//根据上面的例子看
Person1  p = new Student1();//向上转型
Student1 s =(Student1)p;//向下转型
  1. 多态的优缺点:
    多态的优点是可以提高可维护性,提高代码的可扩展性。
    缺点是无法直接访问子类特有的成员,这时可以向下转型。

猜你喜欢

转载自blog.csdn.net/w_e_i_1201/article/details/83413291
今日推荐