day07.面向对象
课前回顾:
1.方法的重载:
a.概述:方法名相同,参数列表不同
b.什么叫参数列表不同:
个数不同
参数类型不同
参数类型的顺序不同
c.和什么无关:
和返回值无关;和参数名无关
2.面向对象:
a.概述:是java的核心编程思想,讲究的是调用别人写好的功能,直接拿过来用
b.为啥使用:
为了减少代码
c.啥时候使用:
在一个类中想调用其他类中的成员
d.怎么用:
new对象,调用方法
类名直接调用 -> 调用的是别的类的带static的成员
3.类和对象:
a.实体类的定义:
属性:成员变量
行为:成员方法
b.对象:
导包:import 包名.类名
两个类不在同一个包下,需要导包
两个类在同一个包下,不需要导包
创建对象:
类名 对象名 = new 类名()
调用:
对象名.
4.匿名对象
a.概述:没有等号左边的部分,只有new的部分
b.注意:
设计到赋值,不要使用
5.成员变量和局部变量的区别:
a.定义位置不同:
成员:类中方法外
局部:方法内
b.作用范围不同
成员:整个类
局部:方法内部
c.初始化值不同
成员:有默认值
局部:没有默认值,需要先初始化再使用
d.内存位置不同
成员:堆中
局部:栈中
e.生命周期不同
成员:随着对象的创建而创建,随着对象的消失而消失
局部:随着方法的调用而创建,随着方法的执行完毕而消失
5.注意:
如果属性为自定义类型,一定要通过new对象去赋值
今日重点:
all
第一章.封装
面向对象三大特征:
[封装]
继承
多态
1.封装的介绍以及使用
1.封装从生活角度来说:将一个物品封起来,外界不能直接使用
2.封装从java角度来说:将细节隐藏起来(不让外界直接使用),对外提供一套公共的接口(供外界通过这个公共的接口间接使用隐藏起来的细节)
3.举例说明:
a.洗衣机洗衣服:
我们使用洗衣机洗衣服,属于面向对象思想编程
我们使用的时候直接点击按钮,洗衣机就洗衣服了(按钮下的零部件就是我们隐藏起来的细节,按钮就是对外提供的公共接口,我们通过按钮间接操作洗衣机的零部件)
1.封装怎么用:
a.将代码放到一个方法中,方法体就是我们隐藏起来的细节,方法名就是对外提供的公共接口 -> 我们直接通过调用方法名,方法内部的细节就执行了,至于这个方法怎么实现的,我们无需关注,我们只关注调用方法
b.将成员私有化 -> private
private -> 代表的是私有的,被私有化的成员只能在自己当前类中使用
private可以修饰成员变量,也可以修饰方法
2.封装总结一句话:将细节隐藏起来(不让外界直接使用),对外提供一套公共的接口(供外界通过这个公共的接口间接使用隐藏起来的细节)
1.用private修饰成员之后(相当于隐藏细节)
2.提供getxxx/setxxx方法(相当于对外提供的公共接口)
a.setxxx:为属性赋值
b.getxxx:获取属性值
public class Person {
private String name;
private int age;
/**
* 针对私有化的name提供getxxx/setxxx方法
*/
public void setName(String xingMing) {
name = xingMing;
}
public String getName() {
return name;
}
public void setAge(int nianLing) {
if (nianLing <= 0) {
System.out.println("年龄不合法");
} else {
age = nianLing;
}
}
public int getAge() {
return age;
}
}
public class Test01 {
public static void main(String[] args) {
Person person = new Person();
//person.name = "萌姐";
//person.age = 38;
//System.out.println(person.name);
//System.out.println(person.age);
person.setName("萌姐");
person.setAge(-38);
String name = person.getName();
int age = person.getAge();
System.out.println(name+"..."+age);
}
}

2.this 的介绍
1.注意:当成员变量和局部变量重名的时候,遵循"就近原则",先走局部变量
2.this关键字:
a.概述:代表的是当前对象
b.用法:this.成员的
3.this代表的是当前对象,具体代表哪个当前对象呢?
哪个对象调用的this所在的方法,this就代表哪个对象
public class Person {
String name;
public void speak(String name){
System.out.println(this+"...............");
System.out.println(this.name+"您好,我是"+name);
}
}
public class Test01 {
public static void main(String[] args) {
Person person = new Person();
System.out.println(person+"...");
person.name = "沉香";
person.speak("刘彦昌");
System.out.println("====================");
Person person2 = new Person();
System.out.println(person2+"......");
person2.name = "王思聪";
person2.speak("王健林");
}
}

public class Person {
private String name;
private int age;
//为name属性提供get/set方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
//为age属性提供get/set方法
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
public class Test01 {
public static void main(String[] args) {
Person person1 = new Person();
person1.setName("萌姐");
person1.setAge(48);
System.out.println(person1.getName()+"..."+person1.getAge());
System.out.println("=================================");
Person person2 = new Person();
person2.setName("涛哥");
person2.setAge(18);
System.out.println(person2.getName()+"..."+person2.getAge());
}
}

问题:get/set 方法只能对私有属性赋值取值吗?
get/set 方法可以对私有和非私有属性赋值,但是如果属性不是 private 的,我们可以直接调用,用不着 get/set 方法,只有属性私有化了,get/set 方法才有真正的作用
3.构造方法
1.构造方法作用:
主要是new对象的
2.特点:
a.方法名和类名一致
b.没有返回值,连void都没有
3.1 空参构造
1.格式:
public 类名(){
}
2.作用:
new对象使用
3.注意:
a.我们一new,就相当于调用了构造方法
b.jvm会为每个类都提供一个空参构造,不写也有
public class Person {
private String name;
private int age;
//空参构造
public Person(){
System.out.println("我是空参构造");
}
//为name属性提供get/set方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
//为age属性提供get/set方法
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
public class Test01 {
public static void main(String[] args) {
Person person1 = new Person();
}
}
构造方法可以是其他的权限修饰符,比如 private 修饰,如果被 private 修饰了构造方法,我们就不能利用构造方法 new 对象了
3.2 有参构造
1.格式:
public 类名(形参){
为属性赋值
}
2.作用:
a.创建对象
b.为属性赋值
3.注意:
如果写上了有参构造,jvm将不再提供无参构造了,所以建议都写上
public class Person {
private String name;
private int age;
//空参构造
public Person(){
System.out.println("我是空参构造");
}
//有参构造
public Person(String name,int age){
this.name = name;
this.age = age;
}
//为name属性提供get/set方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
//为age属性提供get/set方法
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
public class Test01 {
public static void main(String[] args) {
Person person1 = new Person();
System.out.println("==================");
Person person2 = new Person("张无忌",25);
System.out.println(person2.getName());
System.out.println(person2.getAge());
}
}

问题:既然有参构造既能 new 对象,还能为属性赋值,那么将来我们就不写 set 方法了,可以吗?
java不行 如果我们使用有参构造为属性赋值,我们的代码是: Person p = new Person("张三",18),我们后续需要将p对象的name改成"李四",我们不可能重新new,重新赋值 此时我们可以单独调用setName方法,单独为name赋值
4.标准 JavaBean
JavaBean 是 Java语言编写类的一种标准规范。符合
JavaBean` 的类,要求:
(1)类必须是具体的(非抽象 abstract)和公共的,public class 类名
(2)并且具有无参数的构造方法
(3)成员变量私有化,并提供用来操作成员变量的set
和get
方法。
public class Person {
private String name;
private int age;
//空参构造
public Person(){
System.out.println("我是空参构造");
}
//有参构造
public Person(String name,int age){
this.name = name;
this.age = age;
}
//为name属性提供get/set方法
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
//为age属性提供get/set方法
public void setAge(int age) {
this.age = age;
}
public int getAge() {
return age;
}
}
编写符合JavaBean
规范的类,以学生类为例,标准代码如下:
public class Student {
private int id;
private String name;
public Student() {
}
public Student(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
通用快捷键:
alt+insert
fn+alt+insert
1.无参构造
2.有参构造:
3.get/set 方法
public class Test01 {
public static void main(String[] args) {
Student student = new Student();
student.setId(1);
student.setName("张三");
System.out.println(student.getId()+"..."+student.getName());
System.out.println("=======================");
Student student1 = new Student(2, "李四");
System.out.println(student1.getId()+"..."+student1.getName());
}
}
5.JavaBean 怎么来的(扩展说明)
1.开发要分包分层:
com.atguigu.controller(表现层) 存放接收请求回响应的类-> 和页面打交道
com.atguigu.service(业务层) 存放写业务逻辑的类
com.atguigu.dao/mapper(持久层) 存放和数据库打交道的类
com.atguigu.pojo/entity 存放javabean类的
com.atguigu.utils 存放工具类

5.1.javabean 在开发中的实际运用_添加功能

将页面上发送过来的请求封装到 javabean 中,然后一层一层传递给 dao 层,然后和 sql 语句使用
5.2.javabean 在实际开发中运用_查询功能

将从数据库中查询出来的结果封装成多个 javabean 对象,然后将多个 javabean 对象放到集合中,一起返回给页面,进行展示
封装小结:
1.知道什么是封装吗? 将细节隐藏起来,对外提供公共的接口
2.你知道 private 的作用嘛? 私有化成员,外界不能直接使用
3.知道 set 方法的作用嘛? 为属性赋值
4.知道 get 方法的作用嘛? 获取属性值
5.知道 this 的作用嘛? 区分重名的成员变量和局部变量
6.知道无参构造作用嘛? new 对象的
7.知道有参构造作用嘛? new 对象并为属性赋值
8.知道如何使用快捷键快速生成一个标准 javabean 类嘛? alt+insert
第二章.static 关键字
1.static 的介绍以及基本使用

1.概述: static静态关键字
2.使用:
a.修饰成员变量: static 数据类型 变量名
b.修饰方法:
修饰符 static 返回值类型 方法名(形参){
方法体
return 结果
}
3.static的特点:
a.静态成员属于类成员,静态成员会随着类的加载而加载
b.静态成员会优先于对象存在(非静态成员属于对象的成员)
c.凡是根据static所在的类创建出来的对象,都可以共享这个静态成员
4.调用:
类名直接点
public class Student {
int id;
String name;
static String classRoom;
}
public class Test01 {
public static void main(String[] args) {
//类名直接调用
Student.classRoom = "教研室9";
Student s1 = new Student();
s1.id = 1;
s1.name = "张三";
s1.classRoom = "教研室90";
System.out.println(s1.id);
System.out.println(s1.name);
System.out.println(s1.classRoom);
System.out.println("================");
Student s2 = new Student();
s2.id = 2;
s2.name = "李四";
s2.classRoom = "教研室900";
System.out.println(s2.id);
System.out.println(s2.name);
System.out.println(s2.classRoom);
//System.out.println(s1.classRoom);
}
}
2.static 修饰成员的访问特点
1.在静态方法中能直接访问非静态成员嘛?不能
new对象访问
2.在静态方法中能直接访问静态成员嘛?能
a.在同一个类中 -> 直接调用
b.不在同一个类中 -> 类名调用
3.在非静态方法中能直接访问静态成员嘛?能
a.在同一个类中 -> 直接调用
b.不在同一个类中 -> 类名调用
4.在非静态方法中能直接访问非静态成员嘛?能
a.在同一个类中 -> 直接调用
b.不在同一个类中 -> new对象调用
总结:
1.调用静态的:不管在不在同一个类中,能直接调用就直接调用,不能直接调用类名调用
2.调用非静态的:不管在不在同一个类中,能直接调用就直接调用,不能直接调用就 new 对象调用
java问题1:既然静态的那么好使,直接类名点即可,那么将来写代码能不能将所有的成员都定义成静态的? 不能 原因:静态的属于类成员,会随着类的加载而加载,如果将所有的成员都变成静态的,类一加载,这个类中所有的静态成员都会被加载,包括没有用到的,所以会造成占用内存空间,浪费内存的弊端 问题2:啥时候定义静态成员呢? 静态成员一般情况都是在抽取工具类的时候定义 问题3:啥时候抽取工具类 如果每个类中反复实现同一个功能,此时我们没必要在每一个类中都重复写相同的代码,此时我们就可以将这段代码抽取到一个工具类中
javapublic class ArraysUtils { /** * 工具类中的构造要求私有化 * 不让外界通过构造new对象 */ private ArraysUtils(){} public static void printArray(int[] arr){ System.out.print("["); for (int i = 0; i < arr.length; i++) { if (i == arr.length - 1) { System.out.print(arr[i] + "]"); } else { System.out.print(arr[i] + ","); } } } }
javapublic class Test01 { public static void main(String[] args) { int[] arr = {1, 2, 3, 4, 5}; ArraysUtils.printArray(arr); } }
javapublic class Test02 { public static void main(String[] args) { int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9}; ArraysUtils.printArray(arr); } }
javapublic class Test03 { public static void main(String[] args) { int[] arr = {11,22,33,44,55}; ArraysUtils.printArray(arr); } }