Java学习八之面向对象(一)

本章提要:面向对象是Java的重中之重,内容复杂多样,且逻辑性强,写的内容也是本人对这块知识的浅薄理解,希望对大家有所帮助,我会使用文字和代码结合解释,所涉及内容可查看目录,话不多说,开写!

一、面向对象

1.什么是面向对象

编程思想:

        面向过程:解决问题,将一个繁杂的问题分解成简单的步骤,然后一步步地去做,最后达到最终地目标。
        把大象装冰箱总共分几步?
        1)把冰箱门打开
        2)把大象装进去
        3)把冰箱门关上

        面向对象:解决问题时,关心问题中涉及地对象,以及对象地行为和特征,由对象的行为组合最终解决问题.

        大象装进冰箱:
        1)问题中涉及了哪些对象:冰箱(主体),大象(依赖)
        2)分析每一种对象的行为:
                冰箱:开门,装东西,关门
                大象:没有主动行为
        3)再由对象的行为进行组合得到最终的结果
                冰箱.开门
                冰箱.装(大象)
                冰箱.关门

面向对象的相关概念:

类:类别,类型 class,type
        对现实世界中具有相同行为或特征的一类事物的统称。

对象:Object,实例
        对象就是现实世界中具体的一个事物。

行为:对象可以做的事情

特征:对象的特点

创建对象:通过一个类,创建出这个类的一个实例。

对象与类的关系:
        类是对象的抽象描述方式
        行为:使用方法
        特征:使用属性
        对象是类的实例化,具体化,在Java中对象是内存空间

2.Java中的类

类是一种数据类型(本质)
类是Java中程序员自己定义的一种数据类型,自定义类型
处理学生的信息:
姓名
性别
年龄
学号
  …

2.1类的语法

修饰符 class 类名{
        类体
}
1)class关键字,表示定义一个类
2)修饰符:限定类的使用范围和使用方式
        权限修饰符:public,private,protected,默认的
         static:静态的
         final:最终的
         abstract:抽象的
3)类体:在一个类中可以写
  a)属性:也叫字段(Field),也就是定义在类中的变量/常量,分为静态的/非静态的
  b)方法:Method,静态的/非静态的.
  c)构造方法:Constructor 类的构造器,用来构造类的对象的
  d)块:静态块/非静态块
  e)类:内部类

定义一个学生类
特征:姓名,学号,性别,年龄
行为:吃,睡,玩

public class Student {
    //特征:使用属性描述
    String name;
    String num;
    String sex;
    int age;

    //   行为:使用方法描述
    public void eat() {
        System.out.println("吃饭");
    }

    public void sleep() {
        System.out.println("在宿舍睡觉");
    }

    public void play() {
        System.out.println("玩游戏");
    }
}
2.2使用类

类的本质是数据类型
定义变量,定义数组,作为方法的参数,作为返回值类型

在这里插入图片描述

2.3创建类的对象

类名 变量=new 类名();

在这里插入图片描述

2.4调用类的属性和方法

对象/变量.属性/方法()
在这里插入图片描述

2.5内存机制

在这里插入图片描述
在这里插入图片描述

2.6构造方法

构造方法是指创建对象的的东西,构造方法不是方法,它是构造器
定义:

  1. 构造方法的名字,必须与类名完全相同
  2. 构造方法不能有返回值
  3. 构造方法可以有参数列表
  4. 构造方法还可以重载。
           修饰符(参数列表){
                  构造方法体
           }

注意:

  1. 使用new创建类的对象,实际就是在调用类的构造方法
           new Student(); 就是在调用Student类的无参构造方法
    2.创建对象时,可以通过传递参数选择不同的构造方法进行调用
  2. 如果一个类没有定义任何的构造方法,在编译时,编译器就会自动地为类添加一个无参构造方法,称为默认无参构造方法。如果类中定义了任何地构造方法,默认无参构造方法将不会再被添加。
  3. 构造方法没有返回值类型,有返回值类型地方法就是类的方法

在这里插入图片描述
在这里插入图片描述

2.7构造方法和一般方法的不同:

1、构造方法是在new对象的时候运行,而一般的方法是在对象调用的时候才执行。
2、一个对象的建立,构造方法只执行一次,而一般方法可以被改对象调用多次。

3.类和对象的总结

1、现实世界都是由很多对象组成的,基于对象的共同特征抽象出类。
2、对象:真实存在的对象
3、类中包含:
      1)所有对象所共有的特征–属性(静)
       2)所有对象所共有的行为–方法(动)
4、类是对象的模板,对象是类的具体实例。
5、一个类可以创建多个对象:同一个类的不同对象,结构相同,数据不同。

易混淆知识点:

int num = 3;
int[] nums = new int[3];
Student student = new Student(); // student :变量、实例、对象
Student[] students = new Student[3];
Teacher teacher = new Teacher();
Teacher[] teachers = new Teacher[3];
int、int[]、Student、Student[]这些都是数据类型,数据类型的后面是这种类型的一个变量。
格式: 数据类型 变量
var v;

数据类型的默认值

数据类型的默认值:
int类型默认值是:0
double类型默认值是:0.0
boolean类型默认值是:false
String类型默认值是:null
int[]类型默认值是:null
Student[]类型默认值是:null
boolean[]类型默认值是:null

int[] array = new int[3]; 里面的存放默认值是0
boolean[] array = new boolean[3]; 里面的存放默认值是false
Student[] array = new Student[3];里面的存放默认值是null

4.打印对象信息

打印对象信息有多种方法:
1.可以自己编写一个函数去返回信息

  public String getInfo() {
        return "Student[id:" + id + ",name:" + name + ",age:" + age + ",gender:" + gender + "]";
    }

在这里插入图片描述

2.重写toString()方法
在这里插入图片描述
重写toString()后,直接打印对象即可,不需要调用toString()

二、面向对象使用细节讲解

1.属性私有化

在这里插入图片描述
在这里插入图片描述

     上图发现当属性是public公有的时侯,在别的类中创建的实例对象,可以直接给属性赋值,但是为了隐藏对象的细节,让使用者不能随意访问数据,要进行属性私有化,让使用者只能通过设计好的set/get方法来访问和修改数据。保证了数据的安全性,同时也确保了代码的可维护性。
在这里插入图片描述
     当我们将属性私有化时,别的类中实例化的对象无法直接使用属性,只能通过set/get方法来设置或获取属性值
所以属性一般是私有的 private:访问范围 是 当前类
在这里插入图片描述

2.setXXX(Object XXX)中要注意的地方

在这里插入图片描述
     实例对象调用setId()方法,出入了一个值1,这个值应该最后通过setId()方法,赋给属性id 但是当我用鼠标指到左边被赋值的id上的时候,显示一句话The value id assigned to ‘id’ is never used(赋给’id’的值id永远不会被使用)
当我指到右边id的时候,显示一句话Variable ‘id’ is assigned to itself (变量’id’被赋值给自己)。首先要先明确左边的id是被赋值的id,我们想要他代表的是属性id,而右边的id是传入的参数。所以说当我们执行id=id的时候,左边的id并没有被赋值,这是为什么呢?
     这里就要引出一个原则:就近原则,所以在函数setId(int id)中,id=id,左边的id相当于也是传递的参数。 那么我们如何去解决这个问题呢?
     这里我们引入一个关键字 this
     this有两种使用方式
     1.this.属性
          调用当前对象的属性
          在构造方法中,this代表当前被创建的对象
          在普通方法中,this代表调用当前方法的对象
在这里插入图片描述

     2.this()/this(参数列表)
          只能出现在构造方法中,必须是构造方法的第一行。
          调用当前类的其它构造方法,根据参数列表匹配相应的构造函数
在这里插入图片描述
在这里插入图片描述
          创建student2实例对象时,使用了public Student(int id, String name, int age)的构造方法,而该构造方法中使用了this(参数列表),this(id, name, age, “男”);this()将会去匹配相应参数列表的构造函数并调用。调用的构造方法完成后再去执行,public Student(int id, String name, int age)构造方法的方法体其余的语句。

附上Student类完整代码


//    实体类:和数据库表一一对应
public class Student {
    //属性 field:静态的描述这个事物特征
//    属性一般是私有的 private:访问范围 是 当前类
    private int id;
    private String name;
    private int age;
    private String gender;
    
//    方法:method
//无参构造

//java默认会提供一个无参构造方法
//    如果你自己实现了任何一个构造方法
//    java就不会再提供这个默认的无参构造方法
    public Student() {
//        System.out.println("Student student1");
    }

//有参构造方法
//    Constructor:构造方法
    public Student(int id, String name, int age, String gender) {
        System.out.println("Student student2");
        this.id = id;
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    public Student(int id, String name, int age) {
        //        Call to 'this()' must be first statement in constructor body
        // new Student(int id, String name, int age, String gender)
        this(id, name, age, "男");
        System.out.println("Student student3");

    }

    //    实例方法,必须先new出一个对象,对象.方法();
    public void setId(int id) {
//        The value id assigned to 'id' is never used
//        Variable 'id' is assigned to itself  变量id 自身给自身赋值
        // 就近原则
//        id = id;
        // this:当前new出来对象
        // student.setId(1) this当成student这个对象
        this.id = id;
    }
    public int getId() {
        return id;
    }

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

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

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", gender='" + gender + '\'' +
                '}';
    }

    public String getInfo() {
        return "Student[id:" + id + ",name:" + name + ",age:" + age + ",gender:" + gender + "]";
    }
}

三、练习

1.定义长方形类

含:属性:宽、高(整型);
方法:求周长、面积;
构造方法3个:(1)无参——宽、高默认值为1;(2)1个参数——宽、高相等;(3)2个参数——宽、高各为参数值。
要求:进行测试计算周长和面积。

实体类


public class Rectangle {
  private int heigth=1;
  private int width=1;

    public Rectangle() {
    }

    public Rectangle(int heigth) {
        this.heigth = heigth;
        this.width=heigth;
    }

    public Rectangle(int heigth, int width) {
        this.heigth = heigth;
        this.width = width;
    }

    public int getHeigth() {
        return heigth;
    }

    public void setHeigth(int heigth) {
        this.heigth = heigth;
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }
    public int area(){
        return this.heigth*this.width;
    }
    public int circumference(){
        return this.width*2+this.heigth*2;
    }
}

测试类

  @Test
    public void test6() {
        Rectangle rectangle = new Rectangle();
        System.out.println(rectangle.circumference());
        System.out.println(rectangle.area());
        Rectangle rectangle1 = new Rectangle(2);
        System.out.println(rectangle1.circumference());
        System.out.println(rectangle1.area());
        Rectangle rectangle2 = new Rectangle(1, 2);
        System.out.println(rectangle2.circumference());
        System.out.println(rectangle2.area());

    }

2.编写Java程序,模拟简单的计算器。

定义名为Number的类,其中有两个整型数据成员num1和num2,应声明为私有。编写构造方法,赋予num1和num2初始值,再为该类定义加(add)、减(sub)、乘(multi)、除(div)等公有成员方法,分别对两个成员变量执行加、减、乘、除的运算。
在main方法中创建Number类的对象,调用各个方法,并显示计算结果。
Number类


public class Number {
    private int num1;
    private int num2;

    public Number(int num1, int num2) {
        this.num1 = num1;
        this.num2 = num2;
    }

    public Number() {
    }

    public int getNum1() {
        return num1;
    }

    public void setNum1(int num1) {
        this.num1 = num1;
    }

    public int getNum2() {
        return num2;
    }

    public void setNum2(int num2) {
        this.num2 = num2;
    }

    public int add() {
        return this.num1 + this.num2;
    }

    public int sub() {
        return this.num1 - this.num2;
    }

    public int multi() {
        return this.num1 * this.num2;
    }

    public String div() {
        String str = " ";

        if (num2 != 0) {
            str = this.num1 / this.num2 + " ";

        } else {
            str = "数据异常除数不能为0";
        }
        return str;
    }
}

测试类

  @Test
    public void test5() {
        Scanner scanner = new Scanner(System.in);
        int num1 = scanner.nextInt();
        int num2 = scanner.nextInt();
        Number number1 = new Number(num1, num2);
        System.out.println(number1.add());
        System.out.println(number1.sub());
        System.out.println(number1.multi());
        System.out.println(number1.div());
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_不知名小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值