day05~08-面向对象[oop](一)

一、面向对象VS面向过程


面向过程

是一种以过程为中心的编程思想,其原理就是将问题分解成一个一个详细的步骤,然后通过函数实现每一个步骤,并依次调 用。
面向过程我们所关心的是解决一个问题的步骤,举个例子,汽车发动、汽车熄火,这是两个不同的事件,对于面向过程而言,我 们关心的是事件本身,因此我们会使用两个函数完成以上两个动作,然后依次调用即可。

面向对象

是一种以对象为中心的编程思想,就是通过分析问题,分解出一个一个的对象,然后通过不同对象之间的调用来组合解决问 题。建立对象的目的不是为了完成某个步骤,而是为了描述某个事物在解决整个问题的过程中的行为。
如上面的例子,汽车发动、汽车熄火,对于面向对象而言,我们则关心的是汽车这类对象,两个事件只是这类对象所具备的行为。

OOP的优点

  • 与人类的思维习惯一致
    把人类解决问题的思维过程转变为程序能够理解的过程
  • 信息隐藏,提高了程序的可维护性和安全性
    封装实现了模块化和信息隐藏
    封装使得在对象外部不能随意访问对象的属性和方法
  • 提高了程序的可重用性
    一个类可以创建多个对象实例,增加了重用性

二、对象


属性

对象具有的各种特征

方法

对象执行的操作

对象

用来描述客观事物的一个实体,由一组属性和方法组成(真实存在的具体实例)

三、类


具有相同属性和方法的一组对象的集合(对象共同特征的描述)
在java中,必须先设计类,才能创建对象并使用。

1、封装(面向对象三大特征之一)

解决属性和方法属于哪个对象的问题

  • 对象同时具有属性和方法两项特性。
  • 对象的属性和方法通常被封装在一起,共同体现事务的特性,二者相辅相成,不能分割。

2、定义类

1. 如何设计类

public class 类名{
    1.成员变量(代表属性,一般是名词)
    2.成员方法(代表行为,一般是动词)
    3.构造器
    4.代码块
    5.内部类
}

2. 如何得到类对象

类名 对象名 = new 类名();

3. 如何使用对象

访问属性:对象名.成员变量
访问行为:对象名.方法名()

4. 补充注意事项

  • 类名首字母建议大写,满足“驼峰模式”,不能用关键字,必须是合法标识符,且有意义。
  • 一个java文件中可以定义多个class类,但只能有一个类是public修饰,而且public修饰的类名必须成为代码文件名。注意:实际开发中建议一个代码文件只定义一个类。
  • 成员变量的完整定义格式是:
// 一般无需指定初始化值,存在默认值。
修饰符 数据类型 变量名称 = 初始化值;

四、方法


1、一个参数的方法

a、方法定义

修饰符 返回值 方法名(数据类型  参数1,数据类型  参数2){
}

b、方法调用

// 注意:调用方法,传递的参数要与参数列表一一对应
对象.方法名(实参,实参);

总结补充

1.定义类时要考虑解耦合,避免耦合度太高。
2.重复的代码片段可以抽取成单独的方法,提高代码的复用率。
3.在抽取方法时,要注意方法的返回值类型以及是否携带参数。
4.在调用含参的方法时,要注意参数的使用范围
5.在调用不同方法时,如果会对同一个数据源进行操作,需要保证改数据源是全局变量或者封装为一个对象。

2、可变参数

可变参数必须在参数列表的最后一个

public class Test01 {

    public static int getSum(int... num) {
        int sum = 0;
        for (int i : num) {
            sum += i;
        }
        return sum;
    }

    public static int getSum01(int[] num){
        int sum =0;
        for (int i : num) {
            sum += i;
        }
        return sum;
    }

    public static void main(String[] args) {
        int sum = getSum(10, 20, 30);
        System.out.println("数组之和为:" + sum);
        int sum1 = getSum01(new int[]{100, 20, 30});
        System.out.println("数组之和为:" + sum1);
    }
}

五、包装类


在这里插入图片描述

1、拆箱与装箱

int a = 10;
// 装箱
Integer b = new Integer(a);
// 拆箱
int c = b.intValue();
// 自动装箱
Integer b1 = a;
// 自动拆箱
int c1 = b1;

六、方法重载


调用者: 只关心功能,不关心参数列表及返回值类型!!!
方法名相同,参数列表必须不同,返回类型可以不同

编译器处理重载方法的顺序

  • 寻找在还没有装箱动作前可以符合参数个数与类型的方法
  • 尝试装箱动作后可以符合参数个数与类型的方法
  • 尝试没有不定长度参数并可以符合的方法
  • 都找不到适合的方法就报告编译错误
public class TestOrder {
    public static void print(int a) {
        System.out.println("方法一" + a);
    }

    public static void print(Integer a) {
        System.out.println("方法二" + a);
    }

    public static void print(int... a) {
        System.out.println("方法三" + Arrays.toString(a));
    }

    public static void print(Integer... a) {
        System.out.println("方法四" + Arrays.toString(a));
    }

    public static void main(String[] args) {
        print(2);
        print(new Integer(3));
        print(new int[]{2, 3, 4});
        print(new Integer[]{1, 2, 3});
    }
}

七、构造方法(构造器)


1、构造器的作用

  • 定义在类中,可以用于初始化一个类的对象,并返回对象的地址。

2、构造器的格式

public class Car{
    ...
    //无参构造器
    public Car(){
        ...    
    }
    //含参构造器
    public Car(String n,double p){
        ...    
    }
}

3、调用构造器得到对象的格式

类 变量名称 = new 构造器;

4、构造器的分类和作用

  • 无参构造器(默认存在的):初始化对象时,成员变量的数据均采用默认值。
  • 有参构造器:在初始化对象的时候,同时可以接收参数为对象进行赋值。

八、封装(面向对象三大特征之一


1、封装的概念

将类的某些信息隐藏在类内部。不允许外部程序直接访问,通过该类提供的方法来实现对隐藏信息的操作和访问

2、封装的好处

  • 只能通过规定方法访问数据
  • 隐藏类的实现细节
  • 方便加入控制语句
  • 方便实现修改

3、this关键字

代表当前对象的地址

public class Dog {
    private String name;
    private String strain;
    private int age;

    public Dog() {
    }

    public Dog(String name, String strain, int age) {
    	// 如果调用构造方法,必须是构造方法中的第一条语句
    	this();
    	// 调用属性
        this.name = name;
        this.strain = strain;
        this.age = age;
    }

    public void eat() {
    	// 调用方法
    	this.play(1);
        System.out.println(name + "是" + age + "岁的" + strain + ",喜欢吃骨头");
    }

    public void play(int n) {
        int localV = 0;
        age = age - n;
        System.out.println(name+"\t"+localV +""+ age);
    }
}

public class DogTest {
    public static void main(String[] args) {
        Dog dog = new Dog("大黄","田园犬",4);
        dog.eat();

        Dog dog1 = new Dog();
        dog1.setName("H");
        dog1.setStrain("柴犬");
        dog1.setAge(5);

        dog1.eat();
    }
}

运行结果
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值