JAVA面向对象01——认识类与对象

认识类与对象

OOP

Java中的重点内容!

什么是OOP

OOP:Object-Oriented Programming 面向对象程序设计
Java是面向对象,OOP是使用Java语言描述客观存在的事和物,并使用程序的逻逻辑将这些事和物联系起来,为实现某个目的而进行交互的过程。因此必须熟悉OOP才能很好的使用Java。

OOP的程序组成

面向对象的程序是由对象组成的,每个对象包含对用户的公开部分和隐藏部分。

认识类与对象

什么是类

类是一个模板,是对一类对象和行为和状态的描述,类中定义的是属性和行为(方法)。

什么是对象

对象是类的一个实例,表示一个独立的个体,每个对象都有自己的属性,通过不同的属性来区分不同对象。

类与对象的关系

类是对象的模板,对象是类的实例。类只有通过对象才可以使用,而在开发之中应该先产生类,之后再产生对象。类不能直接使用,对象是可以直接使用的。

类与对象的定义和使用

定义

{
class 类名{

	变量(属性);
	
	方法(行为);
}

范例:定义一个人(Person),有名字(name)和年龄(age)两个属性,有一个介绍(introduce)行为

public class Person {
    String name;
    int age;

    public void introduce(){
        System.out.println("我的名字是:"+name+",年龄为:"+age);
    }
}

使用

实例化对象

1、声明和实例化分开。

/*
	类名 对象名 = null;
	对象名 = new 类名();
*/
Person person = null;
person = new Person();

2、声明并且实例化对象

//类名 对象名 = new 类名();
Person person = new Person();

使用对象操作类

//对象名.属性名:表示调用类之中的属性;
//对象名.方法名():表示调用类之中的方法。

    public static void main(String[] args) {
    	//声明对象person1
        Person person1 = null;
        //实例化对象
        person1 = new Person();

		//给person1的name和age属性赋值
        person1.name = "WANWAN";
        person1.age = 21;

		//调用person1的介绍
        person1.introduce();
		
		Person person2 = new Person();
        person2.name = "MOMO";
        person2.age = 22;
        person2.introduce();
    }

运行结果:

我的名字是:WANWAN,年龄为:21
我的名字是:MOMO,年龄为:22

两种方式实例化对象的区别

从内存角度分析实例化过程;
首先了解一下两种内存空间是用来做什么的:
1、栈内存:保存的是堆内存的地址(方便理解就想成是保存了对象的名字)。
2、堆内存:保存的是对象的属性内容,堆内存要用new关键字来分配空间。
JAVA面向对象01——认识类与对象
第一种方法:
JAVA面向对象01——认识类与对象
JAVA面向对象01——认识类与对象
JAVA面向对象01——认识类与对象
JAVA面向对象01——认识类与对象
第二种方法:

JAVA面向对象01——认识类与对象
JAVA面向对象01——认识类与对象
JAVA面向对象01——认识类与对象
可以看出,第二种方法就是把第一种方法的一二步合起来了

对象的引用传递

先看代码,还是刚才的两个对象,我们让person2 = person1来看看结果。

  public static void main(String[] args) {
        Person person1 = null;
        person1 = new Person();
        person1.name = "WANWAN";
        person1.age = 21;
        person1.introduce();

        Person person2 = new Person();
        person2.name = "MOMO";
        person2.age = 22;
        person2.introduce();

        person2 = person1; //引用传递
        person2.name = "FANFAN";
        person1.introduce();
    }

运行结果:

我的名字是:WANWAN,年龄为:21
我的名字是:MOMO,年龄为:22
我的名字是:FANFAN,年龄为:21

可以看到通过person2.name修改了name属性值,person1的name属性值也改变了。

我们可以来看下内存中的过程:
JAVA面向对象01——认识类与对象
JAVA面向对象01——认识类与对象
JAVA面向对象01——认识类与对象

类的构造方法

在Java中每个类都有构造方法。如果没有显式地为类定义构造方法,Java 编译器将会为该类提供一个默认构造方法。
在创建一个对象的时候,至少要调用一个构造方法。构造方法的名称必须与类同名,一个类可以有多个构造方法。

Person类:

public class Person {
    String name;
    int age;
    //无参构造
    public Person() {
   		System.out.println("调用了无参构造");
    }
	//有参构造(1个参数)
    public Person(String name){
    	System.out.println("调用了带name有参构造");
        this.name = name;
    }
	//有参构造(全部参数)
    public Person(String name, int age) {
    	System.out.println("调用了全参构造");
        this.name = name;
        this.age = age;
    }
}

下面看几个测试,来搞清楚对无参与带参的调用。

public class Test {
    public static void main(String[] args) {
       Person person1 = new Person();//没有参数
    }
}
//运行结果:
//调用了无参构造


 public class Test {
    public static void main(String[] args) {
       Person person1 = new Person("WAN",21);//全参
    }
} 
//运行结果:
//调用了全参构造


 public class Test {
    public static void main(String[] args) {
       Person person1 = new Person("WAN");//带name参数
    }
} 
//运行结果:
//调用了带name有参构造

public class Test {
    public static void main(String[] args) {
       Person person1 = new Person(22);//带age参数
    }
}
//运行结果:
//Error:不兼容的类型: int无法转换为java.lang.String

通过这些测试可以看出:new对象时会根据所带的参数选择已经写了的构造方法,如果没有对应的构造方法,则会报错

类的成员方法

类成员方法就是对象所拥有的动作,比如自我介绍就是人的一个动作,就可以称之为人的一个方法。成员方法由自己编写,和之间在入口方法中写代码一样。

格式:

 访问修饰符 [特殊修饰符 static/final/synchronized] 返回类型 方法名称([形参列表]){
       ...
   }

例:

public class Person {
    String name;
    int age;

	//这个就是成员方法
    public void introduce(){
        System.out.println("我的名字是:"+name+",年龄为:"+age);
    }
}
上一篇:重温JavaScript(lesson12):面向对象(5)


下一篇:JavaScript 函数对象的prototype属性和this属性