2020/09/08 (OO思想)

本文介绍了Java中的面向对象编程思想,重点讲解了封装、继承和多态这三大要素。封装通过类和对象实现,成员变量和局部变量有明显的区别。static关键字用于声明静态成员,静态变量和成员变量在内存中的位置和生命周期不同。多态允许对象表示多个类型,实现方式包括覆盖和重载。此外,还详细讨论了this和super关键字的使用。

面向对象的三大要素:封装,继承,多态

面向对象的思想是如何在java展现的呢? 就是通过类和对象

  • 是一组相关的属性和行为的集合。是一个抽象的概念。
  • 对象是该类事物的具体表现形式。具体存在的个体。
  • 成员变量事物的属性
  • 成员方法事物的行为

一、 成员变量和局部变量的区别:

(1)在类中的位置不同

  • 成员变量:类中方法外
  • 局部变量:方法定义中或者方法声明上

(2)在内存中的位置不同

  • 成员变量:在
  • 局部变量:在

(3)生命周期不同

  • 成员变量:随着对象的创建而存在,随着对象的消失而消失
  • 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失

(4)初始化值不同

  • 成员变量:有默认值
  • 局部变量:没有默认值,必须定义,赋值,然后才能使用

二、static关键字

Static关键字注意事项

  • A:在静态方法中是没有this关键字的

静态是随着类的加载而加载,this是随着对象的创建而 存在的 → 静态比对象先存在

  • B:静态方法只能访问静态的成员变量和静态的成员方法

(1)静态方法:

  • A:成员变量:只能访问静态变量
  • B:成员方法:只能访问静态成员方法

(2)非静态方法:

  • A:成员变量:可以是静态的,也可以是非静态的
  • B:成员方法:可以是静态的成员方法,也可以是非静态的成员方法

为什么静态方法不能访问非静态方法呢?

  • 因为静态方法是随着类的加载而加载的,静态是优于对象存在的,你要访问非静态的东西,可是这时候可能它还不存在。

总结起来一句话:静态只能访问静态

三、静态变量和成员变量

  • 静态变量属于类,所以也称为类变量
  • 成员变量属于对象。所以也称为实例变量(对象变量)

(1)内存中位置不同

  • 静态变量存储于方法区的静态区
  • 成员变量存储于堆内存

(2)内存出现时间不一样

  • 静态变量随着类的加载而加载,随着类的消失而消失
  • 成员变量随着对象的创建而存在,随着对象的消失而消失

(3)调用不同

  • 静态变量可以通过类名调用,也可以通过对象调用
  • 成员变量只能通过对象名调用

四、代码块

(1)静态代码块

概念: 在java类中(方法中不能存在静态代码块)

使用static关 键字和{} 声明的代码块:

执行: 静态代码块在类被加载的时候就运行了,而且只运行一次,并且优 先于各种代码块以及构造函数。

作用: 一般情况下,如果有些代码需要在项目启动的时候就执行, 这时候 就需要静态代码块。比如一个项目启动需要加载的 很多配置文件等 资源,我们就可以都放入静态代码块中。

对类的数据进行初始化,仅仅只执行一次。

(2)构造代码块

概念:在java类中使用{}声明的代码块(和静态代码块的 区 别是少了static关键字):

执行: 构造代码块在创建对象时被调用,每次创建对象都会调用一 次,但是优先于构造函数执行。

作用: 和构造函数的作用类似,都能对对象进行初始化,并且只要 创建一个对象,构造代码块都会执行一次。但是反过来,构 造函数则不一定每个对象建立时都执行(多个构造函数情况 下,建立对象时传入的参数不同则初始化使用对应的构造函 数)。

把多个构造方法中相同的代码可以放到这里,每个构造方法 执行前, 首先执行构造代码块。

(2)局部代码块

用于限定变量的生命周期,及早释放,提高内存利用率。

静态代码块,构造代码块,构造方法的顺序问题

·静态代码块 > 构造代码块 > 构造方法

 

OO思想(Object oriented)翻译过来就是面向对象

1.封装:

也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏

  • public:表明所有对象都可以访问;
  • protected internal:表明同一个程序集内的对象,或者该类对象以及其子类可以访问;
  • internal:表明只有同一个程序集的对象可以访问;
  • protected:表明只有该类对象及其子类对象可以访问;
  • private:表明只有对象本身在对象内部可以访问;

2.继承:

它可以使用现有类的所有功能,并在无需重新编写原来类的情况下对这些功能进行扩展。通过继承创建的新类称为「子类」或「派生类」,被继承的类称为「基类」、「父类」或「超类」。 要实现继承,可以通过 继承和组合 来实现。

  • 为什么需要继承?

(1)提高代码的重用性。
(2)优化代码,方便修改。
(3)类与类之间产生了关系,是多态的前提。

  • 父类中哪些是子类所不能继承的?

(1)私有化的,即用private修饰的成员变量和成员方法。
(2)构造方法。
(3)子类与父类不在同一个包中,父类使用默认访问权限的成员变量和成员方法。

  •  继承的其他特点

(1)单继承
Java中只支持单继承,不支持多继承。
Java虽然不直接支持多继承,但是保留了这种多继承机制,进行改良。

  •  为什么不支持多继承呢?

因为当一个类同时继承两个父类时,两个父类中有相同的方法,那么子类对象调用该方法时,运行哪一个呢?

  • 继承关系下,子类与父类的成员变量同名会有什么影响?

同名看实例化对象是哪个类就以哪个类中的成员变量值为准。
举例:如果new的是子类,则以子类中的值为准;
如果new的是父类,则以父类中的值为准。

  • 继承关系下,子类与父类的成员方法会有什么影响?

调用成员方法,先在子类中查找是否有该方法,有就执行,没有就去父类中查找执行。
父类中没有则直接报错。

super:

  • 子类如何访问父类的属性和方法?

(1)super.属性名
(2)super.方法名()

  • super的三种结构

(1)super.属性名
访问父类的属性: super.name;

(2)super.方法名()
访问父类的方法: super.print();

(3)super();
调用父类构造方法:super(name,age);
注意:该句只能出现在子类构造方法中的第一行。

  • super()的应用及注意事项

(1)super()出现在子类构造方法,表示调用父类的构造方法。
(2)如调用父类带参构造方法,则用:super(参数列表);
(3)super()只能出现在子类构造方法中的第一行。

  • super与this

super:

super关键字代表了父类空间的引用;

super关键字的作用:

(1) 子父类存在着同名的成员(包括变量和方法)时,在子类中默认是访问子类的成员,可以通过super关键字指定访问父类的成员;

(2) 创建子类对象时,默认会先调用父类无参的构造方法,可以通过super关键字指定调用父类的构造方法。
(1) 如果在子类的构造方法上没有指定调用父类的构造方法,那么java编译器会在子类的构造方法内加上super()语句。
(2) super关键字调用父类的构造函数时,该语句必须要是子类构造函数中的第一个语句。
(3) super与this关键字不能同时出现在同一个构造函数中调用其他的构造函数。因为两个语句都需要第一个语句。

区别:
(1) 代表的事物不一致。
① super关键字代表的是父类空间的引用。(并不能代表对象,只是代表一个对象中的一块内存而已)
② this关键字代表的是所属函数的调用者对象。
(2) 使用前提不一致。
① super关键字必须要有继承关系才能使用。
② this关键字不需要存在继承关系也可使用。
(3) 调用构造函数的区别:
① super关键字是调用父类的构造函数。
② this关键字是调用本类的构造函数。

 

this:

  • 定义:

(1)this关键字代表了所属函数的调用者对象,this代表了对象的内存地址(在构造函数中打印this会发现结果是一个内存地址),也就是说哪个对象调用了this所在的函数,那么this就指代哪个对象;

(2)this是指向本类中某一个对象的一个变量,this相当于文章中第一人称的“我”,所有人描述自己的时候都会说“我”,只要读“我”的这个人发生变化,这个“我”指向的人就变了;而this关键字与之类似,this是抽象的,刚开始并不知道是指代谁,this是每一个对象携带的变量,这个变量所指向的都是自己,this只是起到了一个描述的作用:只要有一个具体的对象来执行的时候,this就用这个对象的this,换一个对象,this就变成另一个对象的this,所以只有在执行的时候才知道指向谁。就像文章中的“我”,只有确定了谁是读这篇文章的,才能确定这个“我”指代谁;

(3)this关键字代表的是对象的引用,也就是this在指向一个对象,所指向的对象就是调用该函数的对象引用;

  • this关键字的作用:

(1)如果存在同名的成员变量与局部变量时,在方法内部默认是访问局部变量的数据,可以通过this关键字指定访问成员变量的数据;

(2)在一个构造函数中可以调用另外一个构造函数初始化对象;

  • this关键字要注意的事项:

(1)存在同名的成员变量与局部变量时,在方法的内部访问的是局部变量(Java采取的是“就近原则”的机制访问的);

(2)如果在一个方法中访问了一个变量,该变量只存在成员变量的情况下,那么Java编译器会在该变量的前面添加this关键字;

  • this关键字调用其他的构造函数要注意的事项:

(1)this关键字调用其他的构造函数时,this关键字必须要位于构造函数中的第一个语句;

(2)this关键字在构造函数中不能出现相互调用的情况,因为是一个死循环;

3. 多态:

对象可以表示多个类型【如果A类(新类,也叫派生类)继承了B类(父类,也叫基类),那个A 类就有两个有效类型:新类(自己)的类型和它继承的类(父类)的类型】的能力称为多态性。对象根据所接收的消息而做出动作。同一消息为不同的对象接受时可产生完全不同的行动,这种现象称为多态性。实现多态,有两种方式,覆盖和重载。两者的区别在于:覆盖在运行时决定重载是在编译时决定并且覆盖和重载的机制不同。例如在 Java 中,重载方法的签名必须不同于原先方法的,但对于覆盖签名必须相同。

  • b继承a   b是a的子类,这时 a有a 的属性,和事件,
  • b同时有a的属性和事件,同时有它自己的属性和事件,这时,b 这种状态(能力)就叫多态性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值