面向对象的三大特征:封装、继承和多态。(抽象)
一、封装
隐藏对象内部的复杂性,只对外公开简单的接口,便于外界调用,从而提高系统的可扩展性,可维护性。
程序设计要求:高内聚,低耦合。
高内聚:就是类的内部数据操作细节自己完成,不允许外部干涉。
低耦合:仅暴露少量的方法给外部调用。
成员访问权限:
1、public公共的:可以北项目中的所有类访问。(项目可见性)
2、protected受保护的:可以被这个类本身访问;同一个包中的所有其他类访问;被他的子类(同一个包,以及不同包中的子类)访问。(子父类可见性)
3、default/friendly默认的:被这个类本身访问;被同一个包中的类访问。(包可见性)
4、private私有的:只能被这个类访问。(类可见性)
类访问权限
类的属性处理:1、一般使用private。(除非本属性确定会让子类继承)。
2、提供相应的set/get方法来访问相关属性。这些方法通常是public,从而提供对属性的读取操作。(注意:boolean变量get的方法是用is开头!)
3、一些只用于本类的辅助性方法可以用private,希望其他类调用的方法用public。
二、继承extends
继承的作用:类是对对象的抽象,继承是对某一批类的抽象,从而实现对现实世界更好的建模;提高代码的复用性!
注意:1、java中只有单继承,没有像c++那样的多继承。多继承会引起混乱,使得继承链过于复杂,系统难于维护。就像我们现实中,如果你有多个父母亲,那是一个多么混乱的世界。多继承,就是为了实现代码的复用性,却引入了复杂性,使得系统类之间的关系混乱。
2、java重的多继承,可以通过接口来实现。
3、如果定义一个类时,没有调用extends,则它的父类是:java.lang.Object
public class TestExtends {
public static void main(String[] args) {
Mammal m1 = new Mammal();
m1.puru();
m1.eat();
}
}
class Animal {
String eyes="眼睛";
String name="无名";
public void eat(){
System.out.println("动物吃东西!");
}
}
class Mammal extends Animal {
//哺乳
public void puru(){
System.out.println("小动物吃奶!");
}
}
三、多态
多态:多态性是OOP中的一个重要特性,主要是用来实现动态联编的,换句话说,就是程序最终状态只有在执行过程中才被决定而非在编译器件就决定了。这对于大型系统来说能提高系统的灵活性和扩展性。
多态包含:重写:在子、父类之间,子类的方法名、返回值和参数列表同父类一样,但方法体却不同。
重载:在同一个类中,方法名相同,方法的参数类型不同(类型、顺序和个数)。
多态存在的3个必要条件:
要有继承;要有方法重写;父类引用指向子类对象。
class Animal {
int age=10;
public void shout(){
System.out.println("叫了一声!");
}
}
class Dog extends Animal {
int age=28;
public void shout() {
System.out.println("旺旺旺!");
}
public void gnawBone(){
System.out.println(“我在啃骨头");
}
}
class Cat extends Animal {
int age=18;
public void shout() {
System.out.println("喵喵喵喵!");
}
}
package object;
public class TestPolym {
public static void main(String[] args) {
Animal animal = new Dog(); //向上可以自动转型
System.out.println(animal.age); //属性调用时,仍然是基类的属性。属性没有多态!
// animal.shout();
animalCry(new Dog());
//传的具体是哪一个类就调用哪一个类的方法。大大提高了程序的可扩展性。
//如果没有多态,我们这里需要写很多重载的方法。如果增加一种动物,就需要重载一种动物的喊叫方法。非常麻烦。
//有了多态,只需要增加这个类继承Animal基类就可以了。
animalCry(new Cat());
Dog dog = (Dog) animal; //编写程序时,如果想调用运行时类型的方法,只能进行类型转换。不然通不过编译器的检查。
dog.gnawBone();
System.out.println(dog instanceof Animal);
System.out.println(animal instanceof Cat);
System.out.println(animal instanceof Dog);
}
static void animalCry(Animal a){
a.shout();
}