Java学习(面向对象2)

构造器

学习目的

1.真正知道对象具体时通过调用什么代码得到的
2.能够掌握为对象赋值的简便写法
3.为以后学习面向对象编程的其他内容做支撑

定义&分类

定义

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

//修饰符 类名(形参列表){}
public class Car{
    //无参数构造器
    public Car(){……}
    //有参数构造器
    public Car(Sering name, double price){……}
}

注意:这里只需要public即可,不需要class!

调用构造器得到对象的格式:

//类 变量名称 = new 构造器;
Car c = new Car();
Car c = new Car("奔驰", 39.80);

分类及作用

注意事项:

  1. 任何类定义出来,默认自带了无参数构造器,写不写都有。
  2. 一旦定义了有参数构造器,默认自带的无参数构造器就消失了,如果需要使用,就需要自己定义一下。

this关键字

定义:可以出现在构造器、方法中,代表当前对象的地址。
作用:可以用于指定访问当前对象的成员变量、成员方法。

this在有参数构造器中的用法

public class Car{
    String name;
    double price;
    public Car(String name, double price){
        name = name;
        price = price;
    }
public class Test {
    public static void main(String[] args) {
        Car c1 = new Car("凯迪拉克",30.0);
        System.out.println(c1.price);
        System.out.println(c1.name);
    }
}

变量命名应该做到见名知义,所以说此处采用name变量来接传递过来的name值

在赋值的时候,传递过来的name值就近赋给了作为局部变量的name(它自己),并没有赋值给对象中的name,这样的话,这个构造器就是无效的,结果如下。
image.png
用this就可以完美解决这个问题(将以上代码第5.6行进行更改):
this.name = name;
this.price = price;
image.png

this在有成员方法中的用法

public class Car{
    String name;
    double price;
    public void goWith(Srting name){
        System.out.println(name+"在和"+name+"比赛");
    }
}
这种情况下,仍是传过来的name值运用两次,而忽视了对象中的name,在第五行第一个name前面加this.即可:`System.out.println(this.name+"在和"+name+"比赛");`

封装

定义&原则

定义: 封装是把彼此相关数据和操作包围起来,抽象成为一个对象,变量和函数就有了归属,想要访问对象的数据只能通过已定义的接口。

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

表面上看,人画圆,画是人的动作,那应该放在人这里,实则不然,这里涉及到了封装的原则。

原则 :对象代表什么,就得封装什么样的数据,并提供数据对应的行为。
所以说这里就是圆提供了画的方法,人调用这个方法,画应该放在圆这个对象中。

封装思想的好处

Sun公司在Java提供了各类对象给我们使用,在设计时是按照封装原则设计的,会提供相应属性来封装数据,也会提供相应方法。
image.png
举个例子:
image.png
这是Scanner这个对象中所包含的部分方法,我们可以直接调用这些方法方便我们编程,但是如果Scanner所有方法都不能满足需求,那就只能自己创建对象和方法实现。
好处:

  1. 可以让编程变得简单些:有什么事,找对象,调方法即可。
  2. 降低学习成本,可以少学少计,需要时直接找即可。

更好的封装

  1. 一般建议对成员变量使用private(私有、隐藏)关键字修饰,修饰后的成员只能在当前类中访问。
  2. 为每个成员变量提供配套的getter、setter方法暴露其取值和赋值。
public class Student {
    //private修饰
    private int age;
    //setter方法
    public void setAge(int age) {
        if(age>=0 && age<=200){
            this.age =age;
        }else{
            System.out.println("Error!");
        }
    }
	//getter方法
    public int getAge() {
        return age;
    }
}
public class Test {
    public static void main(String[] args) {
        Student s = new Student();
        s.setAge(23);
        System.out.println(s.getAge());
    }
}

如果在main方法中加入一行代码:s.age = 15;
将会出现以下报错:'age' has private access in 'Student'

标准JavaBean

定义:也可以称为实体类,其对象可以用于在程序中封装数据。
书写要求:

  1. 成员变量必须使用private修饰
  2. 提供成员变量对应的setXxx()/getXxx()方法
  3. 必须提供一个无参数构造器,有参数构造器可写可不写

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

每日一练

需求: 模仿电影信息展示
image.png

分析:

  1. 一部电影事一个对象,需要先设计电影类,再创建电影对象
  2. 三部电影对象可以以此用数组存储起来
  3. 依次遍历数组中的每个电影对象,取出其信息进行展示

最终代码:

public class Film {
    private String name;
    private double score;
    private String role;

    public Film(){

    }
    public Film(String name, double score, String role){
        this.name = name;
        this.score = score;
        this.role = role;
    }
    //getter and setter

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

    public String getName() {
        return name;
    }

    public void setRole(String role) {
        this.role = role;
    }

    public String getRole() {
        return role;
    }

    public double getScore() {
        return score;
    }

    public void setScore(double score) {
        this.score = score;
    }
}
public class main {
    public static void main(String[] args) {
        //设计电影类
        Film[] films = new Film[3];
        //输入电影信息
        films[0] = new Film("《长津湖》",9.7,"吴京");
        films[1]  = new Film("《我和我的父辈》",9.6,"吴京");
        films[2] = new Film("《五个扑水的少年》",9.5,"辛云来");
        //遍历并展示信息
        for (int i = 0; i < films.length; i++) {
            System.out.println("=========================");
            System.out.println("电影名:" + films[i].getName());
            System.out.println("得分:" + films[i].getScore());
            System.out.println("主演:" + films[i].getRole());
        }
        System.out.println("=========================");
    }
}

image.png

  • 27
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值