面向对象(Object Oriented)

面向对象[Object Oriented]

  • 设计对象并使用
    • 设计类,创建对象并使用
  • 对象在内存中的运行机制
    • 多个对象的内存图
    • 两个变量指向同一个对象内存图
  • 构造器
  • this关键字
  • 封装
    • 封装思想概述
    • 如何更好的封装
  • 标准JavaBean

设计对象并使用

设计类,创建对象并使用

:是对象共同特征的描述。
对象:是真实存在的具体实例。
结论:在java中,必须先设计类,才能创建对象并使用。

面向对象(Object Oriented)_第1张图片
类:


public class Car {

    // 成员变量
    String name;
    double price;

    // 方法
    public void start(){
        System.out.println(name + "启动了");
    }

    public void run(){
        System.out.println("价格为:" + price + "的" + name + "跑起来了");
    }
}


对象:


public class Test {
    public static void main(String[] args) {
        // 创建汽车对象
        Car c = new Car();
        c.name = "红旗";
        c.price = 25.5;
        System.out.println(c.name);
        System.out.println(c.price);
        c.start();
        c.run();

        System.out.println("-------------------");
        Car c2 = new Car();
        c2.name = "五菱宏光";
        c2.price = 9.2;
        System.out.println(c2.name);
        System.out.println(c2.price);
        c2.start();
        c2.run();
    }
}


定义类的补充注意事项:

  • 类名首字母建议大写,且有意义,满足“驼峰模式”。
  • 一个Java文件中可以定义多个class类,但只能一个类是public修饰,而且public修饰的类名必须成为代码文件名。实际开发中建议一个文件定义一个class类。
  • 成员变量的完整定义格式是:修饰符 数据类型 变量名称 = 初始化值;一般无需指定初始化值,存在默认值。
    面向对象(Object Oriented)_第2张图片
    面向对象(Object Oriented)_第3张图片

对象在内存中的运行机制

多个对象的内存图

面向对象(Object Oriented)_第4张图片
面向对象(Object Oriented)_第5张图片

面向对象(Object Oriented)_第6张图片


两个变量指向同一个对象内存图



面向对象(Object Oriented)_第7张图片
垃圾回收:

  • 注意:当堆内存中的对象,没有被任何变量引用(指向)时,就会被判定为内存中的“垃圾”。


构造器



构造器的作用:

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

构造器的格式:
面向对象(Object Oriented)_第8张图片
调用构造器得到对象的格式:
在这里插入图片描述
构造器的分类和作用:

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

构造器的注意事项:

  • 任何类定义出来,就默认自带了无参数构造器,写不写都有。
  • 一旦定义了有参数构造器,那么无参数构造器就没有了,如果还想用无参数构造器,此时就需要自己手写一个无参数构造器了。
    面向对象(Object Oriented)_第9张图片
// 构造器
public class Car {
    String name;
    double price;
    
    public Car(){
        System.out.println("--无参构造器被调用--");
    }
    
    public Car(String n,double p){
        System.out.println("--有参构造器被调用--");
        name = n;
        price = p;
    }
}

//调用构造器创建对象
public class Test {
    public static void main(String[] args) {
        //通过调用构造器得到对象
        Car c = new Car();
        c.name = "Benz";
        c.price = 59.6;
        
        //调用有参构造器
        Car c2= new Car("BWM", 42.8);
    }
}


this关键字



this关键字是什么:

  • 可以出现在构造器、方法中
  • 代表当前对象的地址
    面向对象(Object Oriented)_第10张图片

this关键字的作用:

  • 可以用于指定访问当前对象的成员变量、成员方法

区别:

public class Car {
    String name;
    double price;
    
    public Car(String name,double price){
        this.name = name;
        this.price = price;
    }
	
	// 有this
    public void  goWith(String name){
        System.out.println(this.name + "正在和" + name + "比赛~");
    }
}


public class Test {
    public static void main(String[] args) {

        Car c= new Car("BWM", 42.8);

        c.goWith("Benz");
    }
}
// 运行结果:BWM正在和Benz比赛~

public class Car {
    String name;
    double price;
    
    public Car(String name,double price){
        this.name = name;
        this.price = price;
    }
    
	// 没有this,name会就近传值
    public void  goWith(String name){
        System.out.println(name + "正在和" + name + "比赛~");
    }
}

public class Test {
    public static void main(String[] args) {

        Car c= new Car("BWM", 42.8);

        c.goWith("Benz");
    }
}
// 运行结果:Benz正在和Benz比赛~


封装

封装思想概述


  • 面向对象的三大特征:封装、继承、多态

  • 封装:告诉我们,如何正确设计对象的属性和方法。

  • 封装的原则:对象代表什么,就要封装对应的数据,并提供数据对应的行为。


    人画圆,画圆方法是属于圆的。而不属于人的。

面向对象(Object Oriented)_第11张图片


如何更好的封装


  • 一般建议对成员变量使用 private(私有、隐藏)关键字修饰进(private修饰的成员只能在当前类中访问)。
  • 为每个成员变量提供配套 public 修饰的getter、setter方法暴露其取值和赋值。
    面向对象(Object Oriented)_第12张图片
    面向对象(Object Oriented)_第13张图片

public class Student {
    // 1、成员变量 使用private修饰,只能在本类中访问了
    private int age;

    /**
        2、提供成套的getter和setter方法暴露其取值和赋值
     */
    public void setAge(int age){
        if (age >= 0 && age <= 200){
            this.age = age;
        }else {
            System.out.println("您的年龄数据有问题!");
        }
    }

    public int getAge(){
        return age;
    }
}


public class Test1 {
    public static void main(String[] args){
        Student s = new Student();
        s.setAge(23);
        System.out.println(s.getAge());
    }
}
// 运行结果:23


public class Test1 {
    public static void main(String[] args){
        Student s = new Student();
        s.setAge(-23);
        System.out.println(s.getAge());
    }
}
// 运行结果:您的年龄数据有问题!


标准JavaBean



JavaBean:

  • 也可以称为实体类,其对象可以用于在程序中封装数据。

标准JavaBean须满足如下书写要求:

  • 成员变量使用 private 修饰。
  • 提供成员变量对应的 setXxx() / getXxx()方法。
  • 必须提供一个无参构造器;有参数构造器是可写可不写的。

书写规范:


public class User {
    // 1、成员变量建议使用private私有
    private String name;
    private double height;
    private double salary;

    /**
     * 2、 要求提供无参数构造器,有参数构造器是可选的
     */
    public User() {

    }

    public User(String name, double height, double salary) {
        this.name = name;
        this.height = height;
        this.salary = salary;
    }

    /**
     * 3、 必须为成员变量提供成套的setter和getter方法
     */
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public double getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }
}


成员变量和局部变量的区别:

面向对象(Object Oriented)_第14张图片

你可能感兴趣的:(JAVA,java)