太原理工大学机器人团队20天学习打卡day14
从昨天开始使用的都是myeclipse,今天主要学习的时面向对象的封装性以及构造方法
1、面向对象的封装性
①测试类
public class User {
//年龄
int age;
}
//用户测试类
public class UserTest {
public static void main(String[] args) {
// 创建User对象
User user = new User();
// 访问age
// 读取年龄值【get】
System.out.println("该用户年龄:" + user.age);
// 修改年龄值
user.age = 20;
// 读取年龄值
System.out.println("该用户年龄:" + user.age);
//修改年龄值
/*
这里的age属性显然是完全暴露给外程序的,对于程序员来说可以操作User对象当中的所有细节,
导致User中部分数据不安全。
不建议这样,建议User类型进行封装,建议在外部程序不能随意访问User对象当中的属性
这样可以保证属性的安全
*/
user.age = -100;
}
}
对于当前程序来说:
User类中的age属性在外部程序中可以随意访问,导致age属性不安全。一个User对象表示一个用户,用户的年龄不可能为负数,上述程序当中年龄值为负数,程序运行时并没有报错,这是当前程序存在的缺陷。
②封装性
面向对象包括三大特征:封装,继承,多态
现在讲解封装机制
为什么要封装,封装有什么好处
- 封装之后,对于那个事物来说,看不到这个事物比较复杂的那一面,只能看到该事物简单的那一面。
- 复杂性封装,对外提供简单的操作入口。照相机就是一个很好的封装的案例,照相机的实现原理非常复杂,但是对于是用照相机的人来说,操作起来是非常方便非常便捷的。还有电视机也是封装的,电视机内存实现非常复杂,但是对于使用者来说不需要关心内部的实现原理,只需要会操作遥控器就行。
- 封装之后才会形成真正的对象,真正的独立体
- 封装之后就意味着以后的程序可以重复使用。并且这个事物应该适应性比较强,在任何场合都可以使用。
- 封装之后,对于事物本身,提高了安全性。【安全级别高】
封装的步骤
-
所有属性私有化,使用private关键字进行修饰,private表示私有的,修饰的所有数据只能在本类中访问
-
对外提供简单的操作入口,也就是说以后外部程序想要访问age属性,必须通过这些简单的入口进行访问
- 对外提供两个公开的方法,分别是set方法和get方法
- 想要修改属性,调用set方法
- 想要读取属性,调用get方法
-
set方法的命名规范:
public void set+属性名首字母大写(形参){
}
-
get方法的命名规范:
public 返回值类型 get+属性名首字母大写(){
}
注意:
getter and setter 方法没有static关键字
有static关键字的方法怎么调用:类名.方法名(实参);
没有static关键字的方法怎么调用:引用.方法名(实参);
实例
public class User {
//属性私有化
private int age;
//set方法没有返回值,因为set方法只负责修改数据
/*
public void setAge(int age){
age = age;//java有就近原则,这里其实并没有给age属性赋值,这里的age都是局部变量age
}
*/
//setter
public void setAge(int a){
//编写代码进行安全控制
if(a < 0||a > 150){
System.out.println("对不起,您输入的年龄不合法");
return;
}
//程序可以执行到这里的话,说明a年龄是合法的,则进行赋值运算
age = a;
}
//getter
public int getAge(){
return age;
}
}
public class Usertest {
public static void main(String[] args) {
// 创建User对象
User user = new User();
//编译报错,age属性私有化,在外部程序中不能直接访问
//从此之后age属性非常安全,但是有点太安全了
//对于目前的程序来说age属性彻底访问不到了
//System.out.println("该用户年龄:" + user.age);
//修改
user.setAge(-100);
//读取
System.out.println(user.getAge());
}
}
2、构造方法
构造方法又被称为构造函数/构造器/Constructor
①构造方法的语法结构
[修饰符列表] 构造方法名(形式参数列表){
构造方法体;
}
②普通方法的语法结构
[修饰符列表] 返回值类型 方法名(形式参数列表){
方法体;
}
③区别
- 对于构造方法来说,返回值类型不需要指定,并且也不能写void,只要写上void这个方法就变成了普通方法。
- 对于构造方法来说,构造方法的方法名必须和类型保持一致
④构造方法的作用
- 构造方法存在的意义是,通过构造方法的调用,可以创建对象。
- 创建对象的同时,初始化实例变量的内存空间
⑤构造方法怎么调用
new 构造方法名 (实参列表);
⑥构造方法调用执行结束后有没有返回值
- 每一个构造方法实际上执行结束之后都有返回值,但是这个
return 值;
这样的语句不写。构造方法结束的时候java程序自动返回值,并且返回值类型是构造方法所在类的类型。由于构造方法的返回值类型就是类本身,所以返回值类型不需要编写
当一个类中没有任何构造方法的话,系统默认给该类提供一个无参数的构造方法,这个构造方法被称为缺省构造器
当一个类显示的将构造方法定义出来了,那么系统则不再默认为这个类提供缺省构造器。建议开发中手动的为当前类提供无参数构造方法。因为无参数构造方法太常用了。
构造方法支持重载机制,在一个类当中编写多个构造方法,这多个构造方法显然构成了方法重载
⑦成员变量之实例变量
-
属于对象级别的变量,这种变量必须现有对象才能有实例变量。
-
实例变量在没有手动赋值时,系统赋默认值,那么这个系统默认赋值是在什么时候完成的呢?
是在类加载的时候吗?
- 不是,因为类加载的时候只加载了代码片段,还没来得及创建对象,所以此时实例变量并没有初始化。
- 实际上,实例变量的内存空间是在构造方法执行的过程中完成开辟的
- 系统赋默认值的时候也是在构造方法执行过程当中完成赋值的