1、面向过程与面向对象的思想
面向对象: 我该让谁来做
面向过程: 我该怎么做
2、大象装冰箱
我们把大象装冰箱为例进行分析。
在针对具体的需求,可以使用名词提炼的办法进行分析,寻找具体的对象。
需求:把大象装冰箱里
对象:大象、冰箱
分三步:
1、打开冰箱门
2、将大象装进去
3、关闭冰箱门
分析发现打开、装、关闭都是冰箱的功能。即冰箱对象具备如下功能:
冰箱打开
冰箱存储
冰箱关闭
用伪代码描述,上述需求中有两个具体的事物 大象 和 冰箱
描述大象:
class 大象
{
}
描述冰箱
class冰箱
{
void 打开(){}
void 存储(大象){}
void 关闭(){}
}
当把具体的事物描述清楚之后,需要使用这些具体的事物,Java使用具体的事物,需要通过new关键字来创建这个事物的具体实例。
使用对象:
1、创建冰箱的对象
冰箱 bx = new 冰箱();
2、调用冰箱的功能
对象.功能();
bx.打开();
bx.存储(new 大象());
bx.关闭();
总结:
1、先按照名词提炼问题领域中的对象
2、对对象进行描述,其实就是在明确对象中应该具备的属性和功能
3、通过new的方式就可以创建该事物的具体对象
4、通过该对象调用它以后的功能。
3、对象的内存图
方法进栈,类进堆
4、成员变量和局部变量的差别
成员变量:定义在类中的
局部变量:定义在方法中的变量
区别:
1)定义位置上的区别
成员变量:定义在类中,方法外
局部变量:定义在方法中,语句内
2)作用域不同
成员变量:作用范围是整个类
局部变量:作用范围是方法内,语句内
3)默认值不同
成员变量:有自己的默认值
局部变量:没有默认值,不赋值不能使用
4)内存位置不同
成员变量:跟着对象进入堆内存存储
局部变量:跟着方法进栈内存
5)生命周期不同
成员变量:跟着对象,在堆中存储,内存等待JVM清理
局部变量:跟着方法,方法出栈,生命周期较短
5、方法参数是基本数据类型 或 引用数据类型
public class Person {
String name ;
}
/*
- 方法的参数类型,是基本数据类型,引用数据类型
*/
public class TestPerson {
public static void main(String[] args) {
int a = 1;
function(a);
System.out.println(a);
Person p = new Person();
p.name = "张三";
System.out.println(p.name);
function(p);
System.out.println(p.name);
}
/*
* 定义方法,参数类型是引用数据类型
* 参数是Person类型
* p接受的是一个内存的地址
* main 中的变量p
* function 中的变量p 保存的地址是一样的
*/
public static void function(Person p){
p.name = "李四";
}
/*
* 定义方法,参数类型是基本数据类型
*/
public static void function(int a){
a+=5;
}
}
6、封装
将具体功能封装到方法中,学习对象时,也提过将方法封装在类中,其实这些都是封装。
封装,它也是面向对象思想的特征之一。面向对象共有三个特征:封装,继承,多态。接下来我们具体学习封装。
封装表现:
1、方法就是一个最基本封装体。
2、类其实也是一个封装体。
从以上两点得出结论,封装的好处:
1、提高了代码的复用性。
2、隐藏了实现细节,还要对外提供可以访问的方式。便于调用者的使用。这是核心之一,也可以理解为就是封装的概念。
3、提高了安全性。
7、private关键字
- 新的关键字 private 私有 属于成员修饰符,不能修饰局部变量
- 被private修饰的成员,只能在自己的本类中被使用
- cn.itcast.demo04;
/*
- 描述现实生活中的人的事物
- 属性: 姓名 年龄
- 功能: 说话
- 出现安全问题: age问题,可能出现赋值为负数的情况
- 负数不会导致程序问题,违反生活中的真实情况
- 提高安全问题: 让外面的类,不允许直接调用我的成员变量
- 新的关键字 private 私有 属于成员修饰符,不能修饰局部变量
- 被private修饰的成员,只能在自己的本类中被使用
- 对私有变量,提供公共的访问方式: 方法
*/
public class Person {
//人的姓名,成员变量
String name;
//人的年龄,成员变量
private int age ;
//变量age被私有,提供方法,让外面的类使用
//定义方法,对age变量进行赋值,方法名字,必须set开头
public void setAge(int a){
//对变量参数a进行范围的限制
if(a<0 || a > 200){
//如果a超过范围,手动将age赋值为20
age = 20;
}else{
//如果a没有超过范围,直接对age赋值
age = a;
}
}
//定义方法,对变量age获取值使用,方法名字get
public int getAge(){
return age;
}
//定义人的说话功能,方法中,要求说出自己的姓名和年龄
public void speak(){
System.out.println(name+"..."+age);
}
}
package cn.itcast.demo04;
/*
- 定义好的Person类进行测试
- 创建对象,对象调用属性和方法
*/
public class PersonTest {
public static void main(String[] args) {
//创建Person类的对象 new
Person p = new Person();
//对成员变量赋值
//p.age = -200;
//对成员变量age赋值,只能调用Set方法赋值
p.setAge(50);
p.name = "张三";
//调用类中方法
p.speak();
//输出成员变量age值,必须调用get方法
System.out.println(p.getAge());
}
}
总结:
类中不需要对外提供的内容都私有化,包括属性和方法。
以后再描述事物,属性都私有化,并提供setXxx getXxx方法对其进行访问。
8、私有化Person类带get,set
私有化所有的属性(成员变量),必须有对应的get与set方法
凡是自定义的类,都必须有get与set方法
package cn.itcast.demo05;
/*
- 类描述人:
- 属性: 姓名和年龄
- 方法: 说话
- 私有化所有的属性 (成员变量) ,必须写对应的get/set方法
- 凡是自定义的类,自定义成员变量,应该私有化,提供get/set
- this关键字:
- 区分成员变量和局部变量同名情况
- 方法中,方位成员变量,写this.
*/
public class Person {
private String name;
private int age;
// set方法,变量name,age赋值
public void setAge(int age) {
this.age = age;
}
public void setName(String name) {
this.name = name;
}
// get方法,变量name,age获取值
public int getAge() {
return age;
}
public String getName() {
return name;
}
public void speak() {
String name = "哈哈";
int age = 16;
System.out.println("人在说话 " + this.name + "..." + this.age);
}
}
public class PersonTest {
public static void main(String[] args) {
Person p = new Person();
//调用set方法,对成员变量赋值
p.setAge(18);
p.setName("旺财");
p.speak();
//调用get方法,获取成员变量的值
// System.out.println(p.getName());
// System.out.println(p.getAge());
}
}
9、this关键字——用于解决成员变量和局部变量的重名问题
方法中的局部变量和类中的成员变量,采用就近原则进行变量获取
由于存在成员变量和局部变量同名的情况,此时需要this关键字
所有this.的变量都是类中的成员变量
10、知识点总结
类与对象
类,用于描述多个对象的共同特征,它是对象的模板。
对象,用于描述现实中的个体,它是类的实例。
类的定义:使用关键字class来定义java中的类
格式:
class 类名 {
//属性
数据类型 变量名;
…
//方法
修饰符 返回值类型 方法名(参数){ }
…
}
创建对象:
格式:
类名 对象名 = new 类名();
封装(private关键字)
封装,把对象的属性与方法的实现细节隐藏,仅对外提供一些公共的访问方式
封装的体现:
变量:使用 private 修饰,这就是变量的封装
方法:也是一种封装,封装了多条代码
类: 也是一种封装,封装了多个方法
private关键字,私有的意思
它可以用来修饰类中的成员(成员变量,成员方法)
private的特点:
private修饰的成员只能在当前类中访问,其他类中无法直接访问
this关键字
this关键字,本类对象的引用
this是在方法中使用的,哪个对象调用了该方法,那么,this就代表调用该方法的对象引用
this什么时候存在的?当创建对象的时候,this存在的
this的作用:用来区别同名的成员变量与局部变量(this.成员变量)
public void setName(String name) {
this.name = name;
}