类与对象、封装、构造⽅法

类与对象

⾯向对象思想:
Java 语⾔是⼀种⾯向对象的程序设计语⾔,⽽⾯向对象思想是⼀种程序设计思想,我们在⾯向对
象思想的指引下,使⽤ Java 语⾔去设计、开发计算机程序。这⾥的 对象 泛指现实中⼀切事物,每
种事物都具备⾃⼰的 属性和⾏为 。⾯向对象思想就是在计算机程序设计过程中,参照现实中事
物,将事物的属性特征、⾏为特征抽象出来,描述成计算机事件的设计思想。它区别于⾯向过程
思想,强调的是通过调⽤对象的⾏为来实现功能,⽽不是⾃⼰⼀步⼀步的去操作实现。
举例
洗⾐服:
⾯向过程:把⾐服脱下来 -> 找⼀个盆 -> 放点洗⾐粉 -> 加点⽔ -> 浸泡 10 分钟 -> 揉⼀揉 ->
清洗⾐服 -> 拧⼲ -> 晾起来
⾯向对象:把⾐服脱下来 -> 打开全⾃动洗⾐机 -> 扔⾐服 -> 按钮 -> 晾起来
区别:
⾯向过程:强调步骤。
⾯向对象:强调对象,这⾥的对象就是洗⾐机。
⾯向对象的语⾔中,包含了三⼤基本特征,即封装、继承和多态。
什么是类
类: 是⼀组相关 属性和⾏为 的集合。可以看成是⼀类事物的模板,使⽤事物的属性特征和⾏
为特征来描述该类事物。
现实中,描述⼀类事物:
属性:就是该事物的状态信息。
⾏为:就是该事物能够做什么。
举例:⼩猫。
属性:名字、体重、年龄、颜⾊。
⾏为:⾛、跑、叫。
什么是对象
对象: 是⼀类事物的具体体现。对象是类的⼀个 实例 (对象并不是找个⼥朋友),必然具备
该类事物的属性和⾏为。
现实中,⼀类事物的⼀个实例。
举例:⼀只⼩猫。
属性: tom 5kg 2 years yellow
⾏为:溜墙根⾛、蹦跶的跑、喵喵叫。
类与对象的关系:
类是对⼀类事物的描述,是 抽象的
对象是⼀类事物的实例,是 具体的
类是对象的模板,对象是类的实体
类的定义
属性: 事物的状态信息。 ⾏为: 事物能够做什么。
Java 中⽤ class 描述事物也是如此:
成员变量: 对应事物的属性。 成员⽅法: 对应事物的⾏为
public class ClassName {
 // 成员变量
// 成员⽅法
}
定义类: 就是定义类的成员,包括 成员变量 成员⽅法
成员变量: 和以前定义变量⼏乎是⼀样的。只不过位置发⽣了改变。 在类中,⽅法外
成员⽅法: 和以前定义⽅法⼏乎是⼀样的。只不过把 static去掉。
类的定义格式举例:
public class Student {
 // 成员变量
 String name; // 姓名
 int age; // 年龄
 // 成员⽅法
 // 学习的⽅法
 publicvoid study() {
System.out.println("好好学习,天天向上");
 }
 // 吃饭的⽅法
 publicvoid eat() {
 System.out.println("学习饿了要吃饭");
 }
}
对象的使⽤:
创建对象:
类名 对象名 = new 类名 ();
使⽤对象访问类中的成员:
对象名 . 成员变量 ;
对象名 . 成员⽅法 ();
对象的使⽤格式举例:
public class Test01_Student {
 public static void main(String[] args) {
 // 创建对象格式:类名 对象名 = new 类名();
 Student s = new Student();
 System.out.println(" s: " + s); // com.bonnie.Student@100363
 
 // 直接输出成员变量值
 System.out.println("姓名:" + s.name); // null
 System.out.println("年龄:" + s.age); // 0
 System.out.println("----------");
 // 给成员变量赋值
 s.name = "李发鬓";
 s.age = 18;
 // 再次输出成员变量的值
 System.out.println("姓名:" + s.name); // 李发鬓
 System.out.println("年龄:" + s.age); // 18
 System.out.println("----------");
 // 调⽤成员⽅法
 s.study(); // "好好学习,天天向上"
s.eat(); // "学习饿了要吃饭"
 }
}
成员变量的默认值

 练习:

定义⼿机类:

public class Phone {
 // 成员变量
String brand; // 品牌
 int price; // 价格
 String color; // 颜⾊
 // 成员⽅法
// 打电话
public void call(String name) {
 System.out.println("给" + name + "打电话");
 }
 // 发短信
 public void sendMessage() {
 System.out.println("群发短信");
 }
}

 定义测试类:

public class Test02Phone {
 public static void main(String[] args) {
 // 创建对象
 Phone p = new Phone();
// 输出成员变量值
 System.out.println("品牌:" + p.brand); // null
 System.out.println("价格:" + p.price); // 0
 System.out.println("颜⾊:" + p.color); // null
 System.out.println("------------");
 
 // 给成员变量赋值
 p.brand = "锤子";
 p.price = 2999;
 p.color = "棕色";
 
 // 再次输出成员变量值
 System.out.println("品牌:" + p.brand); // 锤子
 System.out.println("价格:" + p.price); // 2999
 System.out.println("颜⾊:" + p.color); // 棕色
 System.out.println("------------");
 
 // 调⽤成员⽅法
 p.call("杨洋");
 p.sendMessage();
  }
 }
对象内存图
⼀个对象,调⽤⼀个⽅法内存图

两个对象,调⽤同⼀⽅法内存图 :

 ⼀个引⽤,作为参数传递到⽅法中内存图:

成员变量和局部变量区别
变量根据定义位置的不同,我们给变量起了不同的名字。如下图所示:

1.在类中的位置不同 
成员变量:类中,⽅法外
局部变量:⽅法中或者⽅法声明上(形式参数)
2.作⽤范围不⼀样 
成员变量:类中
局部变量:⽅法中
3,。初始化值的不同 
成员变量:有默认值
局部变量:没有默认值。必须先定义,赋值,最后使⽤
4.在内存中的位置不同 
成员变量:堆内存
局部变量:栈内存
5.⽣命周期不同 
成员变量:随着对象的创建⽽存在,随着对象的消失⽽消失
局部变量:随着⽅法的调⽤⽽存在,随着⽅法的调⽤完毕⽽消失

封装:

⾯向对象编程语⾔是对客观世界的模拟,客观世界⾥成员变量都是隐藏在对象内部的,外界⽆法 直接操作和修改。封装可以被认为是⼀个保护屏障,防⽌该类的代码和数据被其他类随意访问。 要访问该类的数据,必须通过指定的⽅式。适当的封装可以让代码更容易理解与维护,也加强了 代码的安全性。

原则:
属性隐藏 起来,若需要访问某个属性, 提供公共⽅法 对其访问。
封装的步骤
1. 使⽤ private 关键字来修饰成员变量。
2. 对需要访问的成员变量,提供对应的⼀对 getXxx ⽅法、 setXxx ⽅法。
封装的操作 -- private 关键字
private 的含义
1. private是⼀个权限修饰符,代表最⼩权限。
2. 可以修饰成员变量和成员⽅法。
3. 被private 修饰后的成员变量和成员⽅法,只在本类中才能访问。
private 的使⽤格式

 private 数据类型 变量名;

1.使⽤ private 修饰成员变量,代码如下:

public class Student {
 private String name;
 private int age;
 }
2. 提供 getXxx ⽅法 / setXxx ⽅法,可以访问成员变量,代码如下:
public class Student {
 private String name;
 private int age;
 
 public void setName(String n) {
 name = n;
 }
 public String getName() {
 return name;
 }
 
 public void setAge(int a) {
 age = a;
 }
 public int getAge() {
 return age;
 } 
}
封装优化 1 -- this 关键字
我们发现 setXxx ⽅法中的形参名字并不符合⻅名知意的规定,那么如果修改与成员变量名⼀
致,是否就⻅名知意了呢?代码如下
public class Student {
 private String name;
 private int age;
 public void setName(String name) {
 name = name;
 }
 public void setAge(int age) {
 age = age;
  }
 }
在修改了 setXxx()
形参变量名后,⽅法并没有给成员变量赋值!这是由于形参变量名与成员变量名重名,导致成员
变量名被隐藏,⽅法中的变量名,⽆法访问到成员变量,从⽽赋值失败。所以,我们只能使⽤
this 关键字,来解决这个重名问题。
this 的含义
this 代表所在类的当前对象的引⽤(地址值),即对象⾃⼰的引⽤。
记住:⽅法被哪个对象调⽤,⽅法中的 this 就代表那个对象。即谁在调⽤, this 就代表谁。
this 使⽤格式
this . 成员变量名 ;
使⽤ this 修饰⽅法中的变量,解决成员变量被隐藏的问题,代码如下:
public class Student {
 private String name;
 private int age;
 public void setName(String name) {
 // name = name;
 this.name = name;
 }
 public String getName() {
 return name;
 }
 public void setAge(int age) {
 // age = age;
this.age = age;
 }
 public int getAge() {
 return age;
 }
}
封装优化 2 -- 构造⽅法
当⼀个对象被创建时候,构造⽅法⽤来初始化该对象,给对象的成员变量赋初始值。
⼩贴⼠:⽆论你与否⾃定义构造⽅法,所有的类都有构造⽅法,因为 Java ⾃动提供了⼀个⽆
参数构造⽅法,⼀旦⾃⼰定义了构造⽅法, Java ⾃动提供的默认⽆参数构造⽅法就会失效。
构造⽅法的定义格式
修饰符 构造⽅法名(参数列表) {
 // ⽅法体
}
构造⽅法的写法上,⽅法名与它所在的类名相同。它没有返回值,所以不需要返回值类型,甚⾄
不需要 void 。使⽤构造⽅法后,代码如下:
public class Student {
 private String name;
 private int age;
 // ⽆参数构造⽅法
 public Student() {}
 // 有参数构造⽅法
 public Student(String name,int age) {
 this.name = name;
 this.age = age;
 }
}
注意事项
1. 如果你不提供构造⽅法,系统会给出⽆参数构造⽅法。
2. 如果你提供了构造⽅法,系统将不再提供⽆参数构造⽅法。
3. 构造⽅法是可以重载的,既可以定义参数,也可以不定义参数。
标准代码 -- JavaBean
JavaBean Java 语⾔编写类的⼀种标准规范。符合 JavaBean 的类,要求类必须是具体的和公共
的,并且具有⽆参数的构造⽅法,提供⽤来操作成员变量的 set get ⽅法。
public class ClassName {
 // 成员变量
 // 构造⽅法
 // ⽆参构造⽅法【必须】
 // 有参构造⽅法【建议】
 // 成员⽅法
 // getXxx()
 // setXxx()
}
编写符合 JavaBean 规范的类,以学⽣类为例,标准代码如下:
public class Student {
 // 成员变量
 private String name;
 private int age;
 
 // 构造⽅法
 public Student() {}
 
 public Student(String name,int age) {
 this.name = name;
 this.age = age;
 }
 
 // 成员⽅法
 public void setName(String name) {
 this.name = name;
 }
public String getName() {
 return name;
 }
 public void setAge(int age) {
 this.age = age;
 }
 public int getAge() {
 return age;
 } }
测试类,代码如下 :
public class TestStudent {
 public static void main(String[] args) {
 // ⽆参构造使⽤
 Student s = new Student();
 s.setName("胡歌");
 s.setAge(18);
 System.out.println(s.getName() + "---" + s.getAge());
 // 带参构造使⽤
 Student s2 = new Student("杨洋", 18);
 System.out.println(s2.getName() + "---" + s2.getAge());
 }
}

构造方法

 构造方法语法结构

构造方法是在类中定义的方法,不同于其他的方法,构造方法的定义有如下两个规则:

  • 构造方法的名称必须与类名相同。
  • 构造方法没有返回值,但也不能写void。

语法:

[访问修饰符] 类名( ) {

      // 构造方法体

}

 通过构造方法初始化成员变量

构造方法常用于实现对象成员变量的初始化。

 this关键字的使用 

this关键字用在方法体中,用于指向调用该方法的当前对象;简单的说:哪个对象调用方法,this指的就是哪个对象。严格来讲在方法中需要通过this关键字指明当前对象。

例如:

为了方便起见,在没有歧义的情况下可以省略this:

在构造方法中,用来初始化成员变量的参数一般和成员变量取相同的名字,这样会有利于代码的可读性,但此处就必须通过this关键字来区分成员变量和参数了(不能省略this)。例如:

 默认构造方法

 构造方法的重载

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值