JAVA继承、多态与接口

   一、继承
1、继承的优点
 代码的重用性
 子类可以扩展父类的属性和方法
 设计应用程序变得更加简单
 父类的属性和方法可用于子类
2、如何判断类具有继承关系
 类和类的关系
 1)has-a(组合)
 2)is-a(继承)
3、单继承和多继承
 单根性:
 在java中,一个类只能有一个父类
 传递性:
 子类可以将父类的属性和方法传递给自己的子类
4、所有类的根类都是Object(超类,基类)
5、方法重写(以后多态的使用要用到)@Override//注解
 1)子类的方法的返回值类型、方法名和形式参数列表,
 必须和父类中的是相同的
 2)子类的方法的访问修饰符不能比父类更严格
 3)子类中重写的异常不能抛出比父类更多的异常
6、构造方法与继承
 不像一个超类的成员
 super加括号调用父类的构造器,也必须是语句块的第一句
 注意:默认情况下,子类的构造器会调用父类的无参构造器,
       当父类没有无参构造方法,而子类有无参构造方法时,
       需要指明调用的是什么构造方法。
7、super关键字
 super.***和super(***);
8、final关键字
 使用final修饰一个类,这个类不能再被继承
 使用final修饰一个方法,这个方法不能再被重写
9、抽象abstract
 在编写类时,通常会在类中定义一些方法,用来描述该类所具有的行为。
 在类的方法中,我们编写代码
 注意:抽象类是不能被实例化的。
       同时抽象类和final不能同时出现,因为抽象类时需要被继承的
 抽象方法是没有方法主体的,
 抽象方法出现在抽象类中,
 抽象方法在子类中必须写出实体,即方法重写,除非子类也是抽象类
 意义:
  当我们的类或方法没有具体的业务意义的时候,需要用到抽象。
补充:
 public、protected修饰的方法和成员可以被子类继承;
 而default看是否在同一个包中,在同一个包中可以被子类继承;
 private不可以被继承到。

  二、多态

   多态
1、使用父类的类型引用子类的实例
 /*用数组保存5辆汽车:3轿车2客车*/
 MotoVehicle[] vehicles = new Motovehicle[5];
 vehicles [0] = new Car("1","宝马","宝马550i");
 vehicles [1] = new Car("2","宝马","宝马550i");
 vehicles [2] = new Car("3","宝马","宝马550i");
 vehicles [3] = new Bus("4","宝马","宝马550i");
 vehicles [4] = new Bus("5","宝马","宝马550i");
2、实现多态的步骤:(动态的多态:需要在运行当中才知道该调用什么方法)
 1)编写父类、派生子类
 2)在子类中重写父类的方法
 3)用父类的数据类型引用子类对象
 4)调用重写的方法
 补充:静态的多态叫做方法重载
3、补充
 类型转换instanceof
 我们在使用Employee salary = new Salary("",1,"",2,200000);时,
 用到了向上转换;而Salary s2 = (salary)salary;却是向下转换,
 但是我们不知道转化后是否正确。
 System.out.println(salary instanceof Employee); //true
 System.out.println(salary instanceof Salary);  //true
 System.out.println(salary instanceof Hourly); //false

  三、接口

 1、写法  

public interface 类名();

2、注意问题  

编译的后缀名依然是.java,仍然可以保存为.class;  

接口是没有构造方法的,也不能被实例化

 可以省略掉public 和 abstract  

接口中的方法都是抽象方法

 记住把注释写好!

 在接口中的成员变量都是公有、静态、常量的  

如:public static final name = "abc";

3、实现接口  

implements 后加接口名称  

实现接口的类必须必须实现接口里所有的方法  

一个类可以实现多个接口(类似于多重继承)  

Implements和extends都是is-a的关系  

接口里可以声明属性,默认都是public static final  

接口继承接口是可以多重继承的(一个接口可以继承多个接口)

4、使用接口的原则  

1)使用接口解决多继承  

2)使用接口为外部类添加功能

3)以面向对象的角度考虑,将一个类与生俱来的特征和行为和  

依赖于外部的可选特征和行为分离,让类尽可能的单纯,即接口

5、接口的优点  

1)将设计和实现分离,对外(调用者)隐藏了实现(  而通常调用者也不需要关心实现)  

2)面向接口编程是oop的核心

6、接口和抽象类的区别  

1)接口里的所有方法都是abstract的,所有的属性都是public static final  

2)抽象类是接口的部分实现,既能定义abstract方法,  

也能定义普通方法的属性,比接口更灵活

补充:  

获取当前时间  

Data date = new Date();

  四、静态成员变量

   静态类成员  

用类成员(类变量和类方法)

不需要创建实例,可以通过:  className.variableName的形式直接调用(类名打点调用)

1、静态初始化块  static {   System.out.println("静态代码块");  }

2、非静态初始化块(成员代码块)    {   System.out.println("非静态代码块");  }    

注意:在同一个类中,静态代码块和非静态代码块都在构造器之前被执行。       

当这个类继承父类的时候,非静态代码块在父类的构造方法之后执行   

即:   

静态代码块   

父类构造器   

非静态代码块   

子类构造器        

静态代码块是所有成员共享的,所以创建对象只执行一次。

内部类  

在java中,还可以在类的内部定义类。

这种在类的内部定义的类,称为内部类。  

内部类所在的类称为外部类

内部类的分类  

按位置的不同分为成员内部类(写在类当中)和局部内部类(写在方法当中)  

成员内部类的特例是静态内部类  

局部内部类的特例是匿名内部类

 注意:内部类的方法可以访问外部的成员,但静态内部类只能引用静态成员和方法       

局部内部类调用的成员变量是由final修饰的        

静态内部类的实例化是需要用外部类类名打点实例化的  

成员内部类的创建:   Outter outter = new Outter();   Outter.Inner1 = outter.new Inner1();

局部内部类的创建:   outter.show();(我们已经局部内部类所在的方法中初始化对象)

匿名内部类的创建:   有时候我们局部内部类所在的方法引用到一个接口时,   

而接口的内容很少,我们不想再为接口创建一个类,就要用到   

匿名内部类:    

同上,    

outter.print(new Inter(){     

  @Override     

  public void printflnface(){     

  System.out.pirntln("匿名内部类打印");    

  }   

});       

原文地址:https://www.cnblogs.com/lightskyblue/p/4420206.html