什么是面向对象
- 要想学明白类和对象一定要明白什么是面向对象。从面向过程中学习什么是面向对象。
- 面向过程是 对象 和 对象之间 协作完成一件事情。(如:小红洗衣服)
类的定义和使用
- 我们用类来确定对象,类里面有 1.成员变量 可以理解为类的属性
2.成员方法 可以理解为类的行为
- 类的定义格式 :// 创建类
class ClassName{
成员变量 ; //也是类的属性
成员方法 ;//类的行为
}
- class为定义类的关键字,ClassName为类的名字(要使用大驼峰的格式命名,即首字母大写),{}中为类的主体。
- 范例:定义一个person类
//创建对象
class Person{ //定义的类,person是类名
public String name; //成员变量 也可以理解为类的属性
public int age;
public void eat(){ //成员方法 也可以理解为类的行为
System.out.println(name+"吃饭!");
}
public void sleep(){
System.out.println(name+"睡觉!");
}
}
实例化对象
1. 确定了对象我们下一步要做的是实例化对象,就是去创建一个对象。通过new关键字来创建/实例化对象。
2. 为什么我们要实例化对象?
做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。
3. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量
范例:实例化一个对象
class Person { //定义的类,person是类名
public String name; //成员变量 也可以理解为类的属性
public int age;
public void eat(){ //成员方法 也可以理解为类的行为
System.out.println(name+"吃饭!");
}
public void sleep(){
System.out.println(name+"睡觉!");
}
}
//实例化对象
public class TestDemo{
public static void main(String args[]){
Person person1=new Person(); //new关键字创建一个对象的实例
person1.name="qiangqiang"; //使用.来访问对象中的属性和方法
person1.sleep();
Person person2= new Person(); //同一个类可以创建多个实例
person2.name= "shanshan";
person2.sleep();
}
}
运行结果:qiangqiang睡觉!
shanshan睡觉!
4.this的引用
public class MyDate { //定义一个类,类就是对象
public int year;
public int month;
public int day;
public void setDate(MyDate this,int year, int month, int day){
this.year = year; //this里面存了myDate对象的引用,和mydDate2
//这个this要写出来,不然就会被当成局部变量,因为形参名与成员变量名相同
this.month = month; //局部变量优先
this.day = day;
}
public void printDate(){ // ()里隐藏了Date this
System.out.println(this.year + "/" + this.month + "/" + this.day);
} //编译器里隐藏的this
public static void main(String[] args){
MyDate myDate = new MyDate(); //通过new关键字new一个对象
myDate.setDate(2022,3,25); //myDate调用setDate(点就是调用的意思),
//于是就给myDate赋值
myDate.printDate();
MyDate myDate2 = new MyDate(); //可以new多个对象
myDate2.setDate(2022,3,28);
myDate2.printDate();
}
}
输出结果:
虽然编译器自己自己通过this引用去访问,也不用我们去传递,但是建议习惯使用this。
this的三种用法
1.this.data 访问成员变量
2.this.func(); 访问成员方法
3.this(); 调用本类中其他构造方法:必须放到第一行!所以只能在当前构造方法中调用一个。
2.this调用成员方法:
public void doClass(){
System out println("正在上课“);
this.doHomeWork();
}
public void doHomeWork(){
System out println("正在写作业“);
}
3.this()调用其他构造方法(本类中)
public Student(){
this(String: "xiaobao",age: 18); //放在第一行
//调用本类中带两个参数的构造方法,第一个String,第二个int类型
System out println("这是不带参的构造方法“);
}
public Student(String name,int age){
this.age = age;
this.name=name;
System out println("这是带两个参数的构造方法“);
}
输出结果:
这是带两个参数的构造方法
这是不带参的构造方法
4.this不能形成环
不能让两个构造函数互相调用
构造方法
当我们实例化对象时:1.为对象分配内存
2.调用合适的构造方法(也可以有别的方法初始化对象下面有讲到)
构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。
注意:一旦用户定义,编译器则不再生成。
- 没有返回值,设为void也不行。
- 名字必须与类名相同。
- 暂时先用public修饰
- 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法) [重载(名字相同,参数列表不同)]
public class Date{
public int year;
public int month;
public int day;
//下面是构造函数,一般用public修饰
//在创建对象时由编译器自动调用,并在对象的生命周期内只调用一次
public Date(int year,int month,int day){ //名字必须和类名相同
this.year=year;
this.month=month;
this.day = day;
System.out.println("Date(int,int,int,)方法被调用了");
}
public void printDate(){
System.out.println(year+"-"+month+"-"+day);
}
public static void main(String[] args) {
Date d =new Date(2021,6,9);
d.printDate();
}
}
输出结果:
- 注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。
- 当没有写构造方法时,编译器自动给一个不加参数的构造方法
- 构造方法可以改变(初始化)当前对象的属性
class Student {
//就地初始化对象
public String name = "Tom";
public int age = 19;
//这个构造方法可以直接让实例化对象重新赋值
public Student(String name,int age) {
this.name=name;
this.age=age;
System.out.println("这是个带参的构造方法");
}
public void doclass() {
System.out.println(name + "正在上课");
}
public void show() {
System.out.println("姓名:" + name + "年龄:" + age);
}
}
public class TestDemo2 {
public static void main(String[] args) {
Student student = new Student("lisa", 9);
student.show();
}
}
输出结果:
构造方法中,可以通过this调用其他构造方法来简化代码
public class Date {
public int year;
public int month;
public int day;
// 无参构造方法--内部给各个成员赋值初始值,该部分功能与三个参数的构造方法重复
// 此处可以在无参构造方法中通过this调用带有三个参数的构造方法
// 但是this(1900,1,1);必须是构造方法中第一条语句
public Date(){
//System.out.println(year); 注释取消掉,编译会失败
this(1900, 1, 1); //this.year = 1900;
//this.month = 1;
//this.day = 1;
}
// 带有三个参数的构造方法
public Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
}
初始化
三种初始化的方法:
- 默认初始化
- 构造方法
- 就地初始化
1.默认初始化
为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?
public class Date {
public int year;
public int month;
public int day;
public Date(int year, int month, int day) {
// 成员变量在定义时,并没有给初始值, 为什么就可以使用呢?
System.out.println(this.year);
System.out.println(this.month);
System.out.println(this.day);
}
public static void main(String[] args) {
// 此处a没有初始化,编译时报错:
// Error:(24, 28) java: 可能尚未初始化变量a
// int a;
// System.out.println(a);
Date d = new Date(2021,6,9);
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/e4cc8f0bc98676d179430747fbf31a63.png)
3.就地初始化
public class Date {
public int year = 1900;
public int month = 1;
public int day = 1;
public Date(){
}
public Date(int year, int month, int day) {
}
public static void main(String[] args) {
Date d1 = new Date(2021,6,9);
Date d2 = new Date();
}
}