java面向对象

面向对象

特点

  • 封装:分类整理和保护
  • 继承
  • 多态
  • 抽象

面向对象编程

  • OOA:面向对象的分析

    将构成问题的事物分解成对象,给对象赋予相应的属性和行为

  • OOD:面向对象的设计

    让对象相互通信

  • OOP:面向对象的编程实现

    编写代码

  • 面向对象编程思想就是运用对象、类、继承、封装、聚合、关联、消息、多态性等概念来构成系统的软件开发方式面向对象

与面向过程异同

  • 面向对象 = 数据结构 + 算法

    面向对象 = 工具人(清洁阿姨 保洁阿姨) + 工具人实现功能

  • 面向过程 = 算法 + 数据结构

    面向过程 = 实现功能 + 工具(拖把 扫把 抹布)

概念

  1. 抽象 abstract
    • 从事物中舍弃个别非本质特征,抽取共同体的本质特征
    • 只考虑问题域相关的信息
  2. 对象 Object --是系统中⽤来描述客观事物的⼀个实体
    • 可以是有形的,也可以是⽆形的 – 例如⼀个客户,⼀张卡,⼀个窗体中的按钮等
    • 对象是构成世界的独⽴单位
    • 具有⾃⼰的静态结构(属性)和动态⾏为(⽅法)
    • 每个对象都有⾃⼰的唯⼀标识
  3. 类 class
    • 类是⼀组具有相同属性和⾏为的对象的抽象,类的作⽤是利⽤来创建对象,对象就是类
      的⼀个实例
  4. 类和对象的关系
    • 抽象和具体的关系
    • 每⼀个类在某⼀时刻都有零个或者更多的实例,类是⽣成对象的模板
    • ⼀个类定义了使⽤那些数据来描述属性,每⼀个对象都有相应的属性值数据,⼀个类通
      过⼀系列⽅法来定义⾏为,这些⽅法能在每个对象中被激活

声明

  • 成员变量 等同于局部变量 , 只是位置发⽣了变化 , 在类中, ⽅法外
  • 成员⽅法 等同于以前定义的⽅法 , static 暂时不要了
//定义类
public class Dog {
    //定义属性
    String name;//名字
    int age;//年龄
    String breed;//品种

    //定义方法:吃饭
    public void eat() {
        System.out.println("狗狗正在吃东西...");
    }

    //定义方法:睡觉
    public void sleep() {
        System.out.println("狗狗开始睡觉了...");
    }
}

public class TestDog {
    public static void main(String[] args) {
        //实例化Dog并且创建对象、赋值
        Dog dog = new Dog();
        dog.age = 2;
        dog.breed = "金毛";
        dog.name = "金宝宝";
        System.out.println(dog.name + "\t" + dog.breed + "\t\t" + dog.age + "\t\t");
        //调用方法
        dog.eat();
        dog.sleep();
    }

}

对象

格式

  • new关键字创建对象
  • 类名 对象名=new 类名();
  • Student student=new Student();

调用

  • 使用对象名调用
  • 对象名.变量名
  • 对象名.方法名();
public static void main(String[] args) {
    Student student = new Student();
    //调⽤对象的属性
    String name = student.name;
    System.out.println(name);
    //调⽤对象的⽅法
    student.eat();
    student.sleep();
    student.study();
}

对象和类

关系

  • 类:定义了对象应该具有的特征和行为,类是对象的模板
  • 对象:拥有特征和行为的实体,对象的类的实例

内存关系

  1. 存储关系
    • 类存储内存中的方法区内,只有一份
    • new出来的对象存储于内存中的堆内存中,一个类的对象可以有多个
  2. 问题
    • 类无法直接使用,是一个骨架、图纸
    • 对象可以使用成员
  3. 引用
    • 一个对象名引用一个实例对象
    • 多个对象名引用不同的实例对象
    • 多个对象名引用相同的实例对象
public static void main(String[] args) {
    //⼀个对象名引⽤⼀个实例对象
    Student student = new Student();
    //多个对象名引⽤不同的实例对象
    Student student2 = new Student();
    //⽐较两个对象表示的地址值
    System.out.println(student==student2);
    //多个对项名引⽤相同的实例对象
    Student student3 = student;
    System.out.println(student==student3);
}

成员变量与局部变量

定义

  • 成员变量属于类或对象,使用对象名直接调用
  • 局部变量属于方法,对象无法直接调用,只能在运行方法的时候运行

区别

  1. 在类中的位置不同

    • 成员变量:在类中方法外
    • 局部变量:定义在方法中或者方法声明上
    public class Student {
        String name ;
        public void method(){
            //⽅法内的局部变量
            String name ;
        }
        //⽅法声明上的局部变量
        public void method(String name){
        }
    }
    
  2. 在内存中位置不同

    • 成员变量:在堆内存中(属于对象,对象进堆内存)
    • 局部变量:在栈内存中(属于方法,方法进栈内存)
  3. 生命周期不同(诞生-活着-死亡)

    • 成员变量:对象创建而存在,对象消亡而消失
    • 局部变量:方法调用而存在,方法结束而消亡
  4. 初始化值不同

    • 成员变量:有默认值,在对象创建的时候jvm设置默认值
    • 局部变量:没有默认值,必须在使用之前赋值
    public class Student {
        //可以不赋值, 创建对象的时候会有⼀个默认值
        String name ;
        public void method(){
            //使⽤前必须赋值
            String name ;
            //这⾥会报错
            //System.out.println(name);
        }
        //在调⽤⽅法执⾏之前必须给参数赋值,不然会报错
        public void method(String name){
        }
    }
    

注意事项

  • 局部变量可以与成员变量名称一样,在方法中使用的时候,采用就近原则
  • 基本类型:byte short int long float double boolean char
  • 引用数据类型:数组、类、接口、注解、枚举

重载Overload

定义

一个类中定义多个相同名称的方法。

规则

  • ​ 方法名称相同。
  • ​ 参数列表不同(类型、个数、顺序)。
  • ​ 与访问修饰符、返回值类型无关。

注意事项

  • 调用带有重载的方法时,需要根据传入的实参去找到与之匹配的方法。
  • 好处:屏蔽使用差异,灵活、方使。
  • 只是参数的名称不同并不能构成重载
package work;

/**
 * @Author night
 * @Date 2021/8/12 13:48
 * 方法重载:
 * ·方法名称相同。
 * ·参数列表不同(类型、个数、顺序)。
 * ·与访问修饰符、返回值类型无关。
 */
public class Operation {
    public void show() {
        System.out.println("无参方法");
    }

    public void show(int num) {
        System.out.println("int参方法" + num);
    }

    public void show(String name) {
        System.out.println("String参方法" + name);
    }
    public void show(String name,int num) {
        System.out.println("String+int参方法" + name+"\t\t"+name);
    }
}

class TestOperation {
    public static void main(String[] args) {
        Operation operation=new Operation();
        operation.show();
        operation.show(100);
        operation.show("dadsa");
        operation.show("dadw",54);
    }
}

public void m(int a){}
public void m(int b){}
上面两个方法不是重载,他们的方法名相同,参数也一致,所以不是。

构造方法

定义

  • 用于初始化对象
  • new关键字创建对象的时候,必须调用构造方法

特点

  • 名称与类名完全相同
  • 没有返回值类型、返回值
  • 可以有参,也可以无参
  • 注意:如果没有在类中显示定义构造方法,则编译器默认提供无参构造方法
package work;

/**
 * @Author night
 * @Date 2021/8/12 11:32
 */
public class Student {
    String name;
    int age;
    char sex;
    double score;

    //默认构造方法
    public Student() {
        System.out.println("默认构造方法");
        name = "dada";
        age = 5;
        sex = '男';
        score = 99.2;
    }

    public void sayHi() {
        System.out.println("姓名:" + name + "年龄:" + age + "性别:"
                + sex + "分数:" + score);
    }
}

class Test {
    public static void main(String[] args) {
        Student student = new Student();
        student.sayHi();
    }

}

Student student = new Student();有什么用?

  • 内存中开辟一个空间,并赋值属性为默认值
  • 调用构造方法初始化
  • 把对象地址赋值给变量student

构造方法重载

对默认的构造方法进行重载

package work;

/**
 * @Author night
 * @Date 2021/8/12 11:32
 */
public class Student {
    String name;
    int age;
    char sex;
    double score;

    //默认构造方法
    public Student() {
        System.out.println("默认构造方法");
    }

    //重载构造方法
    public Student(String na, int ag, double sc, char se) {
        //实例变量=局部变量;
        name = na;
        age = ag;
        sex = se;
        score = sc;

    }

    //输出方法
    public void sayHi() {
        System.out.println("姓名:" + name + "年龄:" + age + "性别:"
                + sex + "分数:" + score);
    }
}

class Test {
    public static void main(String[] args) {
        Student student = new Student("du", 12, 54.1, '男');
        student.sayHi();
    }

}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CEg599t4-1645534667132)(F:\WP\BaiduNetdiskWorkspace\noteFile\JavaSE\7、面向对象\面向对象.assets\image-20210920151221952.png)]

如果添加有参的构造方法,同时删除无参的构造方法, Student student = new Student();会报错

匿名对象

定义

没有名字的对象

使用场景

当前方法内,对象只使用一次

public class Car {
    public void fire(){
        System.out.println("⻋⼦启动了");
    }
    public void run(){
        System.out.println("⻋⼦⻜驰⽽去");
    }
}
public class Driver {
    public void drive(Car car){
        //调⽤汽⻋的点⽕和开动⽅法
        car.fire();
        car.run();
    }
}
public static void main(String[] args) {
    Driver driver = new Driver();
    //调⽤司机的开⻋⽅法
    driver.drive(new Car());
}

private关键字

定义

  • 一个权限修饰符
  • 可以修饰成员变量和成员方法
  • 被修饰的成员只能在本类中使用

作用

  • 限定使⽤范围, 禁⽌别⼈调⽤类的成员
  • 保证数据的安全性, 可以通过⽅法中的代码对有害数据进⾏过滤
public class Person {
    private int age;
    public void setAge(int age2){
        //符合规则的信息才去赋值
        if (age2 > 0 && age2 < 150) {
            age = age2;
        }else{
            System.out.println("年龄信息不对");
        }
    }
    //获取年龄信息
    public int getAge(){
        return age;
    }
}

JavaBean POJO

  • 类中的属性全部私有化
  • 通过getter 和 setter⽅法进⾏设置
  • 提供toString⽅法⽤来描述对象
  • javabean的主要作⽤是运送数据
public class Person {
    private String name;
    private int age;
    //name的getter⽅法
    public String getName() {
        return name;
    }
    //name的setter⽅法
    public void setName(String name) {
        this.name = name;
    }
    //age的getter⽅法
    public int getAge() {
        return age;
    }
    //age的setter⽅法
    public void setAge(int age) {
        this.age = age;
    }
    public String toString(){
        return name +","+ age;
    }
}

实例:

public class Person {
private String name = "⼩明";
//private void method(){如果是private,主方法无法调用,权限不足
public void method(){
    System.out.println(name);//判断是或否成⽴
    }
}
public static void main(String[] args) {
    Person person = new Person();
    person.method();
}

this关键字

定义

  • 代表本类对象的引⽤
  • ⽤来区分重名的成员变量和局部变量

注意事项

  • 只能在本类⽅法中使⽤
  • 本类的静态⽅法中⽆法使⽤
  • 当我们创建对象并调⽤对象的⽅法时, ⽅法中如果出现了this,指的就是当前创建的这个对象
  • 本类对象中的⽅法调⽤本类中的其他⽅法时, 其实被调⽤⽅法的前⾯就有⼀个省略的this

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iziUobVy-1645534667134)(F:\WP\BaiduNetdiskWorkspace\noteFile\JavaSE\7、面向对象\面向对象.assets\image-20210920151314378.png)]

package work;

/**
 * @Author night
 * @Date 2021/8/12 11:32
 */
public class Student {
    String name;
    int age;
    char sex;
    double score;

    //默认构造方法
    public Student() {
        System.out.println("默认构造方法");
    }

    //重载构造方法
    public Student(String na, int ag, double sc, char se) {
        //实例变量=局部变量;
        name = na;
        age = ag;
        sex = se;
        score = sc;

    }

    //输出方法:使用this关键字
    public void sayHi() {
        System.out.println("姓名:" + this.name + "年龄:" + this.age + "性别:"
                + this.sex + "分数:" + this.score);
    }
}

class Test {
    public static void main(String[] args) {
        Student student = new Student("du", 12, 54.1, '男');
        student.sayHi();
    }
}

应用

1、调用本类中的其他构造方法。如this(实参)

    //重载构造方法
    public Student(String name, int age) {
        //实例变量=局部变量;
        this.name = name;
        this.sex = sex;
    }

    //重载构造方法
    public Student(String name, int age, char sex, double score) {
        //使用this调用上面两个参数的构造方法
        this(name, age);
        //实例变量=局部变量;
        this.sex = sex;
        this.score = score;
    }

使用this调用构造方式时,该语句必须是第一条,而且只能使用一次

2、赋值:当实例变量与局部变量名称相同时,可以使用this关键字赋值.

    String name;
    int age;
    char sex;
    double score;

    //重载构造方法
    public Student(String name, int age, char sex, double score) {
        //实例变量=局部变量;
        this.name = name;
        this.sex = sex;
        this.score = score;
        this.age = age;
    }
}

//重载构造方法
public Student(String name, int age, char sex, double score) {
    //使用this调用上面两个参数的构造方法
    this(name, age);
    //实例变量=局部变量;
    this.sex = sex;
    this.score = score;
}

**使用this调用构造方式时,该语句必须是第一条,而且只能使用一次**

2、赋值:当实例变量与局部变量名称相同时,可以使用this关键字赋值.

```java
    String name;
    int age;
    char sex;
    double score;

    //重载构造方法
    public Student(String name, int age, char sex, double score) {
        //实例变量=局部变量;
        this.name = name;
        this.sex = sex;
        this.score = score;
        this.age = age;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值