一.概念
面向对象:
面向对象(Object Oriented)是软件开发方法,一种编程范式。面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统、交互式界面、应用结构、应用平台、分布式系统、网络管理结构、CAD技术、人工智能等领域。
面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
对象:
万物皆对象,客观存在的事物都是对象
对象是类的一个实例(对象不是找个女朋友),有属性和行为。
对象具有唯一性,对象是由类创建的,先有类,才有对象,对象是由类实例化的。
例如,一条狗是一个对象,它的属性有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。
类:
类是对象的类型,是一个模板,它描述一类对象的状态(属性)和行为(方法)。
类定义了一种抽象数据类型,类是具有相同属性和方法的一组对象的集合。
下图中汽车为类(class),而具体的每辆车为该汽车类的对象(object),对象包含了汽车的颜色、品牌、名称等。
对象的属性:
属性:对象具有的各种特征,每个对象的属性有具有特定的值,可以理解为对某类事物的描述
-
注意:对象的属性既具有默认值,这个默认值与相对的类型相关
数据类型 默认值 byte 0 short 0 int 0 long 0 double 0.0 float 0.0 char 空字符 boolean false String null
拿一条狗来举例,它的状态有:名字、品种、颜色,行为有:叫、摇尾巴和跑。
先创建一个Dog类,标注它的属性(特征即属性)和方法(行为即方法)
public class Dog {
/**
* 品种
*/
String breed;
/**
* 尺寸
*/
int size;
/**
* 颜色
*/
String color;
/**
* 年龄
*/
int age;
public void eat(){
}
public void run(){
}
public void sleep(){
}
}
然后在 Test包中 实例化出两个对象(dog01和dog02)
输出并判断它们是否相等
/**
* @author lzy
* @version 1.0.0 2022/4/20 11:15
*/
public class DogTest {
@Test
public void test01(){
Dog dog = new Dog();
}
@Test
public void test02(){
Dog dog01 = new Dog();
Dog dog02 = new Dog();
System.out.println(dog01 == dog02);
}
@Test
public void test03(){
Dog dog01 = new Dog();
Dog dog02 = new Dog();
System.out.println(dog01 == dog02);
}
}
原因:
栈中的dog01会指向堆中的newDog(),栈中的dog02会指向堆中的一个新newDog(),
dog01 和 dog02在堆中的存储空间地址不同,因为是一一对应的关系,
所以会出现两个newDog()存储空间,所以二者不会相等。
类和对象的关系:
类是对象的抽象,仅仅是一个模板,在现实世界中是不存在的;而对象是具体的实例,是类这个模板的具体实例。
二.实例
先创建一个Person类,标注它的属性(特征即属性)和方法(行为即方法)
然后给sleep方法加上static静态修饰符
package com.lzy.bean;
/**
* @author lzy
* @version 1.0.0 2022/4/20 10:01
*/
public class Person {
public static void main(String[] args) {
sleep();
}
/**
* 昵称
*/
String nickname;
/**
* 性别 1代表男 0代表女
*/
int gender;
/**
* 年龄
*/
int age;
public void eat(){
System.out.println("民以食为天");
drink();
}
public void drink(){
System.out.println("我们是什么,我们是兄弟,这酒怎么喝,你干了我随意");
sleep();
}
public static void sleep(){
System.out.println("养精蓄锐");
}
}
然后再在 测试包(PersonTest) 里调用一下我们创建好的Person类里的方法
package com.lzy.bean;
import org.junit.jupiter.api.Test;
/**
* 静态方法可以通过类名点方法名的方式调用<br>
* 但是不能通过类名点方法名的方式调用非静态方法<br>
* 可以通过类的实例化对象名点方法名的方式调用静态方法<br>
* 也可以通过类的实例化对象名点方法名的方式调用非静态方法<br>
* 静态方法可以调用静态方法但是无法直接调用非静态方法
* 非静态方法可以调用非静态方法与可以调用静态方法
* @author lzy
* @version 1.0.0 2022/4/20 10:01
*/
public class Person01Test {
@Test
public void test01() {
// 静态方法可以通过类名点方法名的方式调用
// 但是不能通过类名点方法名的方式调用非静态方法
Person.sleep();
}
@Test
public void test02() {
// 静态方法可以通过类名点方法名的方式调用
// 但是不能通过类名点方法名的方式调用非静态方法
Person.sleep();
Person person01 = new Person();
// 可以通过类的实例化对象名点方法名的方式调用静态方法
// 也可以通过类的实例化对象名点方法名的方式调用非静态方法
person01.eat();
person01.drink();
person01.sleep();
}
}
静态方法:
1.静态方法可以通过类名点方法名的方式调用 2.可以通过类的实例化对象名点方法名的方式调用静态方法 3.静态方法可以调用静态方法但是无法直接调用非静态方法
非静态方法:
1.不能通过类名点方法名的方式调用非静态方法 2.可以通过类的实例化对象名点方法名的方式调用非静态方法 3.非静态方法可以调用非静态方法也可以调用静态方法