java是一门纯面向对象的程序设计语言,它具有三大特性,分别是封装,继承和多态。
一、封装
封装,就是将对象的属性和方法封装起来,使用户知道对象提供的属性和方法,而不必去探究它的内部实现。比如手机就是一个封装的对象,使用手机打电话的时候你只要输入手机号码就可以了,而不会去管手机是怎样工作的。采用封装的原则可以使对象以外的部分不能随便存取改变对象内部的数据,有效地避免了外部错误对内部数据的影响,并且封装也可提高程序的维护性,当一部分出错的,只要接口没变,其他地方就不用改变。
二、继承
继承按照平常意思可以理解为儿子从父亲那里继承财产,这里的继承和那个继承是同一个意思,只是继承的不是财产,而是属性和方法,并且实体不是儿子和父亲,而是子类和父类。比如动物园有许多动物,其中有鸟,老虎等等。那我们可以编写一个动物类,一个鸟类。动物园中所有的生物都统称为动物类,也就是说动物类有着动物园里所有生物共有的属性和方法。鸟也属于动物,但是每一种动物都有不同的特点,比如鸟会飞,也就是说鸟也有着它自己特有的属性和方法。所以,动物园中的所有动物可以看成是既有着相同的属性和方法,又有着各自特有的属性和方法。而那些相同的属性和方法就可以看成是从父类继承下来的。所以,鸟类是动物类的子类,动物类是鸟类的父类,而在类的声明中。可以用关键字extends来指明其父类。
语法格式:[修饰符] class 子类名 extends 父类名{}
public class Animal{//父类 int age; String sex;//动物都有的属性 public void eat(){ System.out.println("吃东西");//动物都有的方法 } public void sleep(){ System.out.println("睡觉"); } } public class Bird extends Animal{//子类 String type; public void fly() { eat();//调用来自于父类的方法 sleep(); System.out.println("鸟会飞"); } }
子类可以继承父类中所有可以被子类继承的属性和方法,但有几点需注意。
1.只有父类中被public和protected修饰的属性和方法才能被继承,而被private修饰的不能被继承。
2.若子类声明了与父类同名的方法和属性,则父类的属性和方法将被隐藏和覆盖,不能被继承。
public class Animal{//父类 int age; String sex;//动物都有的属性 public void eat(){ System.out.println("吃东西");//动物都有的方法 } public void sleep(){ System.out.println("睡觉"); } } public class Bird extends Animal{//子类 String type; String sex;//动物都有的属性 public void eat(){ System.out.println("吃东西");//动物都有的方法 } public void fly() { sleep(); System.out.println("鸟会飞"); } }//此时父类的sex和eat()将被隐藏和覆盖,子类调用的是自己的sex和eat()而不是父类的。
刚刚说到如果在子类中声明了与父类相同的属性和方法时,父类的该属性和方法将被隐藏,那如果想要使用父类的方法和属性,应该怎么办呢?这就要用的super关键字了。
super关键字主要有两种用途。
1.调用父类的构造方法。
格式:super(参数列表),但这条语句必须是子类构造方法的第一条语句,否则报错。
2.操作被隐藏的属性和方法。
格式:super.属性,super.方法。
public class Animal{ int age; String sex;//动物都有的属性 public Animal(int age,String sex) { this.age = age; this.sex = sex; } public void eat(){ System.out.println("吃东西");//动物都有的方法 } public void sleep(){ System.out.println("睡觉"); } } public class Bird extends Animal{ String type; public Bird(int age,String sex,String type) { super(age,sex);//super调用父类构造方法,放在第一句 this.type = type; } public void eat(){ System.out.println("鸟吃东西");//动物都有的方法 } public void fly() { super.eat();//调用隐藏的方法 sleep(); System.out.println("鸟会飞"); } }
三、多态
多态是java语言的三大特性之一,通常使用方法重载和方法覆盖实现多态。
方法重载是指在一个类中出现多个参数列表不同(可以使参数个数不同,或者参数类型不同,也可以是参数顺序不同)但方法名相同的方法。在方法重载时,方法的返回值不能作为区分方法重载的标志。
而方法覆盖一般特指子类重写父类的方法。比如刚刚bird类中的eat()就覆盖了animal中的eat();覆盖体现了子类补充或修改父类方法的能力,通过覆盖,可以使同一个方法在不同子类中表现出不同的行为。
public class Bird extends Animal{ public void eat(){ System.out.println("鸟吃东西,用啄");//动物都有的方法 } } public class Dog extends Animal{ public void eat(){ System.out.println("狗吃东西,用舔");//动物都有的方法 } }
同样,在方法覆盖是有几点需要注意:
1.之类不能覆盖父类中被final和static修饰的方法
2.子类必须覆盖父类中被abstract修饰的方法,或者也将该方法声明为abstract。
3.子类覆盖父类同名方法时,必须和父类方法的声明一样。
向上转型:一个类可以看做本类类型,也可以看做是其父类或超类类型。取得一个对象的引用并将它看做是其父类的对象,称为向上转型。
例:Animal animal = new Bird(); Animal animal = new Dog(); 此时都是向上转型,但是不能写成 Bird bird = new Animal();