除夕特别任务
1. 如何用面向对象的思想来优化你的代码
我们知道 面向对象的核心就是 对象 所以要用面向对象的方法优化大作业 就需要抽象成对象 然后使用类来定义对象的属性和行为 在此基础上 我们还可以充分使用面向对象的三大特性来优化
- 封装 用户的属性(id,地址,密码,报名项目等)使用private修饰符进行修饰 如果需要调用或者修改 设立相应的get和set方法进行操作 这样隐藏了内部的实现细节 只对外提供了必要的方法
- 继承 用户 管理员 评审 都要进行登录操作 所以 我们可以设置一个公有的爸爸(父类) 将登录操作封装在爸爸内部 这样只需要继承爸爸类 就可以使用登录这一方法(检验账户和密码是否一致)
- 多态 如果不想继承上文的父类 想继承其他的父类 我们可以将这一操作定为接口 然后使用方法重写 在每个登录权限的重写各自的登录方法
2. 什么是面向过程、面向对象
简简单单继续经典案例 把大象装进冰箱
首先是面向过程
- 打开冰箱
- 把大象放进去
- 关闭冰箱门
如果是面向对象该怎么做呢 确定两个对象分别是大象 和 冰箱 那么我们就可以创建一个大象类 和 冰箱类 在大象类中封装了大象的属相和行为 在冰箱类中同样封装了冰箱的属性和行为 那么大象装进冰箱的步骤就是
- 冰箱.开门
- 大象.走进去
- 冰箱.关门
是不是很简单
3. String是基本类型吗?
不是
在java中 String是一个类 属于引用类型(包括 类 接口 数组 枚举 引用类型不直接储存数值 而是储存了对象在内存中的地址)
我们可以查看String的源码得知 String之所以能够存储字符串 其内部使用一个字符数组来存储 这个字符数组是私有的 只能使用String类提供的方法来访问
4. 比较两个字符串
要想比较两个字符串 我们就需要字符串的原理 我们刚才说到 String是一个类 是java中的引用类型 不直接存储数值 而是存储对象在内存中的地址,所以直接比较(==)两个字符串其实是比较两个字符串对象的地址是否相同 但是
public class Main {
public static void main(String[] args) {
String a="你好";
String b="你好";
System.out.println(a == b);
}
}
这种情况他的输出值却是 true 这是怎么回事呢?
在上面我们创建String时 是直接为其赋值 在java底层中 创建对象时会先看一下内存(字符串常量池)中是否存在相同内容的字符串 如果不存在就会新开辟一块地址进行存储 但是存在的话(就如图中创建b时)java为了节省内存会直接将a的地址给到他 也就是说a和b共用一块地址 这个地址存储的内容就是“你好”
public class Main {
public static void main(String[] args) {
String a = new String("Hello");
String b = new String("Hello");
System.out.println(a == b);
}
}
如图 如果在创建字符串对象时 是直接new出来 系统默认会重新开辟一块地址 不会搜索内存是否存在该内容 相应的 a和b的地址也不会相同 所以 该程序运行结果为false
那么该如何比较两个字符串内容呢
String提供了equal方法 该方法会逐个字符地比较两个字符串的内容,直到找到不同的字符或比较完所有字符。如果所有字符都相同,则方法返回 true
,否则返回 false
。
public class Main {
public static void main(String[] args) {
String a = new String("Hello");
String b = new String("Hello");
System.out.println(a.equals(b));
}
}
5. String的值能否被修改?
不能
在String源码中 字符数组被final修饰无法被更改
并且在String中 也未提供相应的修改方法
这样 方便在程序中多次使用而不用担心会被错误修改 提高了安全性
恭祝各位新年快乐