首页 > 技术文章 > Java面向对象学习(一)创建对象与构造器

ruanzhendong 2021-07-02 15:53 原文

1.定义

1)面向过程:第一步做什么,第二步做什么...

2)面向对象:分类的思想,抽象(将多个对象相像的共同点抽取出来,形成类)

对于描述复杂的事务,需要从宏观上把控,先用面向对象的思想来分析整个系统;但是具体到微观操作,再用面向过程的思想来处理。

2.面向对象编程: Object-Oriented-Programming,简称OOP

        以类的方式组织代码,以对象的形式封装数据

3.三大特性:封装 、继承、多态

从认识论角度:先有对象后有类。对象-----是具体的,具体的事务;  类------是抽象的,是对对象的抽象

代码运行的角度:先有类后有对象,类是对象的模板

 

2.创建与初始化对象

如何初始化一个类:使用new关键词创建

new Student();  //这样就可以初始化Student这个类

=====》在idea上先输入new Student();,再Alt+回车

Student student = new Student();

使用new关键词创建时,会分配内存空间、给创建的对象进行默认初始化及对类中构造器的调用

 

1)先创建一个Application类,这是我们包含main方法的类,一个项目里面只有一个main方法

2)再创建一个Student学生类,一个类中只有属性(成员变量)和方法

 

 1 //学生类
 2 public class Student {
 3     //一个类中只会有属性和方法
 4 
 5     //属性:字段
 6     String name;
 7     int age;
 8     
 9     //方法
10     public void study(){
11         //this表示当前类
12         System.out.println(this.name+"在学习");
13     }
14 }

 

3)在main方法里实例化Student类,然后才可以进行调用

 1 //一个项目应该只存在一个main方法,也就是说demo02这个项目只在Application类中写一个main方法,其他类里面不写main方法
 2 public class Application {
 3     public static void main(String[] args) {
 4         //由于类是抽抽象的,所以需要实例化
 5 
 6         //实例化Student类
 7         //先输入new Student();,再Alt+回车
 8         Student student = new Student();
 9         /*类实例化后会返回一个自己的对象,
10           也就是说,上面的student对象就是Student类的一个具体实例!
11           例如下面的xiaoming,xiaolan也是Student类的一个具体实例
12          */
13         Student xiaoming = new Student();
14         Student xiaolan = new Student();
15         //调用学生类的name属性
16         //这里会输出null,因为上面在创建xiaoming这个对象的时候,会进行默认初始化,
17         //而name的默认属性是String,
18         System.out.println(xiaoming.name);
19 
20         //赋值
21         xiaoming.name="小明";
22         xiaoming.age=3;
23         System.out.println(xiaoming.name);
24         System.out.println(xiaoming.age);
25     }
26 }

 

3.构造器(构造方法)

1)一个类即使什么都不写,也会有构造器。构造器必须与类名相同,必须没有返回值类型,也不能写void。在new时被调用。使用new关键字,本质上是在调用构造器

2)构造器分为无参构造和有参构造。类中默认有一个无参构造,可以不写。但是,如果类中显式写了有参构造而不写无参构造,无参构造就自动失效。所以,为了防止子类调用问题,一般都会写上。有参构造与无参构造都存在时,就相当于方法的重载。

3)构造器用于初始化类中的属性

 

新建一个Person类,里面为空,在main方法中调用,显示如下图:

运行发现可以运行成功,下面打开Person.java的class文件查看

 

 

 

 

 

加上out目录,然后查看out目录下会有生成的class文件(java文件运行后才会有)

 

 进行对比发现,class文件里默认就有一个person的方法,这就是构造器。

 

Alt+Insert

添加无参构造

 

 

 

 

 

添加有参构造

 

 

  

1)先创建一个Application类

2)再创建一个Person类

 1 public class Person {
 2     String name;
 3     int age;
 4 
 5     //无参构造,默认可以不写
 6     public Person() {
 7         //构造器用于初始化值
 8         this.name = "rzd";
 9     }
10 
11     //有参构造,当存在有参构造时,无参构造必须显式定义
12     //这里this.name中的name是上面的属性name
13     //而=右边的name是定义方法时()内的形参name
14 
15     public Person(String name, int age) {
16         this.name = name;
17         this.age = age;
18     }
19 }

3)在main方法里实例化Person类,调用构造器

 1 //构造器
 2 public class Application {
 3     public static void main(String[] args) {
 4         Person person = new Person();
 5         Person person1 = new Person("rzd1", 5);
 6 
 7         /*由于有参无参构造都存在,就相当于方法的重载
 8           所以上面实例化Person类时,决定要调用哪一个构造器
 9           是根据是否有传参来定的。
10          */
11 
12         System.out.println(person.name);
13         System.out.println(person1.name);
14     }
15 }

 

 

4.创建对象的内存分析

 我们先写一个程序

在demo04包下新建Pet类

 1 package com.rzd.oop.demo04;
 2 //面向对象内存分析
 3 public class Pet {
 4     public String name;
 5     public int age;
 6 
 7     public void shout(){
 8         System.out.println(this.name+"叫了一声");
 9     }
10 }

再在demo04同级目录下新建Application类

 1 package com.rzd.oop;
 2 import com.rzd.oop.demo04.Pet;
 3 
 4 public class Application {
 5     public static void main(String[] args) {
 6         Pet dog = new Pet();
 7 
 8         dog.name="旺财";
 9         dog.age=3;
10         dog.shout();
11         System.out.println(dog.name);
12         System.out.println(dog.age);
13     }
14 }

此时debug运行这个程序,可以看到流程如下:

进入main方法--->new一个Pet类的dog对象--->进入Pet类,调用Pet类下的无参构造,生成name和age属性,此时属性的值为默认值--->给name和age复制“旺财”和3,调用shout方

以上流程,在内存中的流程如下:

 

 

 

5.小结

1)类与对象:类是一个模板,是抽象的;对象是类的一个具体实例,是具体的

2)方法:先定义、再调用

3)对象的引用

引用类型:除了8大基本类型(byte short int long float double char boolean ),其他都是引用类型。

对象是通过引用来操作的,栈--->堆

4)属性:又叫字段(Field)、成员变量

属性的定义:修饰符   属性类型  属性名=属性值

5)对象的创建和使用

new关键词创建对象,调用构造器

Person xiaoming=new Person();

xiaoming.name  调属性

xiaoming.sleep()  调方法

 

 

推荐阅读