面向对象的三个特征:封装, 继承, 多态
封装
概念:把一部分重复操作的代码写成一个整体, 便于多次使用。 方法, 类等都是封装。一般把不需要对外提供的内容都隐藏起来, 提供公共的方法进行访问。
好处: 便于使用, 提高代码的重用性,安全性。
继承(extends)
前提:至少两个类(java中定义的类都会默认继承Object类)
类与类之间必须是所属关系才能继承, 不能为了简化代码为继承。
抽象(abstract):模糊的, 不具体的。
抽象方法:只有方法头部, 没有方法体。如:public void show();
子类继承父类,那么在子类中可以使用关键字super直接访问父类中的非 private 成员。 如果父类中有抽象的方法, 那么父类必须定义为 abstract 。此时,如果要建立子类对象,就必须把父类中的 abstract 方法全部覆写掉。一般可以把一类事物的公共部分封装成父类。
比如: 要描述书时, 把书的公共部分(书名, 页码等)封装成父类, 然后描述某一本具体书时, 对父类中的方法进行覆写。如下
class Demo_1
{
public static void main(String[] args)
{
MathBook mb = new MathBook();
mb.name();
}
}
abstract class Books
{
abstract void name();
abstract void pagination();
void show()
{
System.out.println("example");
}
}
class MathBook extends Books
{
public void name()
{
System.out.println("mathbook");
}
public void pagination()
{
System.out.println("fivty");
}
}
如果父类中的方法全部为抽象的, 那么可以将父类封装成一个接口(interface); 这时候如果要建立子类对象,就不是用关键字 extends 而是 implements(实现),如下:
class Demo_1
{
public static void main(String[] args)
{
MathBook mb = new MathBook();
mb.name();
}
}
interface Books
{
abstract void name();
abstract void pagination();
}
class MathBook implements Books
{
public void name()
{
System.out.println("mathbook");
}
public void pagination()
{
System.out.println("fivty");
}
}
j
ava只支持单继承, 不支持多继承, 但是可以多重继承(子继承父,父再继承父), 此时 建立子类对象必须前面继承的类中的 abstract 方法都覆写才行。java支持多实现。(比如:Zi implements Fu, Chao)。同样建立子类对象要把前面的接口都覆写掉才行。
java 支持单继承多实现(Zi extends Fu_1 implements Fu_2 , Fu_3 )
子类继承父类, 子类没有建立对象,java不会为子类父类分配空间, 一旦子类建立对象, 那么 java就会为子类和父类都分配空间(static 除外)
多态:
体现:父类的引用指向了子类的对象。比如:父类 fu = new 子类();
· 这时候建立的对象是子类的,但是 fu 是父类的引用。这时候将父类定义为某方法的形参, 那么无论是这个父类的子类对象还是父类本身对象都可以调用这个方法。
比如:(父类名称为 Fu, 子类名称为 Zi)
void show(Fu f); // 这时候无论是传进去父类对象还是子类对象都可以使用。
父类引用指向子类对象称为 向上转型, 此时这个子类对象只能运行父类中有的功能。如果我想运行子类中所特有的功能, 呢么必须向下转型, 即
子类 zi = (子类) fu;
多态中成员方法的特点:
非静态:编译时看父类(父类中有就通过), 运行时看子类(运行子类中的方法体)。
静态:编译运行都看父类。