是一种编程的思想,如何组织代码,解决问题
生活中解决问题的思想,使编程变得简单,程序便于理解的思想
1 考试问题:万物对象
老师对象:出试卷
学生对象:考试
老师对象:改试卷
2 买手机问题:
顾客对象
售货员对象
钱对象
手机对象
3 如何在代码中体现出面向对象?
Random r=new Random();-------创建Random对象
Scanner sc=new Scanner(System.in);---------------创建Scannner对象
这两种就是创建对象(Random和Scanner是java中已经存在着的类)
创建新对象的格式:
类名 对象名 =new 类名();
重点学习内容:
(1) 自己如何设计对象
( 2) 已有的对象如何使用
类的概念:对象的设计图
依赖关系:创建对象需要先有类
对象是类的实体:一个类可以创建多个对象
类的本质:就是对事物的描述
例子:
对{学生}进行描述:<张三>,今年<78岁>,<180>的身高,喜欢《吃饭》《学习》
属性:用成员变量表示,和定义变量的格式一样,需要放在类中,方法外部
行为:使用成员方法表示,相比于以前的方法,去掉static关键字
什么定义为属性:对类中名词的描述
行为:对类中动词的描述
// 定义一个类
public class Student {
// 1 属性:姓名 年龄
String name="Zpj";
int age=20;
// 2 行为(用成员方法表示)
public void study(){
System.out.println("学习高数");
}
public void play(){
System.out.println("练习吉他");
}
}
在测试类(含有主方法的类)中创建类的对象:
类名 对象名 =new 类名();
创建的对象存放在堆内存(有new进堆)
对象名.成员变量名
对象名.成员方法名
public class StudentTest {//测试类
public static void main(String[] args) {
/*
在测试类中创建student类的对象
*/
Student stu1=new Student()
System.out.println(stu1.name);
System.out.println(stu1.age);
stu1.study();
}
}
前面的英文字符是全类名:包名+类名(了解)
2 定义类的时候成员变量不用进行赋值(编译器会对变量进行默认初始化),才能体现出由同一类创建出的对象的差异性:
在对象创建之后测试类中才对成员变量进行赋值
1 先在方法区加载出测试类的字节码文件(原因是包含主方法(程序的入口))
2 主方法在栈区中运行:主方法先进栈
3 进入主方法后,运行到创建对象需要先有类(再产生对应的类的字节码文件)
4 创建对象:
(1)等号左边:在栈内存中存放变量(数据类型+变量名)
Student是类(类本身也是一种数据类型,引用数据类型),因此对象本质上也可以称为是一个变量。
5 由于对象根据类创建出的:因此产生的对象中会产生成员变量区和成员方法引用地址区
成员方法引用地址指向的是对应的类中的成员方法
6 将创建好的对象的地址赋值给变量stu
因此对象名(变量名)stu记录的是堆中对象的地址,打印对象名输出的结果是地址。
步骤2: 程序进入主方法:
步骤4: 栈区创建对象(变量)
步骤6: 将对象的地址赋给引用型变量(由这个引用型变量可以找到对应的对象)
步骤7: 定义第二个引用型变量
步骤9: 将第二个对象的地址赋给第二个引用型变量
堆区:
步骤5 :创建对象:有new进堆->在堆中开辟内存空间(根据类产生)并产生地址,其中存放成员变量和成员方法的引用地址
方法区:
步骤1 首先在方法区加载测试类的字节码文件:
步骤3: 在方法区加载其他类的字节码文件
总结:
多个对象中的成员变量是相互独立的
多个对象中的成员方法都是通过对象中的成员方法引用地址找到对应的成员方法,是同一个(方法公用)
将stu1赋值给引用型变量stu2
效果是:stu1和stu2指向的是同一对象
(1)位置不同:
类中方法外—成员变量
方法内部----局部变量
(2)初始化值不同:
成员变量不用进行初始化,有默认的初始化值
局部变量没有默认初始化值,需要在使用前进行手动初始化
(3) 内存中的位置不同:
成员变量在堆区创建(原因是对象的创建在堆中)
局部变量在栈中(方法内)
(4) 生命周期不同:
成员变量的声明周期随对象的创建产生,随对象的消失而消失(对象的地址记录消失后,java会对垃圾对象自动清理)
局部变量随方法的调用而存在,随方法运行结束消失
(5) 变量的作用域(也就是变量的使用范围)不同:
局部变量的作用域是所属方法内部
成员变量的作用域范围是所属的类
总结为一句话:作用域是所属的大括号中
当局部变量和和成员变量出现重名:就近原则
如果想要使用全局变量,要使用this关键字
区分局部变量和成员变量重名问题,
(1)调用本类的成员变量:this.本类成员变量;
(2)调用本类的成员方法:this.本类成员方法();
调用本类的成员方法时候:可以直接省略this.
调用本类的成员变量时候:方法中如果没有出现重名的变量,this才可以省略(否则会按照就近原则)
代表当前对象的引用(也就是当前对象的地址)
谁调用this,this就代表谁的地址(哪个对象调用方法,方法中的this就带代表这个对象的地址)
又称构造器:作用是初始化一个对象,创建对象时候所调用的方法
类中如果没有构造方法,系统会给对象一个默认的构造方法
(1)方法名和类名相同
(2 ) 没有返回值类型和void
(3)没有具体返回值(不能有return语句)
构造方法执行的时机:
在创建对象的时候,就被执行调用,每创建一次对象,就会执行一次构造方法
作用1: 本质作用:创建对象
作用2 :可以在创建对象的时候,给对象的成员变量进行初始化(给构造方法找点事情),为了使初始的数据比较灵活(不固定),可以在创建对象的时候向构造方法中传递参数。
(1) 一个类中如果没有编写构造方法,系统会自动提供一个默认,无参无逻辑的构造方法
(2) 一个类中如果手动编写了构造方法,就不再自动提供无参构造方法,如果需要使用,要自己编写无参构造方法(构造方法也可以重载)
(3) 构造方法不能主动手动去调用
建议:编写类的时候,无参构造和带参构造都手写
有快捷键:
(1)右键,生成选项
(2)魔法插件ptg:插件一键生成get,set方法以及无参和带参构造方法
面向对象三大特征:封装,继承,多态
将数据和处理数据的方法设计到对象当中
(1)能够比较好的维护数据,
(2)使用者不用关心内部如何实现,只需要知道如何使用就可以
八个大字:合理隐藏(用户用不到的),合理暴露
将方法中的public改为private,方法前为private后,该方法的权限仅为所属的类
(1)private
(2)protected
(3)public
(4)default
修饰的是成员:成员变量和成员方法
private访问权限很低,修饰的成员只能在同一个类中访问。但安全性高
比public高一级的默认权限修饰符default:能在同一个包中访问(什么都不写)
//protected:不同包的子类当中
最大的权限修饰符public,可以在同一模块任意位置进行访问
JavaBean意思是实体类:封装数据的类
标准:
(1)类中的成员变量都要设为私有,并且要对外提供相应的get,set方法
(2)类中提供无参和带参构造方法
空参带参构造方法快速生成快捷键:右键,生成
魔法ptg:插件一键生成get,set方法以及无参和带参构造方法
实体类:只负责对数据存取,数据的处理(业务代码 )交给其他的类完成