学习日志 Day 9
//2020年3月27日21:31:40 磊子
Java Day 8
-
面向对象于面向过程
面向对象思想: 面向对象是基于面向过程的编程思想。面向过程:强调的是每一个功能的步骤
面向对象:强调的是对象,然后由对象去调用功能
面向对象的思想特点:
A:是一种更符合我们思考习惯的思想
B:可以将复杂的事情简单化
C:将我们从执行者变成了指挥者
举例:
买电脑:
面向过程:我要买电脑–我要明确买电脑的意义–上网查对应的参数信息–去中关村买电脑–讨价还价–买回电脑
面向对象:我要买电脑–班长去给我买电脑–买回电脑
洗衣服:
面向过程:把衣服脱下来–找一个盆–放点洗衣粉–加点水–浸泡10分钟–揉一揉–清洗衣服–拧干–晾起来
面向对象:把衣服脱下来–打开全自动洗衣机–扔衣服–按钮–晾起来
- 类和对象
我们学习编程语言,其实就是为了把现实世界的事物模拟出来,实现信息化。
我们是如何表示现实世界的事物的呢?
A:属性 就是事物的描述信息
B:行为 就是事物能够做什么
举例:学生
Java语言最基本的单位是类,所以,我们在后面的学习过程中,是通过类来体现现实世界事物的。
类:是一组相关的属性和行为的集合
对象:就是该事物的具体体现
举例:
类 学生
对象 班长
- 类的定义
package com.itheima_02;
/*
* 类的定义:
* 类是用来描述现实世界的事物的
*
* 事物:
* 属性 事物的描述信息
* 行为 事物能够做什么
*
* 类是如何和事物进行对应的呢?
* 类:
* 成员变量
* 成员方法
*
* 需求:写一个学生类
*
* 学生事物:
* 属性:姓名,年龄...
* 行为:学习,吃饭...
*
* 学生类:
* 成员变量:姓名,年龄
* 成员方法:学习,吃饭
*
* 成员变量:和我们前面学习过的变量的定义是一样的。
* 位置不同:类中,方法外
* 初始化值:不需要给初始化值
* 成员方法:和我们前面学习过的方法的定义是一样的。
* 去掉static关键字
*/
public class Student {
//成员变量
//姓名
String name;
//年龄
int age;
//成员方法
//学习的方法
public void study() {
System.out.println("好好学习,天天向上");
}
//吃饭的方法
public void eat() {
System.out.println("学习饿了要吃饭");
}
}
- 学生类的使用
package com.itheima_02;
/*
* Student是一个学生事物描述类,main方法不适合放在它里面。
*
* 使用一个类,其实就是使用该类的成员。(成员变量和成员方法)
* 而我们要想使用一个类的成员,就必须首先拥有该类的对象。
* 我们如何拥有一个类的对象呢?
* 创建对象就可以了?
* 我们如何创建对象呢?
* 格式:类名 对象名 = new 类名();
* 对象如何访问成员呢?
* 成员变量:对象名.变量名
* 成员方法:对象名.方法名(...)
*/
public class StudentDemo {
public static void main(String[] args) {
//格式:类名 对象名 = new 类名();
Student s = new Student();
//System.out.println("s:"+s); //com.itheima_02.Student@193c0cf
//直接输出成员变量值
System.out.println("姓名:"+s.name); //null
System.out.println("年龄:"+s.age); //0
System.out.println("----------");
//给成员变量赋值
s.name = "林青霞";
s.age = 28;
//再次输出成员变量的值
System.out.println("姓名:"+s.name); //林青霞
System.out.println("年龄:"+s.age); //28
System.out.println("----------");
//调用成员方法
s.study();
s.eat();
}
}
- 一个对象的内存图
- 方法共用的内存图
- 两个引用指向同一个对象的内存图
- 成员变量和局部变量
package com.itheima_04;
/*
* 成员变量和局部变量的区别:
* A:在类中的位置不同
* 成员变量:类中,方法外
* 局部变量:方法中或者方法声明上(形式参数)
* B:在内存中的位置不同
* 成员变量:堆内存
* 局部变量:栈内存
* C:生命周期不同
* 成员变量:随着对象的创建而存在,随着对象的消失而消失
* 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失
* D:初始化值的问题
* 成员变量:有默认值
* 局部变量:没有默认值。必须先定义,赋值,最后使用
*/
public class Variable {
int x;//成员变量
public void show() {
int y = 0;//局部变量
System.out.println(x);
System.out.println(y);
}
}
- private关键字的用法
package com.itheima_05;
/*
* 学生类
*
* 通过对象直接访问成员变量,会存在数据安全问题
* 这个时候,我们就想能不能不让外界的对象直接访问成员变量呢?
* 能。
* 如何实现呢?
* private关键字
*
* private:
* 是一个修饰符
* 可以修饰成员变量,也可以修饰成员方法
* 被private修饰的成员只能在本类中被访问
*
* 针对private修饰的成员变量,我们会相应的提供getXxx()和setXxx()用于获取和设置成员变量的值,方法用public修饰
*/
public class Student {
String name;
//int age;
private int age;
public void setAge(int a) {
if(a<0 || a>200) {
System.out.println("你给的年龄有误");
}else {
age = a;
}
}
public int getAge() {
return age;
}
public void show() {
System.out.println("姓名是:"+name+",年龄是:"+age);
}
}
//类
package com.itheima_05;
/*
* 学生类的测试类
*/
public class StudentDemo {
public static void main(String[] args) {
//创建学生对象
Student s = new Student();
s.show();
s.name = "林青霞";
//s.age = 28;
//s.age = -28;
//s.setAge(-28);
s.setAge(28);
s.show();
}
}
- this关键字的用法
package com.itheima_07;
/*
* 学生类
*
* 起名字我们要求做到见名知意。
* 而我们现在的代码中的n和a就没有做到见名知意,所以我要改进。
*
* 如果有局部变量名和成员变量名相同,在局部使用的时候,采用的是就近的原则。
*
* 我们有没有办法把局部变量的name赋值给成员变量的name呢?
* 有。
*
* 什么办法呢?
* 用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;
}
}
- 构造方法
package com.itheima_08;
/*
* 构造方法:
* 给对象的数据进行初始化
*
* 格式:
* 方法名和类名相同
* 没有返回值类型,连void都不能写
* 没有具体的返回值
*
* 构造方法的注意事项:
* A:如果我们没有给出构造方法,系统将会提供一个默认的无参构造方法供我们使用。
* B:如果我们给出了构造方法,系统将不在提供默认的无参构造方法供我们使用。
* 这个时候,如果我们想使用无参构造方法,就必须自己提供。
* 推荐:自己给无参构造方法
* C:构造方法也是可以重载的
*
* 成员变量赋值:
* A:setXxx()方法
* B:带参构造方法
*/
public class Student {
private String name;
private int age;
/*
public Student() {
System.out.println("这是构造方法");
}
*/
public Student() {}
public Student(String name) {
this.name = name;
}
public Student(int age) {
this.age = age;
}
public Student(String name,int age) {
this.name = name;
this.age = age;
}
public void show() {
System.out.println(name+"---"+age);
}
}
package com.itheima_08;
public class StudentDemo {
public static void main(String[] args) {
//如何调用构造方法呢?
//通过new关键字调用
//格式:类名 对象名 = new 构造方法(...);
Student s = new Student();
s.show();
//public Student(String name)
Student s2 = new Student("林青霞");
s2.show();
//public Student(int age)
Student s3 = new Student(28);
s3.show();
//public Student(String name,int age)
Student s4 = new Student("林青霞",28);
s4.show();
}
}