Dreams don’t come for free. 梦想不会平白无故实现。
- 面向对象和面向过程
- 类和对象
- 类
- 对象
- 类的定义
- 属性
- 方法
一、面向对象和面向过程
举个例子:我想要一杯开水,正常来说,我需要找到烧水壶,然后接凉水,烧成开水,在倒进杯子里面,这种方式叫做面向过程。同样的例子,面向对象就是我想要一杯开水,然后我找个人,给他说我想要一杯开水,你怎么弄,要不要用烧水壶烧开水,这些我都不管,我最后只要一杯开水,至于你弄开水的过程和我没关系,只要最后给我一杯开水就行,这是面向对象。
面向对象的本质还是面向过程,那上面的例子来说,虽然我不用自己来做这些事,但是这些事还是需要有人来做,做这些事的人是面向过程的。
二、类和对象
一、类
类就是一类,比方说人类,是一个类,动物也是一个类,一个班级,一个学校也可以是一个类
类就是描述同一类型的事物的一个抽象概念
二、对象
如同上面说的,人类是一个类,动物是一个类、一个班级、一个学校也是一个类
人类中有一个人,叫张三,那么张三就是一个对象,是对人类这个类的实例
动物中有一只猫,那么这个猫也是一个对象
一个班级,一个学校同理
三、类的定义
一、类
1、语法格式
[权限修饰符] class 类名{
}
Tips:类名需要遵循大驼峰原则,单词首字母大写。
2、人类
人类是一个类,所以我们创建一个名字叫做Person
的类
public class Person {
}
这就是一个最简单的“人”类了,当然,这个类什么功能也没有
Tips:一个.java
文件可以写多个类,但是只能有一个类被修饰为public
。
二、对象
有了人类,就可以创建对象了
1、语法格式
类名 对象名 = new 类名();
2、人类对象
Person person = new Person();
这就是创对象的方式,可以看到new Person
后有一个()
,这个括号,将在下面解释说明。
三、属性
上面说了,人类是一个类,张三是人类的一个实例(对象)
那么如果只知道他是张三那可不行,还要知道他的性别,他的年龄啊等等
性别和年龄就可以说是人类这个类的属性,毕竟这是每个人类都有的。
1、语法格式
和写变量差不多
[权限修饰符] 类型 属性名 = [默认值];
是不是和变量差不多,只是没有在最后赋值,要知道,变量需要先初始化赋值才能使用的。
而属性不需要初始化赋值,系统会自动给每个属性赋值上一个默认值。
数据类型和默认值对照如下:
数据类型 | 默认值 |
---|---|
byte | 0 |
shore | 0 |
char | ‘\u0000’ |
int | 0 |
long | 0 |
float | 0.0 |
double | 0.0 |
boolean | false |
引用类型 | null |
四、方法的
还用人类打比方说,张三,他需要吃饭,需要睡觉,那么吃饭和睡觉就可以看作人类这个类的方法,这个方法用于实现人类这个类的一些功能。方法是类的和对象行为特征的抽象。
1、语法格式
[权限修饰符] 返回值类型 方法名([参数列表]){
方法体
}
2、例子
public void a1(){
}
这就是定义了一个,权限被修饰为public
的没有返回值的名字叫a1
的方法,当然这个方法也没有什么用,因为我没有写方法体。
例子:一个典型的学生类
public class Student {
int id;
String name;
int age;
String address;
public void study(){
System.out.println("学生就该学习。");
}
public void sleep(){
System.out.println("学习了一天,需要睡觉了。");
}
}
这就是一个经典的学生类
定义了一个权限修饰为public
的类名叫做Student
的类
定义了四个属性,分别是
- id:学生的ID
- name:学生的姓名
- age:学生的年龄
- address:学生的家庭地址
还写了两个方法,分别是
- stusy:学习
- sleep:睡觉
四、构造器(构造方法)
在上面创建对象的时候,后面有一个括号,一个括号,括号里面没有参数,那么就方法表这是一个构造器。这个括号和方法的括号一样,是用来传参数的。
构造器一般是为了给对象进行初始化操作,构造器是一个会自动调用的特殊方法,目的是对象的初始化。构造器应该和类型一致。Java通过new
关键字来调用构造器,从而返回该类的实例,是一个特殊的方法。
一、构造器的语法格式
public 类型([参数列表]){
执行语句
}
1、构造器的四个要点
- 通过new关键字调用!
- 构造器虽然有返回值,但是不能定义返回值类型,不能在构造器里面使用return语句。
- 如果没有定义构造器,则系统会自动给定义一个无参构造器,如果定义了则不会自动添加。
- 构造器的名字必须和类名一致。
二、构造器的重载
构造器也是方法,只是有点特殊而已,构造器与普通方法一样,也可以重载
public class Student {
int id;
String name;
int age;
String address;
public Student() {
}
public Student(int id, String name, int age, String address) {
this.id = id;
this.name = name;
this.age = age;
this.address = address;
}
public void study(){
System.out.println("学生就该学习。");
}
public void sleep(){
System.out.println("学习了一天,需要睡觉了。");
}
}
这样并不会报错,系统会根据你传进去的参数,自动选择最匹配的构造器。
五、引用
对象属于引用类型了,不属于八大基本类型了,和基本类型不同的是,基本类型的参数传递使用的是拷贝,只是把数值拷贝走了,不会修改原数据,但是引用类型不同,这里的数据传递,传递的是对象在内存中的引用地址。
public class Test {
public static void main(String[] args) {
Student s1 = new Student(1,"张三",20,"河南");
Student s2 = s1;
s2.name = "李四";
s2.age = 21;
s2.name = "河北";
System.out.println(s1);
System.out.println(s2);
}
}
public class Student {
int id;
String name;
int age;
String address;
public Student() {
}
public Student(int id, String name, int age, String address) {
this.id = id;
this.name = name;
this.age = age;
this.address = address;
}
public void study(){
System.out.println("学生就该学习。");
}
public void sleep(){
System.out.println("学习了一天,需要睡觉了。");
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
运行结果 |
---|
Student{id=1, name=‘河北’, age=21, address=‘河南’} Student{id=1, name=‘河北’, age=21, address=‘河南’} |
可以看到,我把s1赋值给了s2,然后通过s2修改姓名、年龄和地址,随后s1的数据也发生了变化。
六、this关键字
1、thsi关键字的作用1
在构造器里区分是构造器里的参数还是类的属性,加上this就是类的属性。
public Student(int id, String name, int age, String address) {
this.id = id;
this.name = name;
this.age = age;
this.address = address;
}
2、this关键字的作用2
用来在构造器之间相互调用。
public class Test {
public static void main(String[] args) {
Student s1 = new Student(1,"张三",20,"河南");
}
}
public class Student {
int id;
String name;
int age;
String address;
public Student() {
System.out.println("我是无参构造器");
}
public Student(int id, String name, int age, String address) {
this();
this.id = id;
this.name = name;
this.age = age;
this.address = address;
System.out.println("我是有参构造器");
}
public void study(){
System.out.println("学生就该学习。");
}
public void sleep(){
System.out.println("学习了一天,需要睡觉了。");
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
运行结果 |
---|
我是无参构造器 我是有参构造器 |
需要注意的是,通过this关键字在构造器之间相互调用,必须把thsi关键字方法构造器内部的第一行。
构造器之间还需要注意递归调用的问题。
七、static修饰符
static属于静态修饰符,被static修饰的属性,方法都是属于类的,与对象无关。
被static修饰的方法或者属性,可以通过类名.属性名
或者类名.方法名()
调用
public class Test {
public static void main(String[] args) {
System.out.println(Student.name);
Student.study();
}
}
public class Student {
int id;
static String name;
int age;
String address;
public Student() {
System.out.println("我是无参构造器");
}
public Student(int id, String name, int age, String address) {
this();
this.id = id;
this.name = name;
this.age = age;
this.address = address;
System.out.println("我是有参构造器");
}
public static void study(){
System.out.println("学生就该学习。");
}
public void sleep(){
System.out.println("学习了一天,需要睡觉了。");
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
运行结果 |
---|
null 学生就该学习。 |
前面说了,属性会被系统默认的给一个初始值,所以这里会有一个null(空)。
被static修饰的属性,在内存中只会创建一份,不管后面创建了多少对象,都会引用到同一个内存。
public class Test {
public static void main(String[] args) {
Student s1 = new Student(1,"张三",20,"河南");
Student s2 = new Student(1,"李四",20,"河南");
System.out.println(s1);
System.out.println(s2);
}
}
public class Student {
int id;
static String name;
int age;
String address;
public Student() {
}
public Student(int id, String name, int age, String address) {
this.id = id;
this.name = name;
this.age = age;
this.address = address;
}
public static void study(){
System.out.println("学生就该学习。");
}
public void sleep(){
System.out.println("学习了一天,需要睡觉了。");
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
运行结果 |
---|
Student{id=1, name=‘李四’, age=20, address=‘河南’} Student{id=1, name=‘李四’, age=20, address=‘河南’} |
可以看到,s2在创建的时候使用的是"李四"这个名字,而s1的名字也被修改为了"李四"。
static修饰的方法不能访问非static修饰的方法或者变量,非static修饰的方法,可以访问stat修饰的变量和方法
static修饰的方法内不能使用this关键字