Java学习第六天的内容:
一、面向对象与面向过程
二、类与对象
面向对象思想:
面向对象思想
理解:面向对象时基于面向过程的一种编程思想
面向过程:
关注点在于实现功能的细节,需要亲自一步一步的去完成(自己做 )
面向对象:
关注点在于对象身上,对象可以帮助我们去完成具体的功能(让别人帮你做)
面向对象举例:
喝水:
面向过程:自己烧水–>倒在杯子里–>喝水
面向对象:饮水机(对象)帮你烧水
洗衣服:
面向过程:把衣服脱下来–>浸泡–>搓洗–>漂洗–>拧干–>晾起来
面向对象:找洗衣机(对象)帮你洗衣服
面向对象的底层实现还是基于面向过程。
面向特点
- 1)更符合日常的生活习惯
- 2)把复杂的问题简单化
- 3)把我们从执行者变为指挥者
类与对象
类:类是对同一类事物的描述
如电脑类、手机类、学生类、老师类…
【可以理解为同一类事物的统称】
对象:对象是类的具体体现
如一个电脑对象,一个手机对象,一个学生对象…
【对象是类的具体实例,生活中万物皆对象】
一句话总结:类是对象的模板,对象是类的具体实例。
类的定义
定义类的格式
public class 类名{
//成员变量–属性
//成员方法–行为
}
//类名:见名知意(名词)
public class Student{
//成员变量--属性
String name;
int age;
//成员方法--行为
public void eat(){//不要有static关键词修饰
System.out.println("学生吃饭");
}
public void study(){
System.out.println("学生学习");
}
}
创建对象的格式:
类名 对象名=new 类名();//参数的有无依据是否创建有参构造器/无参构造器
//测试类(有main方法的类)
public class Demo1{
public static void main(String[] args){
//创建Student对象
//类名 对象名=new 类名();
Student stu=new Student(); //类也是一种引用数据类型
stu.name="张三";
stu.age=18;
System.out.println(stu.name); //张三
System.out.println(stu.age); //18
//学生对象 调用 eat()方法
stu.eat();
//学生对象 调用 study()方法
stu.study();
}
}
对象的内存【了解】
//Student s1是一个引用类型的变量,引用的是右边对象的地址值
Student stu = new Student(String name,int age);//创建对象时会调用有参构造器
//创建对象并把在堆内存中该对象的地址赋值给stu变量//默认调用无参构造器
Student s1=new Student();//new Student()这才是创建对象
//把s1的地址,赋值给s2
Student s2=s1;
//这个时候 s1和s2存储的是同一个地址(表示同一个对象)
s1.name=“张三”;
s1.age=18;
//使用s2来访问对象的属性,就是s1修改后的值
System.out.println(s2.name); //张三
System.out.println(s2.age); //18
方法执行的内存分析:
当两个引用指向同一对象的内存空间图解:
方法的参数是类类型
实际参数传递的是该类对象的地址
方法的返回值是类类型
实际返回的是该类对象的地址
成员变量和局部变量的区别
1.在类中的位置不一样
1)成员变量:类的{ }里面
2)局部变量: 在方法的{ }里面或者方法()里(方法的参数也是该方法的局部变量)
2.初始化值(默认值)不同
1)成员变量:有默认的初始值(和array类的各数据类型的默认初始值相同)
2)局部变量:没有默认的初始值,如果要想使用,必须手动进行赋值
3.作用域不同
1)成员变量:在整个类中有效
2)局部变量:只在定义的方法中有效
4.生命周期不同
1)成员变量:随着对象的创建而创建,随着对象被垃圾回收而消失
2)局部变量:随着方法的调用(即方法进栈)而创建,随着方法的调用结束(即方法的出栈)而消失
5.内存位置不同
1)成员变量: 在堆内存中
2)局部变量:在栈内存中
三、封装性
封装:把不需要让别人知道的内部细节隐藏,提高程序的运行的安全性,提供公共的访问方式。
private关键字:被private修饰的变量,只能在本类中访问
1)使用private修饰成员变量
2)提供getXxx和setXxx间接的访问成员变量
this关键字: 当成员变量和局部变量重名时,可以使用this来区分
因为当局部变量和成员变量重名时,方法会优先使用自己的局部变量,如果两个变量都想用,就通过this关键字来区分,不重名就不用
this.成员变量 访问本类的成员变量/(标明这个name变量是本类的成员变量)
this.成员方法 调用本类的成员方法//表示(通过对象的地址调用)谁调用这个方法,那么这个方法内部的this就是谁的
【注意:那个对象调用方法,方法内部的this就表示那个对象】
四、构造方法(构造器)
1.构造方法的格式
(就是方便类自己创建对象)
//构造方法的名称一定要和类名相同
public 类名(形式参数){//无参构造器没有参数列表
方法体//无参构造器没有方法体
}
2.构造方法是干什么用的?
构造方法就是用来创建对象的
【每次new对象的时候,就会执行构造方法】
类名 变量 = new 类名();-->就会执行无参构造器
类名 变量 = new 类名(参数列表);-->就会执行有参构造器
3.构造方法的注意事项
1)如果我们没有写构造方法,系统会默认赠送一个空参数的构造方法(所有我们可用直接在main方法中直接写:类名 变量 = new 类名();应为系统会默认赠送一个无参构造器)
2)如果我们写了构造方法,系统不会赠送空参数构造方法,为了防止报错最后把有参构造器和无参构造器都写上
3)有(全)参构造器的作用方便在创建对象时给成员变量赋值,set方法的作用是方便在后期修改数据(修改成员变量的值)
4)提供多种构造器,有多种创建对象的方式
无参构造器的作用,就是我们在创建对象的目的不一定时要给成员变量赋值,也有可能只是想通过无参构造器创建的对象来调用该类所提供的方法
无参构造器和有参构造器的应用,在实际开发过程中更具自己的需求合理使用
new一个对象就是在执行构造方法
小建议:建议我们自己写上空参数构造方法,以防报错
一个标准类的写法
只要一个类中有:1.私有化成员变量,2.无参构造器,3.get/set方法,这个类就是一个JavaBean类(又叫标准类/实体类)(用来封装数据)
/*
描述一个学生类
属性:姓名、年龄
行为:学习、吃饭、睡觉
*/
public class Student{
//属性:姓名、年龄
//private 修饰成员变量,不能被其他类访问(隐藏)
private String name; //null
private int age; //0
//空参数构造方法
public Student(){
}
//有参数构造方法
public Student(String name,int age){
this.name=name;
this.age=age;
}
//提供get和set方法,获取和设置成员变量的值
//alt+insert: 自动生成
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//其他的方法
public void eat(){
System.out.println("年龄为"+age+"的"+name+"在吃饭");
}
public void study(){
System.out.println("年龄为"+age+"的"+name+"在学习");
}
public void sleep(){
System.out.println("年龄为"+age+"的"+name+"在睡觉");
}
}
字节码文件–>.class文件
static修饰的方法才可以直接被其他static修饰的方法调用
idea快捷生成get/set方法和构造器:Alt + Insert
Java学习第七天内容连接:
https://blog.youkuaiyun.com/LJN951118/article/details/88856362