文章目录
1.面向对象
1.1 什么是面向对象?
Java面向对象的概念是指在计算机层程序中,模拟现实世界中的概念,借助对象的描述在计算机中用类似的实体模拟现实世界中的实体。在面向对象的世界里,一切皆为对象,面向对象主要依靠对象之间的交互来完成一件事。
1.2面向对象与面向过程
例如,将大象放进冰箱需要几步?
总共有两个对象,分别为大象和冰箱。
需要三步,打开冰箱门,将大象放进冰箱,关上冰箱门,我们并不需要知道是如何将大象放进冰箱的。
以面向对象的方法来处理问题,就不需要关注将大象放进冰箱的过程,是通过对象之间的交互来完成的。
2. 类的定义和使用
面向对象关注的是对象,是现实生活中的实体,例如一名学生,他有名字,学号,性别,班级,年龄,生日,籍贯等属性,这些属性是对这个学生的描述。
2.1 类
类就是对一个对象进行描述的,例如上面的学生的例子。
2.2 类的定义
在Java中是这样定义类的
要用到class关键字,class是定义类的关键字。
class ClassName{
field;//成员变量
method;//成员方法
}
例如:
class Student {
public int id;//学号
public String name;//姓名
public String sex;//性别
public String birthday;//生日
public String birthplace;//籍贯
//学习
public void study(){
System.out.println("正在学习");
}
//吃饭
public void eat(){
System.out.println("正在吃饭");
}
//睡觉
public void sleep(){
System.out.println("正在睡觉");
}
}
注意:
- 类名建议采用大驼峰方式
- 刚学习如何定义类,成员变量前统一使用public关键字
- 成员方法前不使用static关键字
2.3例题
定义一个狗类,当然是我最喜欢的仔仔啦!嘻嘻
仔仔的属性有名字,性别,年龄,颜色……,成员方法有睡觉,吃饭,加启动(竖中指)bushi,狗叫……
让我们来一起实现下
public class Dog {
public String name;
public String sex;
public int age;
public String color;
public void sleep(){
System.out.println(name + "在睡觉");
}
public void eat(){
System.out.println(name + "在吃红烧肉");
}
public void bark(){
System.out.println(name + "在狗叫");
}
}
注意
- 建议一个Java文件只定义一个类
- main方法所在的类一般要使用public修饰
- public修饰的类必须和文件名相同
例如,一个Java文件中定义了许多类,被public修饰的类一定要与文件名相同
不相同时就会出错
- 改类名的时候需要通过开发工具改,不要直接在代码中改
3. 类的实例化
用类类型创建对象的过程,就是类的实例化。
就像我定义了狗这个类,我想实例化仔仔这个对象。在Java中使用new关键字来实例化对象。用 . 来访问对象的成员变量和成员方法。
public class Main {
public static void main(String[] args) {
Dog dog1 = new Dog();
dog1.name = "仔仔";
dog1.color = "屎色";
dog1.eat();
dog1.bark();
Dog dog2 = new Dog();
dog2.name = "小白";
dog2.color = "白色";
dog2.sleep();
dog2.eat();
}
}
仔仔在吃红烧肉,嘻嘻
每人限领一个!!!
一个类中可以创建多个实例。
画JVM布局分布图,加深理解
4.this引用
让我们来看下列代码,一起了解为什么要使用this关键字
public class Date {
public int year;
public int month;
public int day;
public void setDate(int y,int m,int d){
year = y;
month = m;
day = d;
}
public void printDate(){
System.out.println(year + "-" + month + "-" + day);
}
}
public static void main(String[] args) {
Date date1 = new Date();
Date date2 = new Date();
Date date3 = new Date();
date1.setDate(2014, 5, 4);
date2.setDate(2024, 6, 2);
date3.setDate(2021, 3, 4);
date1.printDate();
date2.printDate();
date3.printDate();
}
当我们在编写setDate方法时,形参与成员变量相同,如下代码所示
public void setDate(int y,int m,int d){
year = year;
month = month;
day = day;
}
那到底是谁给谁赋值呢?
我们在main函数中创建了三个对象,当三个对象同时调用setDate和printDate方法时,两个方法是如何知道打印的是哪个数据?
this关键字:this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。(谁调用当前的方法,谁就是this)
所以Date类可以这样写
public class Date {
public int year;
public int month;
public int day;
public void setDate(int y,int m,int d){
this.year = year;
this.month = month;
this.day = day;
}
public void printDate(){
System.out.println(this.year + "-" + this.month + "-" + this.day);
}
}
注意:
- this只能在成员方法中使用
- this在成员方法中只能引用当前对象
- 其实在成员方法的参数中,第一个参数就是this,但是被隐藏了
在成员方法执行的时候,编译器会将调用成员方法对象的引用传递给成员方法,用this来接收。
5. 对象的构造和初始化
5.1 构造方法
5.1.1 什么是构造方法
构造方法是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次,构造方法是对成员变量进行初始化的作用。
一定要记住啊,这个真的很重要!好多题都会考,一起来看下如何定义构造方法
class Dog {
public String name;
public String sex;
public int age;
public String color;
//无参数的构造方法
public Dog(){
}
//四个参数的构造方法
public Dog(String name,String sex,int age,String color){
this.name = name;
this.sex = sex;
this.age = age;
this.color = color;
}
public void show(){
System.out.println("姓名:" + name + "性别:" + sex + "年龄:" + age + "颜色:" + color);
}
public static void main(String[] args) {
Dog dog = new Dog();
dog.show();
}
}
5.1.2 构造方法的特性
- 没有返回值
- 构造方法的名字必须与类名相同
- 在创建对象时,编译器会自动调用构造方法,构造方法只执行一次(创建对象时没有传递参数,就是调用无参数的构造方法;如果传递了参数,根据参数来决定调用的到底是哪个构造方法)
- 构造方法可以重载,例如上述代码中,无参数的构造方法和带有四个参数的构造方法实现了重载
- 当用户没有写构造方法时,编译器会自动提供一个无参数的构造方法(但是,当用户自己定义了构造方法时,编译器就不会提供了)
由于编译器自动提供无参数的构造方法,并没有报错
当用户提供了构造方法,编译器将不会提供
6. 可以使用快捷键来生成构造方法
Alt + Insert
- 在构造方法中,可以用this来调用其他构造方法
- this的调用不能成环
5.2 初始化
当我们在main方法中定义一个变量而没有初始化时,会报错
而我们在定义类的时候,没有给成员变量进行初始化,并没有报错,这是因为在一个类的成员变量中,没有初始化前,java会对每个成员变量赋一个默认值。
5.2.1 默认初始化
数据类型 | 默认值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0 |
float | 0.0f |
double | 0.0 |
char | ‘\u0000’ |
boolean | false |
reference | null |
5.2.2 就地初始化
就地初始化就是在声明成员变量时,直接初始化