继承、抽象、接口、封装

继承、抽象、接口、封装

1、@Override
   注解,要求注解下面的方法必须是重写的
  
2、继承关键字:extends

   public class Animal { 
    String name;
   }
   public class Mouse extends Animal { 

   }

   继承的特性:
   1.子类拥有父类非private的属性,方法

   2.子类可以拥有自己的属性和方法,即子类可以对父类进行扩展

   3.子类可以重写父类方法

   4.Java的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如A类继承B类,B类继承C类,所以按照关系就是C类是B类的父类,B类是A类的父类

   5.提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系)
   
   6.所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承Object类
 
   super关键字:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。

   this关键字:指向自己的引用

   final关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写

   构造方法:
   
   子类不能继承父类的构造器(构造方法或者构造函数),如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。

   如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。

3、抽象关键词:abstract

   public abstract class Monster{

    //public abstract void fly(){};尽管没有方法体,但是方法还是实现了
    //方法后面没有大括号,方法没有实现
    public abstract void fly();
   }

   1.抽象方法一定在抽象类中,抽象方法只包含一个方法名,而没有方法体
   2.抽象方法、抽象类,都是被abstract修饰
   3.抽象方法不能被private和static修饰
   4.构造方法,类方法(用static修饰的方法)不能声明为抽象方法

   5.抽象类不能用new创建对象(实例化)
   6.任何子类必须重写父类的抽象方法,或者声明自身为抽象类
   7.抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样

4、接口关键词:interface
   继承接口关键词:implements

   一个类只能继承一个抽象类,但一个类却可以实现多个接口

   创建接口

   public interface Flyable {
   //public abstract修饰的抽象方法
   //public static final修饰的变量
   }

   public interface Eatable {
   //public abstract修饰的抽象方法
   //public static final修饰的变量
   }

   //实现接口
   public class Bird implements Flyable{
    //必须实现接口中的所有抽象方法,或把类声明为抽象类
   }

   //实现多个接口

   public class BigBird implements Flyable,Eatable {

   }

   接口只能定义static final类型的变量,和抽象方法
   接口并不是类,类描述对象的属性和方法,接口则包含类要实现的方法。
   
   1.接口与类的区别:

   接口不能用于实例化对象。
   接口没有构造方法。
   接口中所有的方法必须是抽象方法。
   接口不能包含成员变量,除了 static 和 final 变量。
   接口不是被类继承了,而是要被类实现。
   接口支持多继承。

   2.接口特性

   接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
   接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
   接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。
   当类实现接口的时候,类要实现接口中所有的方法。否则,类必须声明为抽象的类

   3.抽象类和接口的区别

   抽象类中的方法可以不是抽象方法,但是接口中的方法不行。
   抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的
   接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
   一个类只能继承一个抽象类,而一个类却可以实现多个接口。

   4.接口的继承

   一个接口能继承另一个接口,和类之间的继承方式比较相似。接口的继承使用extends关键字,子接口继承父接口的方法。

   public interface Sports{
       public void setHomeTeam(String name);
       public void setVisitingTeam(String name);
   }
 

   public interface Football extends Sports{
      public void homeTeamScored(int points);
       public void visitingTeamScored(int points);
       public void endOfQuarter(int quarter);
   }

   接口的多继承:

   在Java中,类的多继承是不合法,但接口允许多继承。

   在接口的多继承中extends关键字只需要使用一次,在其后跟着继承接口

   public interface Hockey extends Sports, Football {

   }

5、封装

   封装是指一种将抽象性函式接口的实现细节部份包装、隐藏起来的方法
   封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问
   适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性

   实现封装的步奏:
 
   1.修改属性的可见性来限制对属性的访问(一般限制为private),例如:

   public class Person {
    private String name;
    private int age;
   }

   这段代码中,将 name 和 age 属性设置为私有的,只能本类才能访问,其他类都访问不了,如此就对信息进行了隐藏

   2.对每个值属性提供对外的公共方法访问,也就是创建一对赋取值方法,用于对私有属性的访问,例如:

   public class Person{
    private String name;
    private int age;

    public int getAge(){
        return age;
    }

    public String getName(){
        return name;
    }

    public void setAge(int age){
        this.age = age;
    }

    public void setName(String name){
        this.name = name;
    }
   }