Java基础【之】面向对象编程(类、面向过程、面向对象、对象、属性、行为)(大象进冰箱)
1.面向对象与面向过程(大象门事件!!!)
1.1.面向过程(POP)
面向过程(POP) :Object Oriented Programming
面向过程,强调实现功能逻辑的最小单位是,函数方法。
强调一个函数实现一个小功能,然后函数之间组合调用,完成整体事件。经典 大象门事件,分几步走?(流程与函数个数并非固定)
1.函数与执行顺序:(1.买冰箱、2.开门、3.找大象、4.推进冰箱、5.关门)
2.函数与执行顺序:(1.买冰箱并且开门、2.找大象并且推进冰箱、3.关门)
1.2.面向对象(OOP)
面向对象(OOP):Procedure Oriented Programming
面向对象,强调实现功能逻辑的最小单位是,类和类实例化出来的对象.
强调先将事件查分设计为,多种类,然后设计类中的方法,然后实例化类对象,对象间相互调用完成整体事件面向对象的三大特征
封装 (Encapsulation)
继承 (Inheritance)
多态 (Polymorphism)经典 大象门事件,分几步走?(按照世人思路,基本上面向对象都会有最佳实践,流程与函数相对固定)
1.设计一个 冰箱.class 类
2.设计一个 大象.class 类
3.设计一个 人.class 类
4.各自创建实例,通过人把冰箱打开,通过人把大象装进冰箱,通过人关闭冰箱门
1.3.注意
- 作为代码编写者来说,面向对象是一种思想,需要借助面向对象的语言,才能实现
- 所谓的类,就是对现实问题中所出现的,可分析的事物的抽象,抽出具有事物特点的 属性 与 行为(方法)
- 对象,是类实例化出来的产物,作为内存中的一块区域存在,产生的同时具备了类的属性与行为
- 举例
人喝水:需要实际分析,人如何喝水,水从哪里来,是否需要盛水容器,由这些疑问可以简单的先抽象出
人.class(是否口渴(),喝水() )
水杯.class(容量,水,是否有水() )
水桶.class (水,是否有水(),倒水() )
如果不满足实际情况,可以删减和修改类中的内容,最终目的是满足实际情况
2.类的组成
- java语言中,通过关键字 class 定义类文件
- 类:是对现实事物的抽象,如:人.class,树木.class
- 对象:是对类创建出来的事物,如:人可以创建出,小王、小张 ; 树木可以创建出,杨树、柳树
- 属性(成员变量):(类、对象)具有的属性,如:小王身高1.7m,杨树高20m
- 行为(方法、函数):(类、对象)具有的方法,如:小王会弹吉他,小张会唱歌和游泳
2.1.类、对象、构造器
类:通过 class关键字进行定义
创建对象语法:
类名 对象名 = new 类名();
使用“对象名.对象成员”的方式访问对象成员(包括属性和方法)构造器:创建对象;给对象进行初始化;
1.构造器与类相同的名称
2.没有返回值
3.不可以用 static、final、synchronized、abstract、native 修饰
4.不可以用 return
语法:修饰符 类名 (参数列表) { 初始化代码;}
- 根据参数不同,构造器可以分为如下两类:
隐式无参构造器(系统默认提供)
显式定义一个或多个构造器(无参、有参)
- 注 意:
Java语言中,每个类默认都有一个无参构造器,默认构造器的修饰符与所属类的修饰符一致
显式定义了构造器,系统将不再提供默认构造器
一个类可以创建多个重载的构造器
父类的构造器不可被子类继承
/**
* 构造器
*
* 根据参数不同,构造器可以分为如下两类:
* 隐式无参构造器(系统默认提供)
* 显式定义一个或多个构造器(无参、有参)
*/
class GouZaoQi {
private int a = 1;
private String b = "hello";
public GouZaoQi() {
}
public GouZaoQi(int a) {
this.a = a;
}
public GouZaoQi(String b) {
this.b = b;
}
public GouZaoQi(int a, String b) {
this.a = a;
this.b = b;
}
public void hello() {
System.out.println(a +" "+ b);
}
}
public class TestGouZaoQi {
public static void main(String[] args) {
GouZaoQi gz1 = new GouZaoQi();
gz1.hello();// 1 hello
GouZaoQi gz2 = new GouZaoQi(999);
gz2.hello();// 999 hello
GouZaoQi gz3 = new GouZaoQi("ooo");
gz3.hello();// 1 ooo
GouZaoQi gz4 = new GouZaoQi(999, "ooo");
gz4.hello();// 999 ooo
}
}
2.2.匿名对象
- 不定义对象名,直接通过
new 类().方法();
来调用方法和属性。这种对象叫做匿名对象
- 如果对一个对象只需要进行一次创建,一次使用,就可以使用匿名对象。常用作参数传递。
2.3.方法
- 方法
用来完成某个功能。在某些语言中 也称为函数或过程。
将功能封装为方法,实现代码重用,方法必须定义在类里。- 格式:
修饰符 返回值类型 方法名(参数类型 形参1, 参数类型 形参2, ….){
方法体程序代码
return 返回值;
}- 修饰符:public,缺省,private, protected等
- 没有返回值:void。
- 有返回值:“return 返回值” 并 声明出返回值的类型。
- 参数
- 形参:方法声明时的参数
- 实参: 方法调用时实际传给形参的参数值
- 参数列表:可以包含零个,一个或多个参数。多个参数时,中间用“, ”隔开
- 可变参数列表:
方法名(参数的类型名 ...参数名)
- 基本数据类型:传递的是“数据值”
- 引用数据类型:传递的是“地址值/引用”
- 方法重载:方法名相同,参数类型不同或者参数顺序不通
- 普通方法:通过对象调用普通方法
- 静态方法/类方法:用 static 关键字修饰,通过类名调用静态方法
/**
* 构造器
*/
class GouZaoQi {
private int a = 1;
private String b = "hello";
//无参构造器
public GouZaoQi() {
}
//有参构造器
public GouZaoQi(int a) {
this.a = a;
}
//有参重载构造器
public GouZaoQi(String b) {
this.b = b;
}
//有参重载构造器
public GouZaoQi(int a, String b) {
this.a = a;
this.b = b;
}
//普通方法
public void hello() {
System.out.println(a + b);
}
//静态方法
public static void helloStatic(String str) {
System.out.println("静态方法: " + str);
}
}
public class TestGouZaoQi {
public static void main(String[] args) {
//通过对象调用普通方法
GouZaoQi gz1 = new GouZaoQi();
gz1.hello();//
//调用静态方法,通过类名调用
GouZaoQi.helloStatic("略略略~");
}
}
2.4.属性
- 普通属性:通过对象调用,普通属性
- 类属性/静态属性:调用静态属性,通过类名调用
- 语法格式:
修饰符 数据类型 属性名 = 初始化值 ;
/**
* 构造器
*/
class GouZaoQi {
//属性 a
public int a = 1;
//静态属性 b
public static String b = "hello";
//无参构造器
public GouZaoQi() {
}
}
public class TestGouZaoQi {
public static void main(String[] args) {
//通过对象调用,普通属性
GouZaoQi gz1 = new GouZaoQi();
System.out.println(gz1.a);
//调用静态属性,通过类名调用
System.out.println(GouZaoQi.b);
}
}
2.5.访问与权限
- 在一个类中:类中的方法可以直接访问类中的成员变量。 static方法内不可以访问非static
- 在不同类中:先创建类的对象,再用对象访问类中的成员与方法。静态 直接用
类名.
访问
- 访问权限可以作用于,类、成员变量、方法
- 类的权限修饰,只能用 public 或 默认(不写)
- public:可以被任意类访问。
- protected :能被同一个包下的类访问,还可以被任意子类访问。
- 默认:只能被同一个包下的类访问。
- private:不可以被其他类访问。
3.关键字(this、package、import)
3.1.this
- this
this指的是,当前类被实例化后的,对象的引用;- 一般作用于,当参数与成员变量名称一致时,用来区分属性与参数。
- 如下方
大象进冰箱
代码中的this.name = name;
- this访问属性和方法时,如果当前类中不存在时,会向上找当前类的父类,如果没有直接编译报错。
- this可以简化构造器间的相互调用
- 调用方式:
this(参数列表)
- 注意:
this(形参列表)
必须声明在类的构造器的首行!
构造器中不能通过this(形参列表)
的方式调用自身构造器
在类的一个构造器中,最多只能使用一次this(形参列表)
/**
* 大象
*/
class DaXiang {
//大象名字
public String name;
//大象构造函数--
public DaXiang() {
this("默认");
}
//大象构造函数
public DaXiang(String name) {
this.name = name;
}
}
3.2.package
package
package 指明该文件中定义的类所在 的包。
语法:
package 顶层包名.子包名 ;
包对应于文件系统的目录,package语句中,用 “. ” 来指明包(目录)的层次;
包通常用小写单词标识。通常使用所在公司域名的倒置:com.atguigu.xxx作用:
将功能相近的类划分到同一个包中,划分项目层次,便于管理
解决类命名冲突
- JDK中的一些包
- java.lang:核心类,字符串、基本类型包装类、系统操作、线程
- java.net:网络相关的类和接口。
- java.io:输入/输出功能的类。
- java.util:工具类。
- java.text:格式化
- java.sql:数据库编程相关
- java.awt:图形用户界面(GUI)
3.3.import
- 语法:
import 包名. 类名;
- 作用
为了在自定义类中,使用上述package
包中的功能。
通过import
语句,引入指定包层次下的类 或 全部类(.*) 。
import
语句告诉编译器到哪里去寻找类,路径错误会运行时会报错。
4.大象进冰箱(代码实现)
- 大象.class 类、冰箱.class 类、人.class 类、测试类
- 测试类的执行流程
- 1.创建 大象
- 2.创建 冰箱
- 3.创建 人
- 4.操作
4.1.人操作冰箱开门
4.2.人通过冰箱
4.3.把大象装进冰箱
4.4.人关闭冰箱门
/**
* 大象
*/
class DaXiang {
//大象名字
public String name;
//大象构造函数
public DaXiang(String name) {
this.name = name;
}
//输出当前信息
@Override
public String toString() {
return "DaXiang{" +
"name='" + name + '\'' +
'}';
}
}
/**
* 冰箱
*/
class BingXiang {
//冰箱名字
public String name;
//冰箱构造函数
public BingXiang(String name) {
this.name = name;
}
public void 开门() {
System.out.println(name + ":开门");
}
public void 关门() {
System.out.println(name + ":关门");
}
public void 装东西(Object obj) {
System.out.println(name + ":装进一个 :" + obj.toString());
}
}
/**
* 人
*/
class Ren {
//人名
public String name;
//人构造函数
public Ren(String name) {
this.name = name;
}
//执行操作
public void start(DaXiang daXiang, BingXiang bingXiang) {
System.out.println(name + " : 开始了自己的操作");
bingXiang.开门();
bingXiang.装东西(daXiang);
bingXiang.关门();
}
}
/**
* 大象进冰箱
*/
public class DaXiangJinBingXiang {
public static void main(String[] args) {
DaXiang 大象 = new DaXiang("大象");
BingXiang 孩儿牌子冰箱 = new BingXiang("孩儿牌冰箱");
//
Ren ren = new Ren("小明");
ren.start(大象, 孩儿牌子冰箱);
}
}
《上一篇:运算、位运算、比较、循环与控制》
《 UML类图》
《目录:Java渐进式学习》
《幕》
- 留白 —<老吉>
- ~ 今 ~ ❀ ~ ❀❀❀❀❀❀❀❀❀❀ ❀❀❀❀❀❀❀❀❀❀ ❀❀❀❀❀❀❀