类与对象、封装、构造方法

1.1面向对象思想概述

  • java语言是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想,这里的对象泛指现实中的一切事物,每种事物都具备自己的属性和行为
  • 特点:面向对象思想是一种更符合我们思考习惯的思想,它可以将简单的事情复杂化,并将我们从执行者变成指挥者。
  1. 面向过程:把衣服脱下来-->找一个盆-->放点洗衣粉-->加点水-->浸泡10分钟-->揉一揉-->清洗衣服-->拧干-->晾
    起来
  2. 面向对象:把衣服脱下来-->打开全自动洗衣机-->扔衣服-->按钮-->晾起来
  • 面向过程:强调步骤。
  • 面向对象:强调对象,这里的对象就是洗衣机。
  • 面向对象的语言中,包含了三大基本特征,即封装、继承和多态。 

1.2 类与对象

  • 类:是一组相关属性和行为的集合。可以看成是一类事物的模板,使用事物的属性特征和行为特征来描述该类事物。
  • 现实中,描述一类事物:
  1. 属性:就是该事物的状态信息。
  2. 行为:就是该事物能够做什么。
  • 举例:猫
  1. 属性:名字、体重、年龄、颜色。
  2. 行为:走、跑、叫。
  • 对象:是一类事物的具体体现。对象是类的一个实例,必然具备该事物的属性和行为。
  • 现实中,一类事物的一个实例:一只小猫。
  • 举例:一只小猫。
  1. 属性:jack、10kg、1years、yellow
  2. 行为:溜墙根走、蹦跶的跑、喵喵叫

1.3 类与对象的关系

  • 类是对一类事物的描述,是抽象的
  • 对象是一类事物的实例,是具体的
  • 类是对象的模板,对象是类的实体

 1 .4类的定义

  • 现实世界中的一类事物:

       属性:事物的状态信息。 行为:事物能够做什么。

  • java中用class描述事物也是如此:

       成员变量:对应事物的属性。 成员方法:对应事物的行为。

  • 类的定义格式:

        public class 类名{

             //成员变量

             //成员方法

         }

  • 定义类:就是定义类的成员,包括成员变量和成员方法
  • 成员变量:和以前定义变量几乎是一样的,只不过是位置发生了改变。在类中,方法外
  • 成员方法:和以前定义方法几乎是一样的,只不过把static去掉
public class Student {
    //成员变量
    private String name;
    private int age;
    private double score;

    //成员方法
    public void eat(){
        System.out.println("吃个蛋炒饭");
    }

    public void sleep(){
        System.out.println("学习java累了要睡觉");
    }
}

1.5 对象的使用

对象的使用格式

创建对象: 类名   对象名=new 类名();

使用对象访问类中的成员:

对象名.成员变量;

对象名.成员方法;

public class Student_Test01 {
    public static void main(String[] args) {
        //创建对象
        Student s = new Student();
        System.out.println("s:"+s);

        //直接输出成员变量的值
        System.out.println("姓名:"+s.name);
        System.out.println("年龄:"+s.age);
        System.out.println("-------------");

        //给成员变量赋值
        s.name="马云";
        s.age=19;

        System.out.println("姓名:"+s.name);
        System.out.println("年龄:"+s.age);
        //调用成员方法
        s.eat();
        s.sleep();
    }
}

1.6 成员变量的默认值

  数据类型 默认值
基本数据类型 整型(byte,short,int,long) 0
  浮点数(float,double) 0.0
  字符(char) '\u0000'
  布尔(boolean) false
引用数据类型 数组,类,接口 null

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

public class Car {
   int x;//类中方法外的变量是成员变量
    
    public void run(int speed){
        int a=10;//方法中或参数上的变量都是局部变量
    }
}
  • 什么是成员变量:放在类中方法外的变量
  • 什么是局部变量:放在方法中或参数上的变量
  • 成员变量和局部变量的区别
  • (在类中的位置不同)
  1. 成员变量:放在类中方法外
  2. 局部变量:放在方法中或参数上的变量
  • (作用范围不一样)
  1. 成员变量:类中都可以使用
  2. 局部变量:本方法中能用
  • (初始化值不同)
  1. 成员变量:有默认值
  2. 局部变量:没有默认值,不赋值不能用
  • (在内存中的位置不同)
  1. 成员变量:堆内存
  2. 局部变量:栈内存
  • (生命周期不同)
  1. 成员变量:随着对象的创建而存在,随着对象的消失而消失
  2. 局部变量:随着方法的调用而存在,随着方法的调用完毕而消失

3.1 面向对象三大特性:封装、继承、多态

  •  封装
  • 人的属性:姓名,年龄,身高,性别,三围,银行卡密码,钱包等。
  • 人有很多属性,但是有些属性是隐私的,不能暴露出来。
  • 封装的原则(步骤):
  1. 将隐私的内容私有。
  2. 提供get/set方法(get表示获取/set表示修改)
  • 如何将成员变量私有
  1. 使用private关键字。
  2. private表示私有,只有本类可以使用。
  3. private可以修饰成员变量和成员方法。
  • private修饰成员变量格式
  1. private 数据类型  变量名(如:private  String name)
  • 封装的好处:提高代码的安全性。

4.1 this关键字: 

  • 成员变量和局部变量重名了(就近原则),使用局部变量。
  • this关键字的作用:用来区分局部变量和成员变量
  • this.变量名    表示成员变量
  • this到底是什么东西呢?谁调用方法,this就是谁
public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        name = name;
        age = age;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        age = age;
    }
}





public class PersonDemo {
    public static void main(String[] args) {
        Person p = new Person();
        p.setAge(18);
        p.setName("马云");
        System.out.println("姓名:"+p.getName()+"年龄:"+p.getAge());
    }
}
  • 虽然使用了p.setAge和p.setName给成员变量赋值了,但是打印出来结果还是姓名:null年龄:0  。这是因为get/set方法中name/age还是局部变量,并没有赋值给成员变量。需要加上this关键字解决,this.name代表成员变量的name,则this.name=name,这样就将值赋给成员变量了。
  • 成员变量赋值失败了,也就是说,在修改了setXxx() 的形参(方法小括号中的String name为形参)变量名后,方
    法并没有给成员变量赋值!这是由于形参变量名(name)与成员变量名(name)重名,导致成员变量名被隐藏,方法中的变量名,无法访问到成员变量,从而赋值失败。所以,我们只能使用this关键字解决问题。

public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("this="+this);
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}




public class PersonDemo {
    public static void main(String[] args) {
        Person p = new Person();
        System.out.println("p="+p);
        p.setAge(18);
        p.setName("马云");
        System.out.println("姓名:"+p.getName()+"年龄:"+p.getAge());
    }
}
  •  输出结果:
p=Test.Person@58ceff1 
this=Test.Person@58ceff1
姓名:马云年龄:18

在上面的代码中,我们把对象p和this打印出来,发现p和this的地址值是一样 的,都是 @58ceff1,说明是同一个对象,p调用了setName方法 ,setName中的this地址和p一样,所以,谁调用了方法,this就是谁


 5.1 构造方法

  • 什么是构造方法:构造方法也是一个方法,在创建对象的时候执行一次(早)
  • 构造方法的作用:在创建对象的时候给成员变量赋值(给对象初始化)
  • 构造方法格式:
  • public 类名(){ 
        
    }
    
  •  特点:
  1. 没有返回值,连void都不能写。
  2. 构造方法名称和类名一致。
  3. 一个类不写构造方法,java会默认赠送一个无参构造。
  4. 当我们自己添加了构造方法,就没有默认的无参构造方法了。
  5. 构造方法可以重载。
  •  构造方法什么时候调用:
  • 类名   对象名  = new 类名();

        Person p = new Person

        new  :表示在堆中申请一块内存空间

        类名():表示调用构造方法

public class PersonDemo {
    public static void main(String[] args) {
        Person p = new Person();
        System.out.println("p="+p);
        /*
            问题1:如果代码太多,可能会忘记赋值,最终没值
            问题2:如果有50个成员变量赋值,需要写50个set方法,麻烦
            有没有什么办法一创建出对象,成员变量就有值了,后面直接使用
            这时就需要使用有参构造方法
         */
        p.setAge(18);
        p.setName("马云");
        System.out.println("姓名:"+p.getName()+"年龄:"+p.getAge());

        System.out.println("-------------------------");
        //创建对象,使用有参构造
        Person p2 = new Person("马化腾",19);
        System.out.println("姓名:"+p2.getName()+"年龄:"+p2.getAge());
    }
}





public class Person {
    private String name;
    private int age;

    public Person() {
        System.out.println("我是无参构造");
    }

    public Person(String name, int age) {
        System.out.println("我是有参构造");
        this.name = name;//将参数赋值给成员变量
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        System.out.println("this="+this);
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

构造方法可以给成员变量赋值,set方法也可以给成员变量赋值,他们的区别是

  • 构造方法会在创建对象的时候走一次,一个对象只能执行一次构造方法。
  • set方法是在对象创建好之后,通过对象调用set方法,一个对象可以多次调用set方法,这样就可以修改值。(比如年龄今年是18岁,过了一年变成19,那么就需要通过set方法去修改值)

版权申明:本文为博主原创文章,转载请注明出处https://blog.csdn.net/Huangyuhua068/article/details/81417223

如有错误,欢迎批评指正,联系邮箱:[email protected]

猜你喜欢

转载自blog.csdn.net/Huangyuhua068/article/details/81417223