Java基础 | Java面向对象 | 02
类和对象
万物皆对象,现实世界任何存在的客观事物都是对象。
如上图所示,只要是现实世界存在的客观事物,都可以是对象。
创建类 & 对象实例化
和操作系统中一样,我们可以通过不同的文件夹来管理同名文件,在Java中文件夹就是这样包。
包的命名规范:
- 英文字母小写
- 域名的倒序
创建宠物猫类
package com.imooc.animal;
/**
* 宠物猫类
*
* @author rowrycho
*
*/
public class Cat {
// 属性:昵称、年龄、体重、品种
String name;
int month;
double weight;
String species;
// 方法:跑动、吃东西
public void run() {
System.out.println("小猫快跑");
}
// 重载方法
public void run(String name) {
System.out.println(name + "快跑");
}
public void eat() {
System.out.println("小猫吃鱼");
}
}
创建一个猫的测试类
package com.imooc.animal;
public class CatTest {
public static void main(String[] args) {
// 实例化对象
Cat one = new Cat(),two=new Cat();
// 测试
one.eat();
one.run();
// 给属性赋值
one.name = "花花";
one.month = 2;
one.weight = 1000;
one.species = "英国短毛猫";
// 测试成员变量的默认初始值
System.out.println("昵称:"+one.name);
System.out.println("年龄:"+one.month);
System.out.println("体重:"+one.weight);
System.out.println("品种:"+one.species);
one.run(one.name);
}
}
运行结果
如果没有没成员属性赋初值直接使用的话,不会报错,默认就是0和null。但是如果局部变量没有给初值,就会报错。
单一职责/功能原则
为什么要将Cat和CatTest两个类分开?
单一职责原则,一个类最好就一个功能,这样可以大大降低耦合度,大大类的复用性。
这两个类是如何关联的?
Java有自己的搜索机制,main运行的时候,首先会搜索同一个java文件中的类,如果没有找到,再去搜索同一个包中的类。
new关键字
声明对象 和 实例化对象 是两步操作。
-
声明对象:在栈中进行对象声明。
-
实例化对象:在堆中进行对象的实例化。
如果只声明了对象,并没有对对象实例化,那么是不能使用对象的,因为此时对象只在栈中进行了声明,其值为null。
栈中主要存储局部变量,堆中存储动态数据。
如果是基本类型,那么变量和值都是存储在栈中的,如果是类,那么栈中只会存储一个堆的地址,然后堆中存储真正的对象数据。
new了两个对象,那么这两个对象在堆中是两个独立的空间,相互之间是不影响的。
Cat one = new Cat();
Cat two = one; // 两个变量指向同一内存地址
如果对象只需要使用一次,那么就可以不用声明对象,直接new Cat()使用一次。
同时声明多个变量
Cat one = new Cat(),two=new Cat(),three = new Cat();
构造方法——无参构造方法
构造方法要和new配合使用,不能被对象单独调用。
package com.imooc.animal;
/**
* 宠物猫类
*
* @author rowrycho
*
*/
public class Cat {
// 属性:昵称、年龄、体重、品种
String name;
int month;
double weight;
String species;
// 构造方法
// 方法:跑动、吃东西
public void run() {
System.out.println("小猫快跑");
}
// 重载方法
public void run(String name) {
System.out.println(name + "快跑");
}
public void eat() {
System.out.println("小猫吃鱼");
}
}
构造方法——有参构造方法
通过带参数的构造方法,完成对象的属性赋值。
package com.imooc.animal;
/**
* 宠物猫类
*
* @author rowrycho
*
*/
public class Cat {
// 属性:昵称、年龄、体重、品种
String name;
int month;
double weight;
String species;
// 通过该构造方法进行属性赋值
public Cat(String name, int month, double weight, String species) {
this.name = name;
this.month = month;
this.weight = weight;
this.species = species;
}
}
package com.imooc.animal;
public class CatTest {
public static void main(String[] args) {
// 实例化对象
Cat one = new Cat("花花",2,1000,"英国短毛猫"); // 通过构造函数给对象的属性赋值
// 测试
one.eat();
one.run();
// 测试成员变量的默认初始值
System.out.println("昵称:"+one.name);
System.out.println("年龄:"+one.month);
System.out.println("体重:"+one.weight);
System.out.println("品种:"+one.species);
}
}
this表示当前对象。
构造方法调用
注意:构造方法只能在构造方法直接进行调用,构造方法不能被成员方法调用。
package com.imooc.animal;
/**
* 宠物猫类
*
* @author rowrycho
*
*/
public class Cat {
// 属性:昵称、年龄、体重、品种
String name;
int month;
double weight;
String species;
// 构造方法
public Cat() {
System.out.println("这是无参构造方法");
}
public Cat(String name) {
this(); // 调用无参构造方法
System.out.println("这是有参构造方法");
}
public Cat(String name, int month, double weight, String species) {
this("你好");
this.name = name;
this.month = month;
this.weight = weight;
this.species = species;
}
}
this关键字
注意: this()调用构造方法,必须放在方法体内第一行。
小结
面向对象的三大点
封装、继承、多态
什么是对象?
对象是类的示例表现。
什么是面向对象?
人关注对象
人关注事物信息
通过对象来完成事情的交互,而不是通过面向过程的方式。
什么是类?
类是模子,确定对象将拥有的特征(属性)和行为(方法)。
类和对象的关系?
类是更加抽象的概念,对象是类的实例化。
类是对象的类型,对象是特定类型的数据。
什么是属性和方法?
属性:对象有什么
方法:对象能做什么
关于包的知识点
和操作系统中一样,我们可以通过不同的文件夹来管理同名文件,在Java中文件夹就是这样包。
包的命名规范:
* 英文字母小写
* 域名的倒序
局部变量、成员变量未赋初值,打印的结果?
局部变量未赋初值,那么就报错。
成员变量未赋初值,那么就会默认是0,或null。
为什么要将Cat和CatTest两个类分开?
**单一职责原则**,一个类最好就一个功能,这样可以大大降低耦合度,大大类的复用性。
这两个类是如何关联的?
Java有自己的搜索机制,main运行的时候,首先会搜索同一个java文件中的类,如果没有找到,再去搜索同一个包中的类。
声明对象 & 实例化对象
声明对象: Cat one;
实例化对象: one=new Cat();
通常写为 Cat one = new Cat();
栈 & 堆
栈:存储局部变量
堆:存储动态数据
堆存储对象数据
栈中存储变量,如果是对象句柄,那么只存储堆地址;如果是基本类型变量,那么就存储变量名和变量值。
int a=10; // 全部都存储在栈内存
Cat one = new Cat(); // one存储在栈内存,new Cat()存储在堆内存
构造方法
public Cat() {
System.out.println("这是无参构造方法");
}
public Cat(String name) {
System.out.println("这是有参构造方法");
}
构造方法与类同名且没有返回值(构造方法是没有类型的)
只能在new的时候被调用
没有指定构造方法时,系统会自动添加无参的构造方法
当有指定构造方法,无论是有参还是无参,都不会自动添加无参的构造方法
一个类中可以有多个构造方法
构造方法的调用
注意:构造方法只能在构造方法直接进行调用,构造方法不能被成员方法调用。
this(); // 调用无参构造方法
this(”你好"); // 调用有参构造方法
this关键字
this:当前对象的默认引用
this的使用
调用重载构造方法(必须放在第一行)
调用成员属性(解决成员属性和局部变量同名冲突)
调用成员方法