一、面向对象的三大特性:
1.封装:是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是类的特征之一,应该很好理解,像一些私有的,别的类不可以访问了啊,都有访问权限的,比较安全了。
2.继承:指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。继承有三种方式,实现继承、接口继承和可视继承。
3.多态:简单的说就是,允许将子类类型的指针赋值给父类类型的指针。实现多态,有二种方式,方法覆盖,方法重载二、继承
继承就是一种由已有的类创建新类的机制,是指在已有类的基础上扩展功能。继承中分为子类和父类,类可以有两种重要的成员:成员变量和方法。子类的成员中有一部分是子类自己声明定义的,另一部分是从它的父类继承的。
其中子类继承父类中所有的属性和方法,但是对于private的属相和方法,由于这个是父类的隐私,所以子类虽然是继承了,但是没有可以访问这些属性和方法的引用,所以相当于没有继承到。很多时候,可以理解为,没有继承。
(1).子类继承父类的成员变量作为自己的一个成员变量,就好象它们是在子类中直接声明一样,可以被子类中自己声明的任何实例方法操作.
(2).子类继承父类的方法作为子类中的一个方法,就象它们是在子类中直接声明一样,可以被子类中自己声明的任何实例方法调用。
1.Java只支持单一继承,也就是只有一个父类,利用extends 关键字继承;
class A{ }//定义类A
class B{ }//定义类B
class C extends A,B{ //是 错误的,因为同时继承了两个父类 }
2.Java中允许多层继承
class A{ }//定义类A
class B extends A{ }//B继承A
class C extends B{ }//C同时继承B和A
3.当子类拥有和父类相同的方法定义(即返回类型、方法名、参数列表完全相同时,仅方法体不一样),称之为方法重写(OverRide);
方法的重写要尊重“三同一小一大”规则,“三同”即方法名相同,形参列表相同,返回值类型相同。“一小”指的是子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等。“一大”指的子类方法的访问权限应比父类方法更大或相等,尤其需要指出的是,覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法。
class BaseClass{
public static void test(){…}
}
class SubClass extends BaseClass{
public void test(){…}
}
(1)对于子类创建的一个对象,如果子类重写了父类的方法,则运行时系统调用子类重写的方法,如果子类继承了父类的方法(未重写),那么子类创建的对象也可以调用这个方法,只不过方法产生的行为和父类的相同而已。
(2)重写父类方法时不可以降低方法的访问权限
(3)如果重写了父类的方法后使用父类的被重写方法,可以在子类的方法中使用super.被重写方法();
(4)子类不继承父类的构造方法
(5)子类的构造方法必须调用父类的构造方法
(6)如果子类的构造方法中没有显式地调用父类构造方法,也没有使用this关键字调用重载的其它构造方法,则系统默认调用父类无参数的构造方法,相当于省略了super();语句
(7)如果子类构造方法中既未显式调用父类构造方法,而父类中只有有参数的构造方法,没有无参的构造方法,则编译出错
(8)在子类的构造方法中可使用语句super(argument_list) 调用父类的构造方法,但必须作为构造方法的第一条句。
(9)子类在实例化时实际上先调用父类的构造方法,后调用的子类的构造方法。
三、封装
封装是指将对象的状态信息隐藏在对象内部,不允许外部的程序直接访问对象内部的信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。封装是面向对象编程语言对客观世界的模拟,客观世界里的属性都是被隐藏在对象内部,外界无法直接操作和修改。
封装的好处很多:
1、 隐藏类的实现细节
2、 让使用者只能通过预定的方法来访问数据,从而可以在该方法里加入控制逻辑,限制对属性的不合理访问。
3、 可进行数据检查,从而有利于保证对象信息的完整性。
4、 便于修改,提高代码的可维护性。
四、多态性
多态性就是指父类的某个方法被其子类重写时,可以各自产生自己的功能行为。简单来说,多态是具有表现多种形态的能力的特征。当一个类有很多子类时,并且这些子类都重写了父类中的某个方法。那么当我们把子类创建的对象的引用放到一个父类的对象中时,就得到了该对象的一个上转型对象,那么这个上转的对象在调用这个方法时就可能具有多种形态。
多态性就是父类引用可以持有子类对象。这时候只能调用父类中的方法,而子类中特有方法是无法访问的,因为这个时候(编译时)你把他看作父类对象的原因,但是到了运行的时候,编译器就会发现这个父类引用中原来是一个子类的对像,所以如果父类和子类中有相同的方法时,调用的会是子类中的方法,而不是父类的。
(1)对于一个引用类型的变量,Java编译器按照它的声明的类型来处理
(2)对于一个引用类型的变量,运行时Java虚拟机按照它的实际引用的对象来处理
1、子类重写父类的方法
2、编写方法时,调用父类定义的方法
3、运行时,根据实际创建的对象类型动态决定使用哪个方法