在JAVA中,面向对象由三个特征:封装、继承和多态。

1.封装性:将对象的状态信息隐藏在对象内部,外界无法直接操作和修改。(比如在Person类中的age变量,不希望在Person类外随意直接修改它的值,就需要对这个成员变量进行封装)

  1)目的:①隐藏类的实现细节。②让使用者只能通过事先预定的方法来访问数据。从而可以在该方法里加入控制逻辑,限制对成员变量的不合理访问。③课进行数据检查,从而有利于保证对象信息的完整性。④便于修改,提高代码的可维护性。

  2)含义:将对象的需要隐藏的成员变量和实现细节隐藏起来,不允许外部直接访问。把方法暴露出来,如果外部要对这些成员变量进行调用或修改,必须通过这些方法来进行访问和操作。

访问控制符:(控制级别由小到大) private ---> default ----> protected ----> public

  private:当前类访问权限,只能在当前类内部被访问。使用它来修饰成员变量就可以把成员变量隐藏在该类的内部。

  defalut:(不适用任何访问控制符修饰)包访问权限。default访问控制的成员或外部类可以被相同包下的其他类访问。

  protected:子类访问权限,使用该访问控制符修饰,这个成员既可以被同一个包中的其他类访问,也可以被不同包中的子类访问。多用于继承。

  public:公共访问权限。如果要给成员(包括成员变量、方法和构造器等)或者一个外部类使用public访问控制符修饰,这个成员可以被所有类访问,不管访问类和被访问类是否处于同一个包中。

 

 

2.继承性:就是字面意思,子类继承父类的一些属性及方法。通过extends关键字来实现,实现继承的类被称为子类,被继承的类称为父类。例如Person类中,Man类和Women类继承了Person类,这两个类继承了年龄,姓名等这些属性。

  1)语法格式       修饰符 class 子类  extends 父类{ }

  

public class Fruit
{
    protected double weight;
    public void info(){
        System.out.println("我是一个水果! 重" + weight + "g! ");
                            }
}

public class Apple extends Frutis
{
    public static void main(String[] args)
    {
      Apple a  = new Apple();//创建Apple对象,Apple对象本身没有weight成员变量
      //因为Apple的父类有weight成员变量,也可以访问Apple对象的weight成员变量
      a.weight = 56;
      //调用Apple对象的info()方法
      a.info();
      
    }   
}

  2)子类重写父类的方法:子类扩展了父类,子类是一个特殊的父类,大部分时候,子类总是以父类为基础,额外增加心得成员变量和方法。但也存在特殊情况,子类需要重写父类的方法。比如鸟类是父类,有飞翔这个方法,但是鸵鸟是一种特殊的鸟类,是鸟类的子类,但是鸵鸟不会飞,所以它要重写飞翔这个方法。 

  ①前提:有子类继承父类

override overwrite)

1)要求子类方法的“返回值类型 方法名(参数列表“与父类的方法一样

                    2 )子类方法的修饰符不能小于父类方法的修饰符

若父类方法抛异常,那么子类方法抛的异常类型不能大于父类的。

子父类的方法必须同为static或同为非static的。

 super:如果子类重写了父类的方法,想要调用父类被重写那个方法,就要用到super关键字。Super:可以用来修饰属性、方法、构造器。

       1)当子类与父类中有同名的属性时,可以通过“super.此属性”显式调用父类中的声明的属性。若想调用子类的同名的属性“this.此属性”

  2)当子类重写父类的方法以后,在子类中若像再显式的调用父类的被重写的方法,就需要使用“super.方法”

  3)super修饰构造器:通过在子类中使用”super(形参列表)”来显示调用父类中指定的构造器。

     >在构造器内部,“super(形参列表)“必须要声明在首行!

     >在构造器内部,“this(形参列表)“ 或 ”super(形参列表)“只能出来一个!

     >在构造器中,不显式的调用“this(形参列表)“或”super(形参列表)”其中任何一个,默认调用的是父类空参的构造器!

  建议:设计一个类时,尽量要提供一个空参的构造器。

 

 

3.多态性:JAVA引用变量有两个类型:一个是编译时类型,一个是运行时类型。编译时类型由声明该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。如果编译时类型和运行时类型不一致,就是多态。

        1)多态性的表现:①方法的重载与重写 ②子类对象的多态性

             2)使用的前提:①要有继承关系 ②要有方法的重写

Person p = new Man( );

//虚拟方法调用:通过父类的引用指向子类的对象实体,当调用方法时,实际执行的时子类重写父类的方法

P1.eat();

P1.walk();

p是Person类型的,故只能执行Person里才有的结构,即Man里特有的结构不能调用

    >子类对象的多态性,并不使用于属性。

 

           5) 关于向下转型:

    ① 向下转型,使用强转符:()

ClassCastException,最好在向下转型前,进行判断:instanceof

a是A类的实例,那么a也一定是A类的父类的实例。

                if(p1 instanceof Woman) {

                       Woman w1 = (Woman)p1;

                       w1.shopping();

                }

                if(p1 instanceof Man) {

                       Man m1  = (Man)p1;

                       m1.entertainment();

                }