在描述事物的时候,该事物已存在就具备的一些内容,这是我们就可以把它们都定义在构造函数中,那么什么是构造函数呢?
构造函数就是构建创造对象时调用的函数,它可以给对象进行初始化。构造函数与类名相同,第一个字母大写。一个类中如果没有定义过构造函数,那么该类一定会有一个默认的空参数的构造函数。如果定义了指定的构造函数,那么系统默认的构造函数就没有了,如果还要用到就需要重新定义一次。而且,构造函数不唯一,可以有多个,用于不同的对象进行针对性的初始化。多个构造函数在类中是以重载(后面会讲到)的形式体现的。下面有一些代码:
class Person{ private String name; private String sex; private int age; Person(){} Person(String name){ this.name=name; } Person(String name,String sex){ this.name=name; this.sex=sex; } Person(String name,String sex,int age){ this.name=name; this.sex=sex; this.age=age; } }
构造函数的出现对我们对对象的初始化提供了极大的帮助。那么构造函数与一般的函数有什么区别呢?
有两种区别:
一:对象创建时就会调用与之对应的构造函数对对象进行初始化。而一般函数是在对象创建之后,需要函数功能时才调用。
二:对象创建时,构造函数会调用并且只调用一次。而一般函数是在对象创建后,还可以调用多次。
什么是封装性?
封装是面向对象思想的三大特征之一。而封装就是隐藏实现细节,仅对外提供访问接口。封装的原则就是将不需要对外提供的内容都隐藏起来,并且属性隐藏之后对外提供公共的方法进行访问。一般封装有属性的封装、方法的封装、类的封装、组件的封装、模块化封装、系统级封装。封装之后有什么好处呢?封装之后可以将对象模块化,信息隐藏,代码重用,插件化易于调试,并具备一定的安全性。
class Person{ private String name; private String sex; private int age; Person(){} public void setName(String name){ this.name=name; } public String getName(){ return name; } }
注意:当成员变量与局部变量重名时,可以用关键字this区别。this:代表着当前对象,就是所在函数所属对象的引用。简单点说就是哪个对象调用了this所在的函数,this就代表着哪个对象。this也可以用于构造函数中调用其他的构造函数。但是this的引用只能放在第一行。
什么叫方法的重载?
在类中可以创建多个方法,它们都具有同一个名字,但是却具有不同的参数和不同的定义。方法的命名首个字母要小写,从第二个单词开始首个字母大写如getName();
方法重载如下代码:
class Demo{ . . . public int add(int a,int b){ return a+b; } public int add (int a,int b,int c){ return a+b+c; } public double add (double a,float b,int c){ return a+b+c; } }
浅谈关键字static。
static是静态的意思,是全局变量,static关键字是用于修饰成员,包括成员变量和成员函数。而被修饰后的成员具备着如下特点:随着类的加载而加载、优先于对象而存在、被所有的对象所共享、可以直接被类名调用(类名.静态成员)。
注意:使用了static的修饰的静态方法只能访问静态成员,不能调用非静态数据。而且静态方法中不可以写this,super等关键字。
谈到静态变量也就想到成员变量,那这两种变量有什么区别呢?
1、两个变量的生命周期不同:
成员变量随着对象的创建而存在,随着对象的被收回而释放;
静态变量随着类的加载而加载,随着类的消失而消失。
2、调用的方式不同:
成员变量只能被对象调用,而静态变量可以被对象调用,也可被类名调用。
3、别名不同:
成员变量也称为实例变量,静态变量也可称为类变量。
4、数据存储的位置不同:
成员变量数据存储在堆内存的对象中,也叫对象的特有数据。
静态变量数据存储在方法区的静态区。
静态有这种功能,那什么时候使用静态修饰呢?
1、修饰静态变量时,当分析对象中所具备成员变量的值都是相同的,这时成员变量就可以定义为静态的;只要数据在对象中都是不同的,是对象的特有数据,必须是非静态的;如果是相同的数据,对象不需要修改,只要使用即可,不需要存储在对象中,可以定义为静态的。
2、修饰静态方法时、函数是否用静态修饰就看一点:就是该功能函数是否访问到对象中的特有数据。简单点说:从源码来看,该功能是否需要访问非静态的成员变量,如果需要,该功能就是非静态的。
静态代码块、构造代码块和普通代码块的区别:
静态代码块随着类的加载而执行,而且只执行一次。作用是用于给类进行初始化。
普通代码块直接写在主函数中的代码块(方法);
构造代码块可以给所有的对象进行初始化,初始化的内容是所有对象共有的的功能。