java基础4——面向对象、类与对象、成员/局部变量、封装、pr
一、面向对象
面向过程:面对的是过程,动作。动作为主做事情,一步一步执行 强调的是过程(动作)。C语言就是面向过程的,都是以方法为基础,对方法进行调用。 如:打开冰箱, 放入大象, 关上冰箱。
面向对象:面向的是对象,强调的是对象,对象即(实体),比如C++ C# JAVA。如例子中的实体: 冰箱,大象。 冰箱打开, 冰箱存储, 冰箱关闭。 找到冰箱这个实体,就解决了这个例子
总结面向对象的特点:
1.面向对象是常见的一种思考习惯,符合人们的思考习惯。
2.面向对象的出现,将复杂的事情简单化。
3.面向对象的出现,将之前过程中的执行者变成指挥者。(以前我在做动作。现在是命令冰箱做动作)。
面向对象概述
面向对象的编程思想力图使计算机语言中对事物的描述与现实世界中该事物的本来面目尽可能的一致。
类(class)和对象(object)是面向对象思想的核心概念
类是对一类事物描述,是抽象的、概念上的定义
对象是实际存在的该类事务的每个个体,因而也称实例(instance)
Java里面万事万物皆对象
例子
Java的类用于描述现实生活中的事物生活中,在车间通过图纸造汽车。JAVA里面通过类设计汽车,通过new关键字来创建汽车。生活中的汽车在马路上面跑。Java中的汽车在内存中跑。
类和对象说明
类(class)和对象(object)是面向对象方法的核心概念
类与对象的关系:类就是对象的描述,对象就是该类的实例。
定义类就是在定义类中的成员。
类的成员: 成员变量<------>属性 成员方法<------>行为
代码实现:
类的定义
[< 修饰符>] class < 类名> { [<属性>] [<构造器>] [<方法>] }
属性定义:
[<修饰符>] 类型 < 属性名> [=初值]
修饰符 private: 该属性只能由本类的方法访问
修饰符 public:该属性可以被本类以外的方法访问
类型:任何基本类型,如int、boolean或引用类型
属性有时也称为:数据成员(数据),成员变量(变量)
方法定义
<修饰符> <返回类型> <方法名>([< 参数表>]) { [< 语句>] }
修饰符:public,private,protected,static 等
返回类型:return语句传递返回值。没有返回值:void
对象的创建和使用
类的访问机制
在一个类中的访问机制:类中的方法可以直接访问类中的成员变量。(例外:static方法访问非static,编译不通过。)
在不同类中的访问机制:先创建要访问类的对象,再用对象访问类中定义的成员。
二、成员变量和局部变量
成员变量和局部变量的区别
成员变量定义在类中,整个类中都可以使用。局部变量定义在方法代码块中,只在所属的区域有效
成员变量存在于堆内存的对象中,局部变量存在于栈内存的方法中。
成员变量随着对象的创建而产生,随着对象的消失而消失。局部变量随着区域的执行而存在,随着区域的结束而释放。
成员变量都有默认的初始化值,局部变量没有默认的初始化值。
三、封装
封装的概述:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式
优点:
隐藏实现细节,提供公共的访问方式
提高了代码的复用性
提高安全性
原则:
将不需要对外提供的内容都隐藏起来
把属性隐藏,提供公共方法对其访问
示例
四、private与this
private 关键字(意思是私有的)
是一个权限修饰符。
可以修饰成员(成员变量和成员方法)
被private修饰的成员只在本类中才能访问。
private最常见的应用:
把成员变量用private修饰
提供对应的getXxx()/setXxx()方法
一个标准的案例的使用
this关键字:代表所在类的对象引用。简单的说,它就代表当前类的一个对象。
注意:
方法被哪个对象调用,在该方法内部的this就代表那个对象
用法:
解决局部变量隐藏成员变量
static关键字
特点
static是一个修饰符,用于修饰属性和方法。
static修饰的属性被所有的对象所共享。
static优先于对象存在,因为static的成员随着类的加载就已经存在了。
static修饰的成员多了一种调用方式,就可以直接被类名所调用 。 类名.静态成员 。
static修饰的数据是共享数据,对象中的存储的是特有数据。
static修饰的属性和方法属于类,不属于对象
成员变量和静态变量的区别
两个变量的生命周期不同
成员变量随着对象的创建而存在,随着对象的被回收而释放
静态变量随着类的加载而存在,随着类的消失而消失
调用方式不同
成员变量只能被对象调用
静态变量可以被对象调用,还可以被类名调用
别名不同
成员变量也称为实例变量
静态变量称为类变量
数据存储位置不同
成员变量数据存储在堆内存的对象中,所以也叫对象的特有数据
静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据
静态使用的注意事项
静态方法只能访问静态成员。(非静态既可以访问静态,又可以访问非静态)
静态方法中不可以使用this或者super关键字。
主函数是静态的。
五、构造方法
概述:当一个类的实例对象刚产生时,这个类的构造方法就会被自动调用,我们可以在这个方法中加入要完成初始化工作的代码
特点
方法名与类名相同
不用定义返回值类型
没有具体的返回值
作用
给对象进行初始化
注意
不管有没有显式定义构造方法,创建对象都必须要通过构造方法初始化
一个类中如果没有定义过构造方法,那么该类中会有一个默认的空参数构造方法
如果在类中定义了指定的构造方法,那么类中的默认构造方法就没有了
构造方法可以有多个,用于对不同的对象进行针对性的初始化
多个构造方法在类中是以重载的形式来体现的
一般方法VS构造方法(时机、次数)
构造方法:对象创建时,就会调用与之对应的构造方法,对对象进行初始化。
一般方法:对象创建后,需要方法功能时才调用。
构造方法:对象创建时,会调用只调用一次。
一般方法:对象创建后,可以被调用多次.
细节
一般方法不能直接调用构造方法
构造方法如果前面加了void就变成了一般方法。
构造方法中是有返回值的
六、继承
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可--》子类继承了父类,就继承了父类的方法和属性。
通过extends关键字可以实现类与类的继承
格式:class 子类名 extends 父类名 { }
优点:提高代码复用性,使类之间产生关系,为多态提供可能
示例
类的耦合性很强
设计原则:高内聚低耦合。
简单的理解:
内聚就是自己完成某件事情的能力。
耦合就是类与类之间的关系。
继承特点:
Java只支持单继承,不支持多继承。
一个类只能有一个父类,不可以有多个父类。
class SubDemo extends Demo{} //ok
class SubDemo extends Demo1,Demo2…//error
Java支持多层继承(继承体系)
class A{}
class B extends A{}
class C extends B{}
子父类中成员特点
成员变量
当本类的成员和局部变量同名用this区分 当子父类中的成员变量同名用super区分父类 this和super的用法很相似。 this:代表一个本类对象的引用。 super:代表一个父类空间
当成员变量是私有的时候,子类中不具有父类的私有成员
成员方法
当子父类中出现成员函数一模一样的情况,会运行子类的函数。 这种现象,称为覆盖操作。这时函数在子父类中的特性
函数两个特性: 1,重载。同一个类中。overload 2,覆盖。子类中。覆盖也称为重写,覆写。override
覆盖注意事项: 1,子类方法覆盖父类方法时,子类权限必须要大于等于父类的权限。 2,静态只能覆盖静态,或被静态覆盖
super关键字
super的用法和this很像
this代表本类对应的引用。
super代表父类存储空间的标识(可以理解为父类引用,可以操作父类的成员)
用法(this和super均可如下使用)
访问成员变量
this.成员变量 调用本类的成员变量
super.成员变量 调用父类的成员变量
访问构造方法
this(…) 调用本类的构造方法
super(…) 调用父类的构造方法
访问成员方法
this.成员方法() 调用本类的成员方法
super.成员方法() 调用父类的成员方法
继承中构造方法的关系
子类中所有的构造方法默认都会访问父类中空参数的构造方法
因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。
注意:子类每一个构造方法的第一条语句默认都是:super();
子父类中的构造函数-子类的实例化过程
子类中所有的构造函数默认都会访问父类中的空参数的构造函数
父类构造函数无法被继承的,子类构造器必须通过super来默认或者显式的进行调用
注意:supre语句必须要定义在子类构造函数的第一行。因为父类的初始化动作要先完成
总结: 一个对象实例化过程: Person p = new Person();
1.JVM会读取指定的路径下的Person.class文件,并加载进内存, 并会先加载Person的父类(如果有直接的父类的情况下)
2.在堆内存中的开辟空间,分配地址
3.并在对象空间中,对对象中的属性进行默认初始化
4.调用对应的构造函数进行初始化
5.在构造函数中,第一行会先到调用父类中构造函数进行初始化
6.父类初始化完毕后,在对子类的属性进行显示初始化
7.在进行子类构造函数的特定初始化
8.初始化完毕后,将地址值赋值给引用变量