[4] Java类与对象

Java类与对象


面向对象编程的语言主要的单位就是类,而类是一种自定义的类型,用类创建出来的变量叫对象。类和对象就是面向对象编程最常见的词。

面向对象的三大基础:

  • 封装,把数据类型和方法打包
  • 继承,新类使用旧类的特性,Java不支持多继承
  • 多态,不同类的对象使用同名方法的时候发生的不同的效果

初步了解Java的类

在C语言中,自定义类型是结构体。结构体里可以封装很多基本数据类型。然后用结构体创建出来的变量就同时拥有这些基本数据类型。

在C++中,自定义类型是类和结构体。C++是在C语言的基础上增加了类的概念,并且对结构体也做了改动(结构体中可以有成员函数,原来C语言是不可以的)。

在Java中,自定义类型是类,已经去掉了结构体的概念,直接用类去取代结构体的位置。

直接看例子:

C语言中的结构体正确用法:

#include<stdio.h>

struct MM
{
  char name[10];
  int age;
};

int main()
{
    struct MM mm={"Alice",19};
    return 0;
}

C语言的结构体只能封装数据类型,不能有成员函数,并且C语言结构体是不能在结构体内进行初始化的操作。

C++的结构体:

#include<iostream>
using namespace std;

struct MM
{
  string name="Coco";
  int age=20;
  void print()
  {
      cout<<name<<'\t'<<age<<endl;
  }
};

int main()
{
    MM mm;
    return 0;
}

C++结构体是可以在结构体中存在成员函数(可以在结构体中实现,也可以在结构体外实现)。然后C++的结构体的数据成员可以在结构体中初始化,也可以在结构体外初始化,也可以用一个成员函数对结构体数据成员进行初始化。然后就是C++的结构体创建变量的时候可以不用带struct关键字。

C++的类:

#include<iostream>
using namespace std;

class MM
{
    public:
    MM(string name,int age):name(name),age(age){}
    protected:
    string name;
    int age;
};

int main()
{
    MM mm("Alice",20);
    return 0;
}

C++的类其实和结构体是一样的,区别仅仅在于默认的权限限定词不同。

到了Java,为了不像C++那样复杂,就直接去掉了结构体的概念,然后直接用类当作Java语言的自定义类型。

class MM{
    String name;
    int age=19;
    public MM(String name,int age)
    {
        this.name=name;
        this.age=age;
    }
    public void print()
    {
        System.out.println(name+"\t"+age);
    }
}

public class Demo{
    public static void main(String[] args){
        MM mm=new MM("Alice",19);
        mm.print();
    }
}

Java类的特点:

  • Java的类也是用class关键字表示
  • 封装完Java的类的时候结尾不用写分号,而C语言和C++是要写分号的。
  • Java没有初始化参数列表的概念,C++有
  • 需要用Java的权限限定词的时候,需要一次写一次,C++则是多次需要写一次就可以。
  • 封装类的时候,不初始化类中的数据成员,数字类型的就默认初始化为0,字符串会初始化为null
  • 一般在类中的数据成员被称为属性,类中的成员方法被称为行为

初步了解Java的对象

对象这个概念,如果你第一反应理解的不是男女朋友的话,那你已经成功一半了。其实所谓的对象就是类实例化的变量。就像是造一个机器人一样,造之前先把各个零件打包过来,然后又用这些打包的零件实现一些功能,这个就是封装类的过程。然后这些打包好了的零件再稍微加工一下,创造出了机器人一号,那么这个机器人一号就这个类的对象。面向对象编程就是对这个机器人做改造,需要什么加什么。

简单的封装一个Java的类,然后创建类的对象,最后简单的实现一些功能:

class MM{
        String name="Alice";
        int age=20;
        public void initData(String name1,int age1){
                name=name1;
                age=age1;
        }
        public void print(){
                System.out.println(name+"的信息:"+"姓名:"+name+"\t年龄:"+age);
        }
}

public class Demo {
        public static void main(String[] args) {
                MM mm=new MM();
                mm.print();
                mm.initData("Coco",19);
                mm.print();
        }
}

输出结果:

Alice的信息:姓名:Alice	年龄:20
Coco的信息:姓名:Coco	年龄:19

上面程序的功能就是,封装了一个美女类,然后美女的信息就有姓名和年龄,这个美女类的功能(方法)就是初始化和打印。在主方法中,创建了MM类的对象mm,但这个mm是一个引用,存在栈区还不能直接使用,要在堆区申请一块内存才能使用。主方法的功能就是创建出对象,然后打印一个默认的,然后初始化新的信息,然后再打印这个对象的信息。

Java构造方法

构造方法的特点:

  • 方法名和类名相同
  • 没有返回值
  • 主要用来初始化类的对象
  • 创建对象的时候都会先调用构造方法
  • 不手动写构造方法的时候,类中会存在一个默认无参的构造方法
  • 手动写了构造方法,默认的构造方法就不存在了
  • 构造方法也是可以重载的
  • Java中,构造方法前写不写public等权限限定词影响不大
class MM{
    String name;
    int age;
    MM(String name1,int age1){
        name=name1;
        age=age1;
        System.out.println("调用构造方法");
    }
    public void print()
    {
        System.out.println(name+"\t"+age);
    }
}

public class Demo{
    public static void main(String[] args){
        //MM mm=new MM();	会报错,因为手动写了有参的构造方法,默认的就不存在了
        MM mm =new MM("Alice",20);	//会打印:调用构造方法
        mm.print();		//会打印:Alice		20
    }
}

输出结果:

调用构造方法
Alice	20

因为Java有自动回收垃圾的机制,所以Java就没有析构的概念,C++没有自动回收垃圾的机制,所以C++就有析构函数的概念。

Java的this关键字

  • 表示当前对象
  • 主要用来区别同名的参数
  • this()方式的构造写法,this()系列的要放在构造方法的首行

和C++中的this关键字是差不多的,C++和Java的this都表示的是当前对象,主要是用来标识同名参数的,区别就是C++的this是指针,而Java的this是引用。

直接看代码找区别:

C++的this:

class MM
{    
public:    
	MM(string name,int age)    
	{        
		this->name=name;        
		this->age=age;    
	}    
protected:    
	string name;    
	int age;
};

Java的this:

class MM{    
	String name;    
	int age;    
	MM(String name,int age){    	
		this.name=name;        
		this.age=age;    
	}
}

在Java中,对象怎么访问类中的成员,this就怎么访问,因为this表示的意思就是当前对象

class GG{        
	String name;        
	int age;        
	GG(String name,int age){                
		this.name=name;                
		this.age=age;        
	}        
	public void print(){                
		System.out.println(this.name+"\t"+this.age);        
	}        
	public void Fun(){                
		System.out.println(name+"的信息如下:");                
		this.print();        
	}
}

public class Demo02 {        
	public static void main(String[] args) {               
		GG gg=new GG("Cukor",21);               
		gg.Fun();               
		GG gg2=new GG("Jack",20);               
		gg2.Fun();        
	}
}

打印结果:

Cukor的信息如下:Cukor	21
Jack的信息如下:Jack	20

可以看到的是gg调用Fun方法的时候,this表示的就是gg,gg2调用Fun方法的时候,this表示的就是gg2。

当类中存在多个构造方法的时候,可以利用this()的形式实现构造方法之间的相互调用,但这个语句要放在构造方法的首行。这个操作就有点像C++的委托构造,不过C++的委托构造要写在初始化参数列表中

class Test{        
	int iNum;        
	double dNum;        
	char cNum;        
	Test(){                
		System.out.println("无参构造方法");        
	}        
	Test(int iNum){                
		this();                
		this.iNum=iNum;                
		System.out.println("一个参数构造方法");        
	}        
	Test(int iNum,double dNum){                
		this(iNum);                
		this.dNum=dNum;                
		System.out.println("两个参数构造方法");        
	}        
	Test(int iNum,double dNum,char cNum){                
		this(iNum,dNum);                
		this.cNum=cNum;                
		System.out.println("三个参数构造方法");        
	}
}

public class Demo03 {        
	public static void main(String[] args){                
		Test ts1=new Test();                
		System.out.println("========================================");                
		Test ts2=new Test(666);                
		System.out.println("========================================");                
		Test ts3=new Test(888,3.14);                
		System.out.println("========================================");                
		Test ts4=new Test(888,3.14,'A');        
	}
}

输出结果:

无参构造方法
========================================
无参构造方法
一个参数构造方法
========================================
无参构造方法
一个参数构造方法
两个参数构造方法
========================================
无参构造方法
一个参数构造方法
两个参数构造方法
三个参数构造方法

this();这种写法,this()系列的一定要放在构造方法的首行!!!

Cukor丘克主页

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值