面向对象的三大要素:封装,继承,多态
面向对象的思想是如何在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 这种状态(能力)就叫多态性
本文介绍了Java中的面向对象编程思想,重点讲解了封装、继承和多态这三大要素。封装通过类和对象实现,成员变量和局部变量有明显的区别。static关键字用于声明静态成员,静态变量和成员变量在内存中的位置和生命周期不同。多态允许对象表示多个类型,实现方式包括覆盖和重载。此外,还详细讨论了this和super关键字的使用。
1万+

被折叠的 条评论
为什么被折叠?



