拓展补充: 面向对象.
面向对象
面向对象的理解:
是Java解决问题的一种思想或是一种解题思路,概括:在Java中,一切都是都是对象。
实质就是:找对象解决问题。
对象:有生命的、无生命的、具体的、抽象的…
思想的由来:基于面向过程的思想
面向过程:
也是一种思想或是一种解题思路,注重强调的是过程(步骤—>方法)。—执行者角色。
面向对象:
注重强调是结果,指挥对象(包含所需的功能—方法)来完成解决问题----指挥者角色
总结:找对象—调用方法; 封装(创建)对象—调用方法;
面向对象特征
封装 继承 多态
类和对象的关系
类:
是一种数据类型,并且是引用类型的一种—class类型,是一个抽象的概念。
抽象:将一种事物的共性的属性和行为的抽取,定义在某一类型中。
映射到Java的世界中来:
一种类型: 使用class关键字来定义
属性:使用变量来描述
行为:使用方法来描述
格式:
修饰符 class 类型名{
一组变量
一组方法
}
对象:
就是这种事物的一个真实的个体
使用关键字new来创建。
格式:
类名 对象名 = new 类名();
访问类中的属性和行为:
对象名.属性名
对象名.方法名(参数)
类中的属性和行为,统称都叫做类的成员。属性:成员变量;行为:成员方法。
根据类可以创建n个对象,每个对象都有自己的属性信息数据,对于对象来说,这些属性也叫做对象的变量或实例变量。(对象也叫做实例)
Person p = new Person()实例化过程(对象的创建):
1.加载person.class文件到方法区
2.在堆中开辟空间,并分配地址值
3.在该空间中,存储属性默认值
4.将地址值赋值给p引用变量
注意:一个class文件只加载一次。
对象数组定义时,需要人工初始化,直接使用会产生空指针异常。
注意问题: 类实例对象数组的定义初始化问题.
成员变量和局部变量的区别
1.定义位置
成员变量 : 定义在类中,方法的外边
局部变量 : 方法上或方法中或语句中
2. 存储位置(内存)
成员变量: 堆中
局部变量: 栈中
3. 生命周期(在内存中时长)
成员变量:随着对象的创建而存在,随着对象被回收而消失
局部变量:随着方法进栈而存在,随着方法出栈而消失
4.有无默认值
成员变量 : 有默认值,可以直接操作
局部变量: 没有默认值,不能直接操作,必须赋值后才可以操作
5.作用域
成员变量: 整个类中都可以使用
局部变量: 只能在哪定义在哪使用,其他地方不可以使用
匿名对象
理解:
指的就是没有名字的对象。即:没有任何引用所指向的对象。
格式:
new 类名();
总结:
创建对象无非访问的就是属性和方法。
1.访问属性: 没有意义,赋值后,对象就成为垃圾,等待被回收
2.访问方法: 有点意义,但是只能调用一次,通常用来测试方法
3.作为方法的返回值
主方法里直接打印--返回的对象是垃圾
主方法定义一个对象接受返回值,再打印输出--返回的对象不是垃圾
4.作为方法的参数传递
封装
概念:
将对象的属性和行为隐藏起来,对外提供公共的访问方式。
隐藏:
使用private关键字修饰属性和行为。
好处:
1.提高了安全性
2.隐藏对象的实现细节
3.提高了复用性
private
私有的意思,是一个权限修饰符。
可以修饰类中的成员,即修饰属性和方法。
被修饰的内容,只能在当前类中访问,其他类中不能直接操作。
public
公共指的就是public修饰的内容。
属性,能对其进行获取和赋值操作。
属性私有化,外部其他类无法访问,因此在当前类中,应该提供访问方式,能间接操作。
在类中提供一个赋值和获取的方法,
格式:
public void set属性名(类型 变量名){}
public 类型 get属性名(){}
名字规范: setXxx getXxx
方法私有化,外部其他类不可以直接操作,可以在类中定义公共方法,在这个方法中调用私有方法,外部类中调用这个公共方法。
this
问题:
成员位置和局部位置 变量名重名。
解决:
使用this关键字即可。
this:代表的是对象的引用,谁调用就代表谁。
可以调用属性和方法。
构造方法
别名: 构造函数、构造器
格式:
构造方法也是方法,是一个比较特殊的方法。
之前定义方法的格式:
修饰符 返回值类型 方法名(参数列表){
…
return 返回值;
}
构造方法格式:
修饰符 方法名(参数列表){
…
}
注意:
1.没有返回值类型,即是不写,不能写成void
2.方法体中不写return 返回值语句,要写也是return;
3.方法名就是类名,与类名大小写一致
4.修饰符是权限修饰符,目前:public private 默认(没有对应的关键字就是空白)
1.什么时候执行?
当创建对象时,会调用构造方法。因此不需要手动调用。
之前创建对象时,类中并没有定义构造方法,那么也能创建对象,说明类中有,系统自动提供的,格式为无参数,空方法体的构造方法。
注意:类中没定义,系统提供。类中定义了,系统不再提供。
2.构造方法的作用?
作用主要是用来给对象的属性进行初始化。
3.有了构造方法需要setXxx()方法吗?
需要,因为对于一个对象来说,构造方法只执行一次,并且时在对象创建时调用的,对于后期属性值的改变,需要使用set方法来完成,而且set方法可以多次调用。
4.构造方法 支持方法重载吗?
支持。在类中,可以定义重载形式的构造方法。
创建对象时,根据new关键字后的格式,匹配到对应的构造方法来执行并进行初始化。
5.重载构造方法间如何调用?
使用 this(实参); 语句来调用,并且要将该语句放在构造方法的第一行。
目的时让 this(参数) 语句优先执行。
注意:重载的构造方法的第一行,不能都是this(),至少要保证有一个构造方法的第一行没有 this(参数);
6.构造方法能调用普通方法吗?普通方法能调用构造方法吗?
可以; 不可以。
对象的创建过程:
Person p = new Person(“张三”,20);
1.加载person.class文件到方法区
2.在栈中有一个引用变量p,用于存储对象的引用值
3.在堆中开辟空间,并分配地址值
4.在空间中存储默认值
5.属性有显示值,那么进行显示初始化
6.执行构造方法初始化
7.将引用值赋值给变量p,说明p引用指向了该空间
定义某一类型时,步骤:
1.属性私有化
2.构造方法
无参数
有参数
3.set和get方法
4.封装一个方法,用于返回属性信息的方法
static关键字
通过以上的代码分析,发现每创建一个对象,都有一个共性的属性值“China”。
这样处理是处理是没问题的。但是当创建的对象很多时会造成空间的浪费;如果该数据值发生了改变,维护数据的成本也变高了。
以上的问题解决就可以使用static关键字来修饰这个共性的属性值,修饰后,就在会在内存中只存储一个china数据,并且这个数据还能被该类的所有对象所共享,一旦修改,只修改一次。
static关键字:
静态的意思,是一个成员修饰符,即可以修饰成员变量,也可以修饰成员方法。
修饰变量(静态变量):
1.随着类的加载而加载,并进行初始化,随着类的消失而消失,生命周期长。
2.优先于对象而存储在内存中。
3.被所有该类的对象所共享
4.与对象无关,不随着对象的改变而改变,因此访问方式有两种:
类名.变量名 推荐
对象名.变量名 不推荐
注意:某个数据(属性值)被所有对象所共享时,才可以使用static修饰。
修饰方法(静态方法):
1.定义的方法,修饰符中包含了static关键字,即静态方法
2.静态方法调用有两种方式
类名.静态方法名 推荐
对象名.静态方法名 不推荐
3.在静态方法中,能出现this关键字吗?不能
4.静态方法不能直接访问非静态成员(变量、方法),可以直接访问静态成员
5.非静态方法即可以访问静态的也可以访问非静态的
静态方法----类方法或静态变量—类变量。
程序执行入口方法:
public static void main(String[] args){}
public static :公共静态
void :返回值类型
main: 方法名,不是关键字,但是要当成关键字去记忆
String[] : 字符串数组
静态变量和成员变量的区别
.
1.称呼上
静态变量: 类变量
成员变量: 对象(实例)变量
2.存储位置
静态变量 :方法区
成员变量 :堆中
3. 生命周期
静态变量:随着类的加载而加载,随着类的消失而消失
成员变量:随着对象的创建而存在,随着对象被回收而消失
4. 访问方式:
静态变量: 类名访问或对象名访问
成员变量: 对象名访问