类与对象(上)

一、面向对象的初步认识   

1、类的定义

Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。面相对象程序设计关注的是对象,而对象是现实生活中的实体,比如:洗衣机。但是洗衣机计算机并不认识,需要开发人员告

在java中定义类时需要用到class关键字,具体语法如下诉给计算机什么是洗衣机。

class WashMachine{
  public String brand;  // 品牌
  public String type;   // 型号
  public double weight;  // 重量
  public double length;  // 长
  public double width;  // 宽
  public double height;  // 高
  public String color;  // 颜色
 
  public void washClothes(){  // 洗衣服
    System.out.println("洗衣功能");
 }
 
  public void dryClothes(){   // 脱水
    System.out.println("脱水功能");
 }
 
  public void setTime(){    // 定时
    System.out.println("定时功能");
 }
}

2、类的实例化

用类类型创建对象的过程,称为类的实例化,在java中采用new关键字,配合类名来实例化对象。

public class Main{
public static void main(String[] args) {
    PetDog dogh = new PetDog();   //通过new实例化对象
    dogh.name = "阿黄";
    dogh.color = "黑黄";
    dogh.barks();
    dogh.wag();
   
    PetDog dogs = new PetDog();
    dogs.name = "阿黄";
    dogs.color = "黑黄";
    dogs.barks();
    dogs.wag();
}
}
输出结果:
阿黄: 旺旺旺~~~
阿黄: 摇尾巴~~~
赛虎: 旺旺旺~~~
赛虎: 摇尾巴~~~

3、this关键字

先看一个日期类的例子:

public class Date {
  public int year;
  public int month;
  public int day;
  public void setDay(int y, int m, int d){
    year = y;
    month = m;
    day = d;
 }
  public void printDate(){
    System.out.println(year + "/" + month + "/" + day);
 }
  public static void main(String[] args) {
    // 构造三个日期类型的对象 d1 d2 d3
    Date d1 = new Date();
    Date d2 = new Date();
    Date d3 = new Date();
    // 对d1,d2,d3的日期设置
    d1.setDay(2020,9,15);
    d2.setDay(2020,9,16);
 d3.setDay(2020,9,17);
    // 打印日期中的内容
    d1.printDate();
    d2.printDate();
    d3.printDate();
 }
}

以上代码可能存在以下问题:

1. 形参名不小心与成员变量名相同

public void setDay(int year, int month, int day){
  year = year;
  month = month;
  day = day;
}

2. 三个对象都在调用setDate和printDate函数,但是这两个函数中没有任何有关对象的说明,setDate和printDate函数如何知道打印的是那个对象的数据呢

this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。

public class Date {
  public int year;
  public int month;
  public int day;
  public void setDay(int year, int month, int day){
    this.year = year;
    this.month = month;
    this.day = day;
 }
  public void printDate(){
    System.out.println(this.year + "/" + this.month + "/" + this.day);
 }
}

注意:this引用的是调用成员方法的对象。

public static void main(String[] args) {
  Date d = new Date();
  d.setDay(2020,9,15);
  d.printDate();
}

注:1. this的类型:对应类类型引用,即哪个对象调用就是哪个对象的引用类型
2. this只能在"成员方法"中使用
3. 在"成员方法"中,this只能引用当前对象,不能再引用其他对象
4. this是“成员方法”第一个隐藏的参数,编译器会自动传递,在成员方法执行时,编译器会负责将调用成员方法对象的引用传递给该成员方法,this负责来接收

二、构造方法与

1、构造方法

构造方法(也称为构造器)是一个特殊的成员方法,名字必须与类名相同,在创建对象时,由编译器自动调用,并且在整个对象的生命周期内只调用一次。

public class Date {
  public int year;
  public int month;
  public int day;
  // 构造方法:
  // 名字与类名相同,没有返回值类型,设置为void也不行
  // 一般情况下使用public修饰
  // 在创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次
  public Date(int year, int month, int day){
    this.year = year;
    this.month = month;
    this.day = day;
    System.out.println("Date(int,int,int)方法被调用了");
 }
  public void printDate(){
    System.out.println(year + "-" + month + "-" + day);
 }
  public static void main(String[] args) {
    // 此处创建了一个Date类型的对象,并没有显式调用构造方法
    Date d = new Date(2021,6,9);  // 输出Date(int,int,int)方法被调用了
    d.printDate();   // 2021-6-9
 }
}

注:1. 名字必须与类名相同
2. 没有返回值类型,设置为void也不行
3. 创建对象时由编译器自动调用,并且在对象的生命周期内只调用一次(相当于人的出生,每个人只能出生一次)
4. 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法)

public class Date {
  public int year;
  public int month;
  public int day;
 
  // 无参构造方法
  public Date(){
    this.year = 1900;
    this.month = 1;
    this.day = 1;
}

  // 带有三个参数的构造方法
  public Date(int year, int month, int day) {
    this.year = year;
    this.month = month;
    this.day = day;
 }
  public void printDate(){
    System.out.println(year +"-" + month + "-" + day);
 }
  public static void main(String[] args) {
    Date d = new Date();
    d.printDate();
 }
}

为什么局部变量在使用时必须要初始化,而成员变量可以不用呢?

public class Date {
  public int year;
  public int month;
  public int day;
  public Date(int year, int month, int day) {
    // 成员变量在定义时,并没有给初始值, 为什么就可以使用呢?
    System.out.println(this.year);
    System.out.println(this.month);
    System.out.println(this.day);
 }
 
  public static void main(String[] args) {
    // 此处a没有初始化,编译时报错:
    // Error:(24, 28) java: 可能尚未初始化变量a
    // int a;
    // System.out.println(a);
    Date d = new Date(2021,6,9);
 }
}

对象空间被申请好之后,对象中包含的成员已经设置好了初始值,比如:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值