您的位置 首页 java

一文搞懂java面向对象基本特征

一、类和对象

1.1 面向对象和面向过程的区别

  • 面向过程:面向过程性能比面向对象高。 因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如 单片机 嵌入式 开发、 Linux / Unix 等一般采用面向过程开发。但是, 面向过程没有面向对象易维护、易复用、易扩展。
  • 面向对象 :面向对象易维护、易复用、易扩展。 因为面向对象有封装、继承、多态性的特性,所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护。但是, 面向对象性能比面向过程低。
  • 总结
    • 面向对象就是抽象出一个类,配置数据和方法。
    • 需要什么功能直接使用就可以了,不必去一步一步的实现

1.2 成员变量和局部变量的区别

  • 成员变量属于类, 局部变量 是在方法中定义的变量或是方法的参数
  • 成员变量可以被public, private , static 等修饰符修饰,局部变量不能被访问控制修饰符及static所修饰
  • 成员变量和局部变量都能被final所修饰

2. 存储方式

  • 成员变量存在于堆内存
  • 局部变量存在于栈内存

3. 存活时间

  • 成员变量是对象的一部分,随着对象的创建而存在
  • 局部变量随着方法的调用而自动消失

4. 默认值

  • 成员变量会自动以类型的默认值而赋值(除final修饰的成员变量必须显式赋值)
  • 局部变量不会自动赋值

二、面向对象三大特征

2.1 封装

1. 封装的优点

  • 封装可以隐藏事务的细节(提高了安全性)
  • 封装可以提高程序中代码的复用性

2. 封装的方法

  • 使用private关键字来修饰成员变量
  • 对需要访问的成员变量,提供对应的getXxx方法,setXxx方法。

3. 封装的格式

 public 数据类型 get成员变量名(){
    return 成员变量名;
}
public  void  set成员变量名(数据类型 成员变量名){
    this.成员变量名 = 成员变量名;
}  

2.2 继承

1. 继承

  • 就是子类继承父类的属性和行为,使得子类对象具有父类相同的属性、相同的行为。
  • 子类可以直接访问父类中的非私有的属性和行为。

2. 格式

 class 父类 {
    共性的属性
    共性的行为
}
class 子类  extends  父类类名{
    特有的属性
    特有的行为
}  

3. 特点

  • Java 只支持单继承,不支持多继承
  • Java支持 多重继承 (继承体系)

4. 继承后的特点–成员变量

  • 在继承中子类可以直接使用父类中的非私有的成员变量。
  • 成员变量重名时,基于 就近原则 ,优先使用子类的本身的变量,如果在子类中需要使用父类中重名的成员变量时,需要使用super关键字: super.父类成员变量名
  • 子类不能直接继承父类中私有的成员变量,可以间接使用,通过成员的getXxx()和setXxx()方法进行访问。

5. 继承后的特点–成员方法

  • 在继承中子类可以直接调用父类中非私用的成员方法
  • 如果子父类中出现了一模一样(返回值类型,方法名,参数列表相同)的方法时,称为方法的重写,此时子类在调用方法的时候,调用的是子类重写之后的方法。
  • 子类在重写父类的方法时,访问权限要大于或等于父类方法的访问权限。
  • 子类在重写父类方法时,不能修改父类的方法的访问方式(静态或非静态)
  • 如果子类中存在一个和父类中私有方法相同的方法时,子类中的方法不是重写父类的方法,它属于子类中定义的特有的方法(父类中私有的方法不参与子类方法重写)

6. 继承后的特点– 构造方法

  • 在使用new关键字创建对象的时候,先在堆中给对象分配内存空间,接着给非静态的成员变量进行默认初始化,开始调用对应的构造方法。而在执行 构造函数 中有隐式的三步:
  • super(); 调用父类空参数的构造方法。父类成员变量初始化后,才可以给子类使用。
  • 非静态成员变量显示赋值
  • 构造代码块执行
  • 本构造方法中的代码运行

7. 继承中构造方法注意事项

  • 任何一个类的构造方法中都需要一个隐式的super()语句
    任何子类在继承了父类后,都会继承到父类的成员变量,在创建子类对象的时候,会在子类的对象空间中分配空间存储父类的成员变量,而父类的成员变量显示初始化动作必须由父类自己的构造方法来完成。所以在任何类的构造方法中有一个隐式的super()语句,其目的是为了完成父类的成员变量的初始化动作。
  • 若一个类的构造方法全部私有,这个类是无法再有子类的,就不存在 实例化 问题。
  • 若一个类没有空参数的构造方法,如果这个类还有其他的构造方法可以被访问,那么这个类就可以有子类。这时要求在子类的构造方法中必须手动的书写super()语句,同时在ssuper(具体的参数),根据指定的参数去调用父类类型相同的构造方法。可以创建这个类的对象 new 父类名(参数列表)
  • this调用构造方法和super调用父类构造方法不可以共存,因为this和super调用构造方法都必须在构造函数中的第一行this是调用本类其他构造方法对当前这个对象初始化,而super是调用父类构造方法进行初始化,而初始化动作在一个构造方法中只能有一个在一个类中有多个构造方法,之间可以使用this调用,但是不能形成嵌套调用。最后肯定有一个构造方法中是没有this调用的,最后它中必然会有super语句调用父类的构造方法。

2.3 多态

1. 多态 概述
表示的是一个事物的多种表现形态,同一个事物,以不同的形态表现出来。

2. 多态体现的格式

 父类或接口类型 变量名 = new 子类或实现类对象;
变量名.方法名();

// 父类类型:指子类对象继承的父类类型,或者实现的父接口类型。  

3. 多态的注意事项

  • 在使用多态的时候,只能使用父类的类型接受子类的对象,而不能使用子类的类型接受父类的对象。
  • 当使用多态方式调用方法时,首先检查父类中是否有该方法,若没有,则编译错误,若有,执行的是子类重写后的方法。

4. 多态的弊端

  • 只要有多态的地方,一定发生类型的提升
  • 在多态的使用中,至始至终只要子类对象,没有父类对象产生。

5. 多态中的转型

向上转型

  • 多态本身是子类类型向父类类型向上转换的过程。
 父类类型 变量名 = new 子类类型();  

向下转型

  • 父类类型向子类类型向下转换的过程,强制的。
 子类类型 变量名 = (子类类型)父类变量名;  

6. 向下转型判断格式

 if(父类引用变量名  instanceof  子类对象所属的类型){
    子类类型 变量名 = (子类类型)父类引用;
}  

7. 多态中的成员特点总结

  • 成员变量
    • 是直接使用父类引用操作变量
    • 在多态中,使用父类的引用访问成员变量,代码在编译的时期,需要看父类中有没有这个成员变量,如果有编译通过,没有编译失败。
    • 多态中,使用父类的引用方法成员变量,编译通过的前提下,若直接使用父类引用操作成员变量,这时操作的依然是父类中的成员变量。
  • 成员方法
    • 在多态中,使用父类引用调用成员方法的时候,一般方法都有复写方法
    • 在使用父类引用调用方法的时候,编译时期要看父类中有没有这个方法,有则编译通过,没有编译失败。
    • 运行时,运行子类中复写的方法,若没有复写,则运行父类的方法。

文章来源:智云一二三科技

文章标题:一文搞懂java面向对象基本特征

文章地址:https://www.zhihuclub.com/185954.shtml

关于作者: 智云科技

热门文章

网站地图