首页 > 技术文章 > 06.面向对象

best-you-articles-040612 2021-05-17 14:59 原文

面向对象基本概述

  • 对象:是真实唯一存在的事务

  • 类:实际上是对某种类型事物的共同属性和行为的抽取

自定义类的三个步骤:

  1. 自定义类

    格式:

    ​ class 类名{

    ​ 事物的公共属性使用成员变量描述

    ​ 事物的公共性未使用函数来描述

    }

  2. 通过类创建对象

    new 类名();

  3. 访问对性的属性或者调用对象的方法

    访问对象属性的格式:

    ​ 对象.属性名

    设置对象的属性:

    ​ 对象.属性名 = 数据

注意:

  1. 如果成员属性出现在了堆内存中,就会有一个默认的初始化

  2. 除了八种基本数据类型,其他的默认初始值都是null

    对象一旦创建,对象的成员变量也会发生分配默认的初始值

初学者的经典错误:

  1. 不在同一个范围内随意引用了变量,变量在同一个作用域是可以直接访问的
  2. 如果一个类要访问另一个类的变量值,那么这时候只能通过创建对象进行访问
class car{
    String name;
    String color;
    int wheel;
  	public void run(){
        System.out.println("hh");;
        if(wheel >= 4){
            System.out.println();
        }else{
            System.out.println();
        }
    }
}
class carfactory{
    String name;
    String address;
    String tel;
    public void repair(car c){
        if(c.wheel >= 4){
            System.out.println("");
        }else{
            c.wheel = 4;
        }
    }
    
}
class demn{
    public static void main(String[] args){
        car c = new car();
        c.name = "nmn";
        c.wheel = 4;
        c.color = "黑色";
        System.out.println(c.name + c.color)
        c.run();
        
    }
    
}

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

定义位置上区别:

  • 成员变量是定义在方法之外的,类之内的
  • 局部变量是定义在方法之内的

作用上的区别:

  • 成员变量的作用是用于描述一类事物的公共属性
  • 局部变量的作用就是提供一个变量给方法内部使用‘

生命周期的区别:

  • 随着对象的创建而存在,随着对象的消失而消失
  • 局部变量在调用了相应的方法时执行到了创建该变量的语句时存在,局部变量一旦出了自己的作用域,那么马上从内存中消失

初始值的区别:

  • 成员变量有默认的初始值

    int 0

    float 0.0f

    double 0.0

    boolean false

    char ’ ’

    String null

  • 局部变量没有默认的初始值,必须初始化才能使用

匿名对象

没有引用类型变量所指向的对象成为匿名对象

匿名对象要注意的事项:

  • 我们一般不会给匿名对象赋予属性值,因为无法获取到属性值
  • 两个匿名对象永远都不可能是同一个对象

匿名对象可以简化书写

匿名对象的引用场景:

  • 如果一个对象需要调用一个方法,而调用完这个方法之后,该对象就不在使用了,这时候可以使用匿名对象
  • 可以作为实参调用一个函数
class student{
    int num;
    String name;
    public void study(){
        System.out.println("好好学习天天向上");
    }
}
class demn{
    public static void main(String[] args){
        student s = new student();
        new student();//匿名对象
        System.out.println()
        System.out.println(new student() == new student());//判断的是地址是否相等
        s.study();
        new student().study();//与上面等价
        //书写简便,可以尽快的释放内存空间
        
        carfectory f = new carfectory();
        f.repair(new car());//匿名对象的使用,该对象调用完一个方法后,就不在使用了
    }
}

封装

class mymember{
    public String name;
    private String sex;
    public int salary;
    public void talk(){
        System.out.println("哈哈哈");
    }
    public void setsex(String s){//注意:如果比较两个字符串是否相等,不要使用==计较,应该使用equals方法
        if(s.equals("男") || s.equals("女")){
            sex = s;
        }else{
            sex = "男";
        }
    
    }
    public void getsex(){
        return sex;
    }
}
class demn{
    public static void main(String[] args){
        mymember m = new mymember();
        m.name = "狗娃";
        m.setsex("男")
        m.salary = 500;
        m.sex = "不男不女";
        
        System.out.println(m.name + m.getsex() + m.salary);
    }
}
需求:使用java类描述百合网的会员
问题:性别有问题
根本原因:由于其它人可以直接操作sex属性,可以对sex属性进行了直接的赋值
面向对象的语言的三大特征:
    继承
    多态
    封装
解决方法:封装
    封装的步骤:
    1.使用private修饰需要被封装的属性
    2.使用公共的方法设置或者获取该私有的成员属性
    	命名规范:
    		set属性值();
    		get属性值();
权限修饰符:就是控制变量等其他东西的可见范围
	public:公共的,public修饰的成员变量和方法任何人都可以访问
	private:私有的,只能在本类中进行直接访问
疑问:封装一定要提供get或者set方法吗
    不一定,根据需求而定的
规范:在现实开发中,一般实体类的所有成员都要封装起来
实体类:实体类就是用于描述一类事物的
工具类(Arrays数组的工具类)
封装的好处:
    1. 提高数据的安全性
    2. 操作简单
    3. 隐藏了实现
   	
需求:使用java类描述一个计算机类,计算机具备操作数1,操作数2,操作符三个公共属性,还具备运算功能。要求:不能直接对操作数1,操作数2,运算符这些属性进行直接的赋值,要封装起来
class calculator{
    private int operand1;
    private int operand2;
    private char option;
    public void calculate()
    {
        switch(option){
            case '+':
                System.out.println(operand1 + operand2);
                break;
            case '-':
                System.out.println(operand1 - operand2);
                break;
            case '/':
                System.out.println(operand1 / operand2);
                break;
            case '*':
                System.out.println(operand1 * operand2);
                break;
        }
    }
    public void initcalculator(int n1, int n2, char o){
        operand1 = n1;
        operand2 = n2;
        if(o == '+' || o == '-' || o == '/' || o == '*')
        {
            option = o;
        }
    }

}
class helloworld{
    public static void main(String[] args){
        calculator c = new calculator();
        c.initcalculator(1, 2, '*');
        c.calculate();
    }
}

推荐阅读