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()系列的一定要放在构造方法的首行!!!