类和对象的关系
-
类和对象之间是抽象和具体的关系。类是一个模板,是对一类事物的抽象描述,而对象是用于表示该类中的个体。类是在对象之上的抽象,对象则是类的具体化,是类的实例。类必须通过对象才可以使用,而对象的属性和行为必须在类中定义
-
类(Class)是java代码的基本组织模块,是用来描述一组具有共同属性和行为对象的基本原型。是对这组对象的概括,归纳和描述。类是对象的模板,它定义了本类对象的所拥有的属性集和行为集,是对一组具有相同属性和相同方法的对象的定义
-
对象(Object)是一个应用系统中的用来描述客观事实的实体,是有特定属性和行为(方法)的基本运行单位,是类的一个特殊状态下的实例。对象可以是一个实体、一个名词、一个可以想象为有自己标识的任何东西
,可以概括为“万物皆对象”
-
面向对象的本质就是:以类的方式组织代码,以对象来组织(封装)数据
如何写一个类?只用回答两个问题
- 它有什么?------------------------>类的属性
- 它能做什么?--------------------->类的方法
package com.etime01;
//定义了一个手机类
public class Mobile {
//手机有哪些属性------品牌、颜色、价格等------------>把这些属性转换成代码来描述出来
String brand = "vivo";
String color = "紫色";
int price = 2999;
//手机有哪些功能(方法)--------发短信、打电话------------->把这些方法转换成代码来描述出来
//定义了一个发短息的方法
public void sendMessage(){
System.out.println("发短信");
}
//定义了一个打电话的方法
public void call(){
System.out.println("打电话");
}
}
package com.etime01;
public class Test {
public static void main(String[] args) {
/**
* 使用非静态方法和非静态属性必须通过new关键字来生成一个对象,然后通过对象来调用非静态方法和飞惊天睡醒
*/
//创建一个对象
Mobile m1 = new Mobile();
//调用对象m1的一些属性
System.out.println(m1.brand); //调用m1的brand属性
System.out.println(m1.color); //调用m1的color属性
System.out.println(m1.price); //调用m1的price属性
//调用对象m1的一些方法
m1.sendMessage(); //调用对象m1的sendMessage()方法
m1.call(); //调用对象m1的call()方法
}
}
创建并初始化对象
-
使用new关键字创建对象
-
使用new关键字创建对象时,除了分配内存空间外,还会给创建好的对象进行默认的初始化,以及对类中构造器的调用
//创建一个Student类
package OOP;
public class Student { //类里面永远只有属性和方法
//属性:字段
String name;
int age;
//方法
public void Study(){
System.out.println(this.name+"在学习"); //this代表当前类
}
}
//通过new关键字创建不同的实例
package OOP;
public class Application {
public static void main(String[] args) {
//类是抽象的,需要实例化,类实例化后悔返回一个自己的对象
Student student = new Student(); //student对象就是Student类的"一个"具体实例
Student xiaoming = new Student();
Student xiaohong = new Student(); //这就创建了两个不同的对象
System.out.println(xiaoming.name); //输出为null(通过new创建对象时,会对对象进行默认的初始化)
System.out.println("======================================");
xiaoming.name = "小明";
xiaoming.age = 3;
System.out.println(xiaoming.name);
System.out.println(xiaoming.age+"岁");
System.out.println("====================================");
System.out.println(xiaohong.name);
System.out.println(xiaohong.age); //因为未给xiaohong.name和xiaohong.age赋值,所以输出的结果为默认值
}
}
//结果
D:\JDK\bin\java.exe "-javaagent:D:\IDEA\IntelliJ IDEA 2022.2.3\lib\idea_rt.jar=2667:D:\IDEA\IntelliJ IDEA 2022.2.3\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath D:\eclipse\work\Demo1\out\production\untitled1 OOP.Application
null
======================================
小明
3岁
====================================
null
0
进程已结束,退出代码0
构造函数(也叫构造方法,构造器)
- 何为构造函数?用来创建对象的函数就叫做构造行数
-
类中的构造器也称为构造方法,是在进行创建对象时必须要调用的。也就是说,只要有对象的创建,就一定会调用到构造函数。从本质上来讲,它就是一个函数,但是,它又非常特殊,特殊指出在哪呢?
-
1、构造方法的名字和类的名字相同,
-
2、构造方法没有返回类型,也不能写void
-
创建一个对象
package com.etime04;
public class Test {
public static void main(String[] args) {
//创建一个对象s1
Student s1 = new Student();
}
}
运行程序时
注意:只要是通过类创建了对象,创建了几个对象,就会调用到几次构造函数
package com.etime04;
public class Student {
private String name; //姓名
private int age; //年龄
private String gender; //性别
//默认的无参构造函数
public Student() {
System.out.println("这是一个无参构造函数");
}
}
package com.etime04;
public class Test {
public static void main(String[] args) {
//创建两个对象s1和s2
Student s1 = new Student();
Student s2 = new Student();
}
}
运行程序时
自定义构造函数
-
除了默认的构造函数外,还可以自定义构造函数。自定义函数和默认的构造函数的区别就在于有没有参数。要不要带参数,带几个参数,带哪几个参数,全凭自身需求
package com.etime04;
public class Student {
private String name; //姓名
private int age; //年龄
private String gender; //性别
//默认的无参构造函数
public Student() {
System.out.println("这是一个构造函数");
}
/**
*除了默认的构造函数外,还可以自定义构造函数,自定义构造函数和默认的构造函数的区别就是,有没有参数
*/
//只带name这一个参数的构造函数
public Student(String name) {
this.name = name;
}
//只带name和age这两个参数的构造函数
public Student(String name, int age) {
this.name = name;
this.age = age;
}
//带了所有参数的构造函数
public Student(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
}
有了前面的构造函数,就可以在创建对象的同时对一个或者多个属性进行赋值
package com.etime04;
public class Test {
public static void main(String[] args) {
//创建一个对象s1
Student s1 = new Student();
//在创建对象的同时给name赋值
Student s2 = new Student("小明");
System.out.println(s2.getName());
/*
//可以调用前面提供的public的set()方法度对还没有赋值的属性进行赋值
s2.setAge(30);
System.out.println(s2.getAge());
s2.setGender("男");
System.out.println(s2.getGender());
*/
//在创建对象的同时给name和age赋值
Student s3 = new Student("xiaoming",24);
System.out.println(s3.getName());
System.out.println(s3.getAge());
//在创建对象的同时给name、age和gender赋值
Student s4 = new Student("XDDA",28,"男");
System.out.println(s4.getName());
System.out.println(s4.getAge());
System.out.println(s4.getGender());
}
}
注意:如果定义了有参构造函数,则默认的无参构造函数将会被有参构造函数给覆盖。所以,如果定义了有参构造函数,无参构造函数就必须显示定义,否则程序将报错
-
构造器的作用
-
1、使用new关键字,必须要有构造器
-
2、构造器一般用来初始化值
-
- 结论:1、一个类,即使什么都不写,也会存在一个默认的构造方法
- 快捷键alt+insert 快速生成构造器