java类和对象(一)

本文详细介绍了面向对象编程的概念,包括类的定义(成员变量和成员方法)、对象的实例化以及this的使用。通过实例展示了如何创建和使用类及对象,解释了构造方法的作用以及对象初始化的三种方式。面向对象编程是通过类和对象实现模块化和数据封装,便于代码的复用和维护。
摘要由CSDN通过智能技术生成

 什么是面向对象   

  •       要想学明白类和对象一定要明白什么是面向对象。从面向过程中学习什么是面向对象。
  •       面向过程是 对象 和 对象之间 协作完成一件事情。(如:小红洗衣服)

  类的定义和使用

  •       我们用来确定对象,类里面有  1.成员变量  可以理解为类的属性

                                                    2.成员方法  可以理解为类的行为

  •   类的定义格式    :// 创建类

                           class ClassName{

                                成员变量 ; //也是类的属性

                                成员方法  ;//类的行为

                          }

  •   class为定义类的关键字,ClassName为类的名字(要使用大驼峰的格式命名,即首字母大写),{}中为类的主体。
  • 范例:定义一个person类
//创建对象
class Person{    //定义的类,person是类名
  
   public String name;      //成员变量 也可以理解为类的属性
   public int age;

   public void eat(){       //成员方法  也可以理解为类的行为
      System.out.println(name+"吃饭!");    
   }

   public void sleep(){
      System.out.println(name+"睡觉!");
   }
}

  实例化对象

1.  确定了对象我们下一步要做的是实例化对象,就是去创建一个对象。通过new关键字来创建/实例化对象。

2. 为什么我们要实例化对象?

     做个比方。类实例化出对象就像现实中使用建筑设计图建造出房子,类就像是设计图,只设计出需要什么东西,但是并没有实体的建筑存在,同样类也只是一个设计,实例化出的对象才能实际存储数据,占用物理空间。

3. 一个类可以实例化出多个对象,实例化出的对象 占用实际的物理空间,存储类成员变量

           

范例:实例化一个对象


   class Person {   //定义的类,person是类名
   public String name;      //成员变量 也可以理解为类的属性
   public int age;

   public void eat(){       //成员方法  也可以理解为类的行为
      System.out.println(name+"吃饭!");    
   }

   public void sleep(){
      System.out.println(name+"睡觉!");
   }
}


//实例化对象
public class TestDemo{
  public static void main(String args[]){
    Person person1=new Person();   //new关键字创建一个对象的实例
    person1.name="qiangqiang";    //使用.来访问对象中的属性和方法
    person1.sleep();

    Person person2= new Person();   //同一个类可以创建多个实例
    person2.name= "shanshan";
    person2.sleep();
  }
}

 运行结果:qiangqiang睡觉!
                shanshan睡觉!

 4.this的引用

     java 编译器给每个 成员方法 增加了一个隐藏的引用类型参数,该引用参数指向当前对象 ( 成员方法运行时调用该成员方法的对象 ) ,在成员方法中所有成员变量的操作,都是通过该引用去访问 。只不过所有的操作对用户是透明 的,即用户不需要来传递,编译器自动完成。
this代表当前对象的引用:
public class MyDate {  //定义一个类,类就是对象
  public int year;
  public int month;
  public int day;

  public void setDate(MyDate this,int year, int month, int day){ 
    this.year = year;    //this里面存了myDate对象的引用,和mydDate2
                        //这个this要写出来,不然就会被当成局部变量,因为形参名与成员变量名相同
    this.month = month;  //局部变量优先

    this.day = day;
  }


  public void printDate(){        // ()里隐藏了Date this
     System.out.println(this.year + "/" + this.month + "/" + this.day); 
  }     //编译器里隐藏的this


  public static void main(String[] args){

     MyDate myDate = new MyDate(); //通过new关键字new一个对象
     myDate.setDate(2022,3,25);    //myDate调用setDate(点就是调用的意思),
                                   //于是就给myDate赋值
     myDate.printDate();

     MyDate myDate2 = new MyDate();  //可以new多个对象
     myDate2.setDate(2022,3,28);
     myDate2.printDate();
  }
}

输出结果:

虽然编译器自己自己通过this引用去访问,也不用我们去传递,但是建议习惯使用this。

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

this的三种用法

1.this.data    访问成员变量

2.this.func();   访问成员方法

3.this();   调用本类中其他构造方法:必须放到第一行!所以只能在当前构造方法中调用一个。

2.this调用成员方法:

public void doClass(){

    System out println("正在上课“);

    this.doHomeWork();

}

public void doHomeWork(){

     System out println("正在写作业“);

}

3.this()调用其他构造方法(本类中)

public Student(){

     this(String: "xiaobao",age: 18);   //放在第一行

                                       //调用本类中带两个参数的构造方法,第一个String,第二个int类型

System out println("这是不带参的构造方法“);

}

public Student(String name,int age){

      this.age = age;

      this.name=name;

      System out println("这是带两个参数的构造方法“);

}

输出结果:

这是带两个参数的构造方法

这是不带参的构造方法

4.this不能形成环

不能让两个构造函数互相调用

public Date (){
    this ( 1900 , 1 , 1 );
}
public Date ( int year , int month , int day ) {
     this ();
}
/*
无参构造器调用三个参数的构造器,而三个参数构造器有调用无参的构造器,形成构造器的递归调用
编译报错: Error:(19, 12) java: 递归构造器调用
*/

构造方法

当我们实例化对象时:1.为对象分配内存

                                    2.调用合适的构造方法(也可以有别的方法初始化对象下面有讲到)

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

注意:一旦用户定义,编译器则不再生成。

  • 没有返回值,设为void也不行。
  • 名字必须与类名相同。
  • 暂时先用public修饰
  • 构造方法可以重载(用户根据自己的需求提供不同参数的构造方法) [重载(名字相同,参数列表不同)]
public class Date{
    public int year;
    public int month;
    public int day;
//下面是构造函数,一般用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 d =new Date(2021,6,9);
        d.printDate();
    }

}

输出结果:

 

  •  注意:构造方法的作用就是对对象中的成员进行初始化,并不负责给对象开辟空间。
  • 当没有写构造方法时,编译器自动给一个不加参数的构造方法
  • 构造方法可以改变(初始化)当前对象的属性
class Student {
    //就地初始化对象
    public String name = "Tom";
    public int age = 19;
//这个构造方法可以直接让实例化对象重新赋值
    public Student(String name,int age) {
        this.name=name;
        this.age=age;
        System.out.println("这是个带参的构造方法");

    }


    public void doclass() {
        System.out.println(name + "正在上课");
    }

    public void show() {
        System.out.println("姓名:" + name + "年龄:" + age);
    }
}

public class TestDemo2 {
    public static void main(String[] args) {
        Student student = new Student("lisa", 9);
        student.show();
    }
}

输出结果: 

 构造方法中,可以通过this调用其他构造方法来简化代码

public class Date {
   public int year;
   public int month;
   public int day;
    // 无参构造方法--内部给各个成员赋值初始值,该部分功能与三个参数的构造方法重复 
    // 此处可以在无参构造方法中通过this调用带有三个参数的构造方法 
    // 但是this(1900,1,1);必须是构造方法中第一条语句

  public Date(){  
    //System.out.println(year); 注释取消掉,编译会失败
    this(1900, 1, 1); //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; 
  } 
}

初始化

三种初始化的方法:

  1. 默认初始化
  2. 构造方法
  3. 就地初始化

 1.默认初始化

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

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(其他数据类型默认值如下)。

3.就地初始化

public class Date {
    public int year = 1900;
    public int month = 1;
    public int day = 1;

 public Date(){ 
 }

 public Date(int year, int month, int day) { 
 }

  public static void main(String[] args) {
      Date d1 = new Date(2021,6,9);
      Date d2 = new Date(); 
  }

 }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值