前言
最近刚开始学习Java 如有错误请多指正!
一、类和对象?
在讲类之前我们先理解一下什么是对象
1.对象?
在面向对象的语言中,我们需要依靠对象来完成某一件事
在Java中 “你我皆是对象”
拿洗衣服举个例:
面向过程(注重每一步过程):
- 拿盆
- 放水
- 放衣服
- 放洗衣粉
- 搓
- 换水
- 放洗衣粉
- 搓
- 拧干
- 晾衣服
面向对象(注重是谁在干什么):
- 人拿衣服丢洗衣机
- 放洗衣粉
- 启动洗衣机
- 洗衣机洗完并甩干
整个洗衣服过程中就四个对象在交互,我们不用关心洗衣机是怎么运转之类的麻烦玩意儿
2.类?
类(Class)是一种抽象的概念,可以把它想象成对象的模板,里面定义了对象的属性(数据)和方法(行为)
当某个类被实例化后,他就成对象了~
二、类的定义和使用
1.定义
在Java中我们定义一个类,需要用 “class” 关键字
class Student{ //学生类(模板)
public String name; //学生姓名
public int age; //学生年龄
public String gender; //学生性别
public void study(){ //学习方法
System.out.println(name + "正在学习");
}
}
我们定义了一个 Student 学生类,他包括了学生的姓名、年龄、性别
还有一个 学习方法
小知识:
- 类名一般用大驼峰定义(每个单词首字母大写)
- 这里public是一种访问权限修饰符,public是公开属性(谁都可以用),后面会出一篇文章来讲解~(咕咕咕)
- 类也是一种自定义数据类型!(和int,double差不多,只不过int之类的都是内置类型,而我们定义的是一个新的类型)
2.实例化
我们在上面定义了一个Student类,但是我们只有”模板“,没有学生啊,总不能让模板上课学习吧~
所以我们就用到了实例化
在Java中,实例化对象用 “new” 关键字
通过" . "(点操作符)来访问对象中的属性和方法,它是一个运算符
同一个类可以创建一堆对象,每个对象都会占用实际的物理空间来存储(就像是一个不会坏掉的冰棍模具,可以弄出来无数根冰棍,但是你仓库塞不下这么多,那就没办法了)
class Student{ //学生类(模板)
public String name; //学生姓名
public int age; //学生年龄
public String gender; //学生性别
public void study(){
System.out.println(name + "正在学习");
} //学习方法
public void show(){
System.out.println(name + age + gender);
} //显示属性方法
}
// ↑ 这一块是咱在上面定义的Student类 ↑
public class Test{
//简单来说,这里的 Test 是我的文件名,是一个公开的类
public static void main(String[] args){
//这里的 main 就是和 C语言 一样的,程序的主入口
Student student1 = new Student();
Student student2 = new Student();
//这里实例化了两个学生,一个叫student1 另一个叫student2
student1.name = "张三";
student1.age = 17;
student1.gender = "男";
student2.name = "李四";
student2.age = 18;
student2.gender = "男";
//这里给每个学生赋值了(名字、年龄、性别)
student1.show();
student2.show();
//这里调用了Student类里的show方法,来观察我们学生对象的属性
student1.study();
student2.study();
//这里调用了Student类里的study方法
}
}
运行结果:
3.this关键字
简单来说就是当前,到底是谁在调用这个方法之类的,还有它可以用来避免形参名和变量名相同
继续拿上面代码举例:
class Student{ //学生类(模板)
public String name; //学生姓名
public int age; //学生年龄
public String gender; //学生性别
public void setStudent(String name,int age,String gender){
name = name;
age = age;
gender = gender;
} //普通赋值方法
public void setThisStudent(String name,int age,String gender){
this.name = name;
this.age = age;
this.gender = gender;
} //this.赋值方法
public void show(){
System.out.println(name + age + gender);
} //显示属性方法
}
public class Test{
public static void main(String[] args){
Student student1 = new Student();
//实例化两个学生对象
student1.setStudent("张三",17,"男");
student1.show();
student1.setThisStudent("张三",17,"男");
student1.show();
//分别用两种赋值方式给对象赋值
}
}
运行结果:
为什么会出现这个结果呢?,咱看这一段代码
害…作为人类 看这个代码,都有点迷糊
你给name赋值给name?
哪个name给哪个name???
编译器更不可能知道咱要谁给谁赋值~
-
这里name = name;为什么 = null?
因为他把传过来的形参又赋值给了形参(改了个寂寞
咱实例化的对象的成员变量(属性)他是一点没改啊!!!
实例化对象的时候,他的属性默认就是他对应的0值(上面忘记讲了,看了看塞哪里都不合适,就写这里了
也就是图里打印出来的 null 0 null -
那为什么写了“this.”就没问题嘞?
就跟我在上面说的一样,谁调用谁就是这个“this”
比如(这里就不全写代码了,看下上面完整代码理解下):
三、对象的构造及初始化
1.如何构造?
使用构造方法构造,简单来说就是一个特殊的成员方法
方法名必须和类名一样,创建对象时候会自动调用,并且一个对象只调用一次
相当于出生时候的命名,只有一次
class Student{
public String name;
public int age;
public String gender;
public Student() {
this();
} //不带参数的构造方法
public Student(String name,int age,String gender){
this();
this.name = name;
this.age = age;
this.gender = gender;
} //带三个参数的构造方法
public void show(){
System.out.println(name + age + gender);
} //显示属性
}
public class Test {
public static void main(String[] args) {
Student student1 = new Student();
Student student2 = new Student("张三", 17, "男");
//实例化学生对象并直接赋值
student1.show();
student2.show();
}
}
运行结果:
这里咱写了两个构造方法,一个无参,一个有参
看图就能看出来区别咯
在我们啥构造方法都没写的时候,编译器默认提供一个无参构造方法
但是你写了其中任意一个,他就不提供了,你得自己写全(IDEA可以用快速生成~
这里的this写上就是先调用无参构造方法对 对象属性 进行初始化(0值)
不写的话就是不初始化,直接赋值,建议写上
但是千万不能形成循环!!!
这里this一直在循环,无限递归(不可以!)
2.如何初始化?
为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?
简单来说,局部变量,它用完就销毁了,你还不给它赋值?那你这变量存在的意义是啥?
成员变量是,对象创建时候初始化的,只要对象在,成员变量就不会销毁
你可以直接就地初始化,让所有对象都默认是这个值(如果没有其它构造方法或者set修改的话)
3.就地初始化
简单说就是直接赋值给模板上,让所有学生默认是张三,17,男
class Student{
public String name = "张三";
public int age = 17;
public String gender = "男";
// ↑ 就地初始化 ↑
public Student() {
}
public Student(String name, int gae, String gender) {
this.name = name;
this.age = gae;
this.gender = gender;
}
public void show(){
System.out.println(name + age + gender);
}
}
public class Test {
public static void main(String[] args) {
Student student1 = new Student();
Student student2 = new Student("李四",18,"男");
student1.show();
student2.show();
}
}
运行结果:
总结
嗯,写的有些简陋,如有遗漏请多指正!
这次感觉写的还行(?