天天看点

面向对象java的特点_JAVA之面向对象的三大特征总结

在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 )子类方法的修饰符不能小于父类方法的修饰符

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

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

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

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

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

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

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

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

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

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

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

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

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

3)格式:Person p = new Man( );

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

P1.eat();

P1.walk();

4)编译时,人为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();

}