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中的一些包
  1. java.lang:核心类,字符串、基本类型包装类、系统操作、线程
  2. java.net:网络相关的类和接口。
  3. java.io:输入/输出功能的类。
  4. java.util:工具类。
  5. java.text:格式化
  6. java.sql:数据库编程相关
  7. 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渐进式学习》

《幕》

  • 留白 —<老吉>
  • ~ 今 ~ ❀ ~ ❀❀❀❀❀❀❀❀❀❀ ❀❀❀❀❀❀❀❀❀❀ ❀❀❀❀❀❀❀

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长毛山顶洞人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值