面向对象、封装、继承、多态

一、面向对象

1.概述

Java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,我们在面向对象思想的指引下,使用Java语言去设计、开发计算机程序。 这里的对象泛指现实中一切事物,每种事物都具备自己的属性和行为。

面向对象的语言中,包含了三大基本特征,即封装继承多态

2.类和对象

类:是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物, 比如人类。

属性:事物的状态信息。比如人的姓名、性别、年龄等。

行为:事物的能做什么。比如人可以用手拿东西,用脚走路等。

对象:是一类事物的具体体现。对象是类的一个实例,必然具备该类事物的属性和行为。比如人类中的一个人。

类和对象的关系:

  • 类是对一类事物的描述,是抽象的。
  • 对象是一类事物的实例,是具体的。
  • 类是对象的模板,对象是类的具体实例。

3.类定义的格式

java用class来声明一个类,一个.java文件中可以有多个类,但是只能有一个public声明的类,并且类名必须与文件名一致。

public class 类名 { 
    //成员变量 
    //成员方法 
}

4.对象

创建对象:

类名 对象名 = new 类名();

使用对象访问类的成员变量和成员方法。

成员变量默认值:

 数据类型默认值
基本类型整数(byte,short,int,long)0
浮点数(float、double)0.0
字符(char)‘\u0000’
布尔(boolean)false
引用类型数组、对象null

5.内存图:

new这个类的时候 Jvm去方法区找有没有这个class 没有就加载到方法区,属性方法这些都是在方法区class中的, Jvm加载完后,就根据这个模板在堆中创建对象,给属性赋默认值,然后在执行你的赋值语句给对象赋值

对象调用方法时,根据对象中方法标记(地址值),去类中寻找方法信息。这样哪怕是多个对象,方法信息只保存一份,节约内存空间。

 

6.成员变量和局部变量区别

  • 在类中的位置不同

成员变量:类中,方法外

局部变量:方法中或者方法声明上(形式参数)

  • 作用范围不一样

成员变量:类中

局部变量:方法中

  • 初始化值的不同

成员变量:有默认值

局部变量:没有默认值。必须先定义,赋值,最后使用

  • 在内存中的位置不同

成员变量:堆内存

局部变量:栈内存

  • 生命周期不同

成员变量:随着对象的创建而存在,随着对象的消失而消失

局部变量:随着方法的调用而存在,随着方法的调用完毕而消失

二、封装

1.概述

面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。封装可以被认为是一个保护屏障,防止该类的代码和数据被其他类随意访问。要访问该类的数据,必须通过指定的方式。适当的封装可以让代码更容易理解与维护,也加强了代码的安全性。

原则:将属性隐藏起来,如果要访问某个属性,提供公共方法对其访问

2.封装的操作

  1. 使用 private 关键字来修饰成员变量。
  2. 对成员变量,提供对应的 getXxx / setXxx 方法。

private 代表最小权限,可以修饰成员变量和成员方法,被private修饰后只能在本类才能访问。

public class User{

    private String name;

    public void setName(String name){
        this.name = name;
    }
    public String getName(){
        return this.name;
    }

}

this含义:this代表所在类的当前对象的引用(地址值),即对象自己的引用。方法被哪个对象调用,this就是哪个方法。

构造方法:

当一个对象被创建时候,构造方法用来初始化该对象,给对象的成员变量赋初始值。Java自动提供了一个无参数构造方法, 一旦自己定义了构造方法,Java就不会提供的默认无参数构造方法。

格式:

修饰符 构造方法名(参数列表){ 
    // 方法体 
}

 

  • 如果你不提供构造方法,系统会给出无参数构造方法。
  • 如果你提供了构造方法,系统将不再提供无参数构造方法。
  • 构造方法是可以重载的。

javaBean:

JavaBean Java语言编写类的一种标准规范。符合 JavaBean 的类,要求类必须是具体的和公共的,并且具有无参数的构造方法,提供用来操作成员变量的 set get 方法。

三、继承

继承 :就是子类 继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为。提高代码的复用性, 类与类之间产生了关系,是多态的前提。
 

 

格式:通过 extends 关键字,可以声明一个子类继承另外一个父类

class 父类 { 
    ... 
}
class 子类 extends 父类 { 
    ... 
}

1.继承特点

  • private修饰的 不能被子类继承。
  • 构造方法不能被子类继承。
  • 通过getter/setter方法访问父类的private成员变量

如果子类父类中出现重名的成员变量,使用 super 关键字,修饰父类成员变量。类似于this。

如果子类父类中出现重名的成员方法,这时的访问是一种特殊情况,叫做方法重写 (Override)。子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强。

方法重写 :子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写。声明不变,重新实现。

构造方法:

  • 构造方法的名字是与类名一致的。所以子类是无法继承父类构造方法的。
  • 构造方法的作用是初始化成员变量的。所以子类的初始化过程中,必须先执行父类的初始化动作。子类的构造方法中默认有一个 super() ,表示调用父类的构造方法,父类成员变量初始化后,才可以给子类使用。
继承后子类构造方法特点 : 子类所有构造方法都会调用父类的无参构造
子类在创建会先把父类加载进内存,子类的所有构造方法中都有一句默认的super();

 

在每次创建子类对象时,先初始化父类空间,再创建其子类对象本身。目的在于子类对象中包含了其对应的父类空
间,便可以包含其父类的成员,如果父类成员非 private 修饰,则子类可以随意使用父类成员。代码体现在子类的
构造方法调用时,一定先调用父类的构造方法。理解图解如下:

 

  • super:代表父类的存储空间标识(可以理解为父亲的引用)
  • this:代表当前对象的引用(谁调用就代表谁)。
子类的每个构造方法中均有默认的super(),调用父类的空参构造。手动调用父类构造会覆盖默认的super()。
super() 和 this() 都必须是在构造方法的第一行,所以不能同时出现。

 

  • Java只支持单继承,不支持多继承。
  • 一个类可以有多个子类。
  • Java支持多层继承(继承体系)
  • 顶层父类是Object类。所有的类默认继承Object,作为父类。
  • 子类和父类是一种相对的概念。

 

三、多态

多态: 是指同一行为,具有多个不同表现形式。

实现前提:

  • 继承或者实现【二选一】
  • 方法的重写【意义体现:不重写,无意义】
  • 父类引用指向子类对象【格式体现】

多态体现的格式:

父类类型 变量名 = new 子类对象 ;

变量名.方法名();

父类类型:指子类对象继承的父类类型,或者实现的父接口类型。
 
当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,执行的是子类重写 后方法。
 
实际开发的过程中,父类类型作为方法形式参数,传递子类对象给方法,进行方法的调用,更能体现出多态的扩展性与便利。
多态的好处,体现在,可以使程序编写的更简单,并有良好的扩展。
 

引用类型转换:

多态的转型分为向上转型与向下转型两种

向上转型:多态本身是子类类型向父类类型向上转换的过程,这个过程是默认的。当父类引用指向一个子类对象时,便是向上转型。

父类类型 变量名 = new 子类类型 ();

如:Animal a = new Cat();

向下转型:父类类型向子类类型向下转换的过程,这个过程是强制的。一个已经向上转型的子类对象,将父类引用转为子类引用,可以使用强制类型转换的格式,便是向下转型。

子类类型 变量名 = ( 子类类型 ) 父类变量名 ;

:Cat c =(Cat) a;

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误。也就是说,不能调用子类拥有,而父类没有的方法。编译都错误,更别说运行了。这也是多态给我们带来的一点"小麻烦"。所以,想要调用子类特有的方法,必须做向下转型。

转型可能会出现 ClassCastException ,类型转换异常!Java提供了 instanceof 关键字,给引用变量做类型的校验

变量名 instanceof 数据类型
如果变量属于该数据类型,返回 true

如果变量不属于该数据类型,返回false

 
 
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值