文章目录
提示:以下是本篇文章正文内容,可供参考
封装
1.什么是封装
封装:告诉我们,如何正确设计对象的属性和方法
假设我们有一个需求
需求:定义一个类描述人
属性:姓名,年龄
行为:吃饭,睡觉
代码实现:
public class Person {
String name;
int age;
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
上面的例子只涉及到一个对象很容易就能实现,但是涉及到多个对象我们应该怎么办呢
比如:需求:人画圆,请针对这个需求进行面向对象设计
首先这个需求有几个对象?
答:两个,圆对象和人对象
这两个对象是这样设计的
// person类
public class Person {
}
// circle类
public class Circle {
}
但是这个draw方法应该放在哪个类中呢
public void draw()
System.out.println("画圆");
}
答:画圆这个方法应该放在draw方法中
为什么呢?
此时我们就要了解封装的一个重要思想:
对象代表什么,就得封装对应的数据,并提供数据对应的行为
怎么理解呢
就比如说画圆,我们平常画圆圈一般都是用圆规进行的,圆规是一个工具,放在程序中就相当于一个对象。我们使用了圆规画圆圈画成了一个圆圈,就相当于我们创建了一个画圆对象调用了画圆的方法,每个人都可以使用圆规进行画圆对应着每个对象都能调用画圆这个对象的方法。
此时对象代表的是画圆,所以画圆这个类中就封装了半径的属性和画圆的方法。
2.封装的好处
- 自己会正确设计对象
- 对象代表什么,就得封装对应的数据,并提供数据对应的行为
- 降低我们的学习成本,可以少学、少记,或者说压根不用学,不用记对象有哪些方法,有需要时去找就行
Java提供了很多对象及方法供我们使用,有一个jdk文档可以进行方法的查询学习,比如我们常用的Scanner对象就是jdk提供的
private关键字
为什么要学习它呢?
假设我们有一个int age;的属性,这个age我们可以赋值99,120等等甚至还可以赋值负数,这显然不符合要求,需要加以限制。这时private的作用就来了。
什么是private?
- 是一个权限修饰符
- 可以修饰成员(成员变量和成员方法)
- 被private修饰的成员只能在本类中才能访问
使用方法
在属性前加上private关键字即可
例如:
private int age;
此时,我们只能在本类进行访问,调用,外类是访问不到的
这时弊端就出现了,外类无法访问就没法使用这个属性了
解决办法:对外提供get和set方法,我们对set方法加以判断条件即可解决年龄不合法问题代码如下:
public class GirlFriend {
private int age;
// set(赋值)
publt void setAge(int a){
if(a >=18 && a = 50){
age=a;
}else{
System.out.println("非法数据");
}
}
// get(获取)
public int getAge(){
return age;
}
}
此时外界调用setAge方法我们就能加以控制。
get是获取通道
set是赋值通道
注意:
提供“setXxx(参数)”方法,用于给成员变量赋值,方法用public修饰
提供“getXxx()”方法,用于获取成员变量的值,方法用public修饰
3.就近原则和this关键字
首先我们要了解一下成员变量和局部变量
用代码来解释:
public class Gir1Friend {
// 在类中,方法外的是成员变量
private int age;
public void method(){
// 在方法中的是局部变量
int age = 10;
System.out.println(age);
}
}
有一个问题:上面的代码中局部变量和成员变量名字相同,那么输出语句会打印哪个age呢?
此时就涉及到了一个就近原则:
谁离我近,我就用谁
显然输出语句离局部变量更近所以打印的是局部变量的值
但是现在我想打印成员变量的age怎么办?
这时this关键字的作用就体现出来了
我们只需使用this.age就是使用了成员变量的age。
就近原则代码演示:
public class Student {
public int age = 20;
public void method(){
int age = 10;
System.out.println(age);
}
}
public class test {
public static void main(String[] args) {
// 创建对象
Student s = new Student();
s.method();
}
}
运行结果:
把age换成this.age
public class Student {
public int age = 20;
public void method(){
int age = 10;
System.out.println(this.age);
}
}
运行结果:
this的作用?
从上面可以看出来:
作用:可以区别成员变量和局部变量
4.构造方法
构造方法概述
构造方法也叫作构造器、构造函数。
作用:在创建对象的时候给成员变量进行赋值的。
构造方法的格式
public class student {
修饰符 类名(参数){
方法体;
}
)
特点:
1.方法名与类名相同,大小写也要一致
2.没有返回值类型,连void都没有
3.没有具体的返回值(不能由retrun带回结果数据)
构造方法一般有两种:
空参构造方法和有参构造方法
代码演示:
// 空参构造方法
public Student() {
}
// 有参构造方法--带全部参数的构造方法
public Student(int age, String name) {
this.age = age;
this.name = name;
}
特点:
1.方法名与类名相同,大小写也要一致
2.没有返回值类型,连void都没有
3.没有具体的返回值〔不能由retrun带回结果数据)
执行时机:
1.创建对象的时候由虚拟机调用,不能手动调用构造方法
2.每创建一次对象,就会调用一次构造方法
代码演示:
学生类
public class Student {
public int age ;
public String name;
public Student() {
}
public Student(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
测试类
public class test {
public static void main(String[] args) {
// 创建对象
Student s = new Student(23,"xiaobai");
System.out.println(s.getName()+"今年"+s.getAge()+"岁");
}
}
运行结果:
构造方法注意事项
构造方法的定义
如果没有定义构造方法,系统将给出一个默认的无参数构造方法
如果定义了构造方法,系统将不再提供默认的构造方法
构造方法的重载
带参构造方法,和无参数构造方法,两者方法名相同,但是参数不同,这叫做构造方法的重载
推荐的使用方式
无论是否使用,都手动书写无参数构造方法,和带全部参数的构造方法
总结:
1.构造方法的作用?
·创造对象的时候,由虚拟机自动调用,给成员变量进行初始化的。
2.构造方法有几种,各自的作用是什么?
无参数构造方法:初始化的对象时,成员变量的数据均采用默认值。·有参数构造方法:在初始化对象的时候,同时可以为对象进行赋值。
3.构造方法有哪些注意事项?
任何类定义出来,默认就自带了无参数构造器,写不写都有。
一旦定义了有参数构造器,无参数构造器就没有了,此时就需要自己写无参数构造器了。
建议在任何时候都手动写上空参和带全部参数的构造方法
标准的JavaBean类
- 类名需要见名知意(注意驼峰式命名,比如:StudentDao)
- 成员变量使用private修饰
- 提供至少两个构造方法
- 无参构造方法
- 带全部参数的构造方法成员方法
提供每一个成员变量对应的setXxx() / getXxx()如果还有其他行为,也需要写上
代码演示:
public class Student {
// 属性
public int age ;
public String name;
// 空参构造
public Student() {
}
//有参构造
public Student(int age, String name) {
this.age = age;
this.name = name;
}
// get和set方法
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}