类与对象
众所周知,java是一个面向对象(object-oriented programming,oop)的语言,它与面向过程有着本质的不同,
1.面向对象和面向过程的区别?
面向过程是一种站在过程的角度思考问题的思想,它强调的是功能行为,功能的执行过程,即先干啥,后干啥。
面向过程的设计:最小的程序单元是函数,每个函数负责完成某一个功能,用以接受输入数据,函数对输入数据进行处理,然后输出结果数据。整个软件系统由一个个的函数组成,其中作为程序入口的函数称之为主函数,主函数依次调用其他函数,普通函数之间可以相互调用,从而实现整个系统功能。
-
面向过程的缺陷
面向过程的设计,是采用置顶而下的设计方式,在设计阶段就需要考虑每一个模块应该分解成哪些子模块,每个子模块有细分为更小的子模块,如此类推,直到将模块细化为一个个函数。
-
问题:
1)设计不够直观,与人类的习惯思维不一致;
2)系统软件适应性差,可扩展性差,维护性低。
面向过程最大的问题在于随着系统的膨胀,面向过程将无法应对,最终导致系统的崩溃。为了解决这一种软件危机,我们提出了面向对象的思想。
面向过程最大的问题在于随着系统的膨胀,面向过程将无法应对,最终导致系统的崩溃,为了解决这一种软件危机,我们提出了面向对象思想。
面向对象是一种基于面向过程的新的编程思想,是一种站在对象的角度思考问题的思想,我们把多个功能放到不同对象里,强调的是具备某些功能的对象。
- 面向对象是更加符合我们常规的思维方式,稳定性好,可重用性强,易于开发大型软件产品,有良好的可维护性。在软件工程上,面向对象可以使工程更加模块化,实现更低的耦合和更高的内聚
- 注意:不要粗浅的认为面向对象一定就优于面向过程的设计
上面介绍了面向对象和面向过程的不同点,接下来,我们仔细介绍一下什么是对象,在介绍对象之前,我们先说说什么是类。
类是构造对象的模板或者蓝图,在类中,我们定义了一组相关属性和行为。通过该属性和行为来描述该对象。属性就是描述该事物的一些状态信息,行为就是该事物可以做什么。比如,我定义一个人的类,那么人就有身高,体重,年龄这些信息,同时人还有吃饭,睡觉这些行为。而对象就是一类事物的具体的体现,对象是类的实例,并且具备这个类的属性和行为。
类的定义的格式
public class 类名{
//成员变量
//成员方法
}
public class Person{
//定义成员变量
public String name;
public int age;
//定义成员方法
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
}
接下来,在主函数里进行调用。
首先,我们需要通过类来创建一个对象,格式为:
类名 对象名 = new 类名();
然后通过“.”来访问成员变量和成员方法
在这里,因为我们给属性赋值了,所以输出会有结果,如果,不赋值直接打印,那么就是按我们之前讲的java基本数据类型的默认值,例如int的默认值为0,而对于像数组,类,接口这样的引用类型,默认值为null.
成员变量与局部变量
刚才,我们在Person类中定义了name和age属性,这些称之为成员变量,还有一种局部变量,存在于方法中,
它们之间也有很多的不同点,首先定义的位置不同,从上图可以看出,同时,根据定义的位置它们的作用的范围也不一样,很显然,成员变量在整个类中都能被使用,而局部变量只能在当前方法中被使用。它们在内存中的位置也不一样,成员变量存在于堆内存中,而局部变量存在于栈内存中。
构造器
我们在创建对象的时候会使用new关键字,那么new关键字到底有什么作用呢?
1.为即将创建的对象分配存储空间。
2.引起对象构造方法的调用。
3.为对象返回一个引用
构造方法是一个在创建对象使被自动调用的特殊方法,java的类都要求有一个构造方法,如果我们没有定义构造方法,那么java的编译器会默认给我们提供一个缺省的构造方法(不带任何参数);
基本格式
修饰符 类名(参数列表){
方法体;
}
public class Person{
//定义成员变量
public String name;
public int age;
//定义成员方法
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
public Person() {
System.out.println("默认构造方法被调用了");
}
}
在这里我们加入一个默认的构造方法。
public class Demo01 {
public static void main(String[] args) {
Person p = new Person();
}
}
在这里,我们只是创建了一个对象,根据打印结果,我们可以发现我们定义的构造方法被默认调用了,构造方法有一些特点
- 构造方法的名字和类名相同,且没有返回值
- 我们不能直接调用构造方法,必须通过new 关键字来自动调用,从而创建类的实例
我们也可以定义一个有参构造方法,可以给成员变量赋值
public Person(String name, int age){
this.name = name;
this.age =age;
}
此时我们在main函数中加入以下代码
Person p1 = new Person("李四",18);
这样,我们不仅创建了一个p1对象,同时给里面的属性赋值了,就不用通过对象名.属性的方式来赋值了。