java学习面向对象构造函数
在java当中目前我们学到的一个比较特殊的函数就是main函数,他是JVM执行的入口,所以书写的格式是固定的,现在我们来介绍java中另一个比较特殊的函数:
构造函数:构造对象的时候调用的函数,作用,给对象进行初始化。
创建对象的时候必须用构造函数进行初始化,但不显示的声明构造函数的时候,默认会有一个空参数的构造函数:
Person()
{ }
如果显式声明一个构造函数的时候,类就调用这个构造函数。同时,那个原来默认的构造函数也会被取消,函数的相同不相同就跟类名还有参数的个数和顺序决定的。
特点:
1、构造函数名与类名相同
2、不用定义返回值类型
3、没有具体的返回值
一般函数和构造函数的区别:
1、对象创建时就会调用与之对应的构造函数,进行初始化。一般函数是对象创建后,需要该函数功能时,才调用。
2、对象创建时只被调用一次,一般函数,对象创建后,可以被调用多次。
class Person
{ private String name;
private int age;
//构造函数与类名相同,构造函数不用定义返回类型,void也不用定义;构造函数没有具体的返回类型
Person()
{
System.out.print("初始化函数");
} public void setAge(int n)
{ if(n>0&&n<100)
age = n;
else
System.out.print("非法的年龄数值,请检查您的输入是否有误"); } public int getAge()
{ return age; } void speak()
{ System.out.print(name+"....."+age); } } class PersonDemo
{ public static void main(String[] args) {
Person p = new Person(); }
构造函数的重载:
什么时候用构造函数:
在描述事物时,该事物一存在就存在一些内容,这些内容都定义在构造函数当中。
为了能够在初始化的时候,选择初始化各个对象,这里需要函数重载:
构造函数可以有多个,用于对不同的对象进行针对性的初始化。
构造函数在类当中是以函数的重载体现的。
class Person
{ private String name;
private int age;
//构造函数与类名相同,构造函数不用定义返回类型,void也不用定义;构造函数没有具体的返回类型
Person()
{
System.out.print("初始化函数");
} //函数重载
Person(String na)
{ name = na; } public void setAge(int n)
{ if(n>0&&n<100)
age = n;
else
System.out.print("非法的年龄数值,请检查您的输入是否有误"); } public int getAge()
{ return age; } void speak()
{ System.out.print(name+"....."+age); } }
class PersonDemo
{ public static void main(String[] args) {
Person p = new Person();
Person p2 = new Person("小强");//初始化时传入的参数,是给对应的构造函数使用的。 }
构造函数初始化内存图解:
初始化时的文字描述:在这个对象初始化的时候,main函数先进栈,之后需要Person对象是,告诉堆在堆当中创建一个Person对象,待堆中创建完Person之后,会采用默认的值对他进行初始化,初始化完成之后,在返回引用地址之前,会先检查,是否有构造函数,如果有构造函数的话。此时调用构造函数,构造函数进栈,然后按照参数的个数和类型对指定的构造函数进行初始化,待构造函数调用返回,出栈之后这个时候,堆才会把引用地址传递给栈中的Person型变量p。
这里需要明确的一点就是,在栈当中调用函数,如果他的名称和堆当中的变量的名称同名的话,会优先调用栈当中的变量。
构造函数使用注意:
1、如果我们把代码当中的person构造函数改为:
void Person()
{ }
此时如果我们再调用Person()这个方法的时候,就会报错,提示找不到符号,我们可能回想。默认初始化的时候,不是默认调用了空的构造函数么,这里怎么可能还会报错?原因是这个样子滴.....因为我们下面定义了一个构造函数的重载,只要有一个构造函数在的话,原来的默认构造函数,就不会再出现了。
class Person
{ int age;
String name; void Person()
{ System.out.print("Hello Person"); } Person(int ag)
{ age = ag; } } class PersonDemo
{ public static void main(String[] args) {
Person p = new Person();
System.out.print("cccc");
} }
所以这个样子写,是错误的。
如果我们给构造函数写上return会怎样呢?
Person()
{ System.out.print("Hello Person");
return ;//加上return,并不会报错。但是这里的return仅表示,函数结束。由于他没有类型,此时也不可能返回值。在java当中值都是有类型的,没有类型的是不允许出现的。 }
一般很少用return。
java学习面向对象构造函数的更多相关文章
- java学习面向对象之父子构造函数初始化
在之前讲到java面向对象继承的时候,我们只讲到了两个比较重要的知识点,一个是父子类当中有同名的成员变量,这个时候,我们引入了super这个关键字来区分这两个同名成员变量,除此之外,我们还讲到了父子同 ...
- Java学习---面向对象的远程方法调用[RMI]
基础知识 分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果. 常见的分 ...
- java学习面向对象之异常之一
一.异常的概述: 什么是异常?在我们编写java程序的时候,会出现一些问题,比如内存溢出啊或者数组索引超出最大索引啊,这些编程当中出现的这些个问题就是异常.但是异常也分为可以处理的和不可以处理的.比如 ...
- java学习面向对象之接口
上一节当中我们说道抽象类,抽象类当中的方法可以是抽象的也可以是非抽象的,那么当抽象类中所有方法都是抽象的时候,我们就可以把它重新定义为接口.代码示例: abstract class Animal { ...
- java学习面向对象之匿名内部类
之前我们提到“匿名”这个字眼的时候,是在学习new对象的时候,创建匿名对象的时候用到的,之所以说是匿名,是因为直接创建对象,而没有把这个对象赋值给某个值,才称之为匿名. 匿名对象回顾: class N ...
- java学习面向对象之内部类
什么是面向对象内部类呢?所谓的内部类,即从字面意义上来理解的话,就是把类放到类当中. 那么内部类都有什么特点呢? 1.内部类可以访问包裹他的类的成员. 2.如果包裹他的类想访问被其包裹的类的话就得实例 ...
- java学习面向对象之多态
如何理解多态,让我们举个例子来描述一下,因为单纯的说多态大家可能不理解: abstract class Animal { ; abstract void eat(); public void run( ...
- java学习面向对象之抽象类
什么是抽象类,之所以说抽象就是具体的反义词喽~抽象离我们最近的距离也就是初中的时候学过的美术课,抽象画派.拿一桶画彩就这么往画布上一泼,那就是抽象.那么java世界当中什么是抽象呢?我们再拿动物还有狗 ...
- java学习面向对象之继承
在我们编写程序的过程当中,会遇到这种情况: 比如现在有一个狗,他的功能有跑,有跳,有吃,有叫,属性有雌雄,大小,颜色等等,同时现在我们也有一个猫,上述功能她也有.这个时候我们写代码的时候,就得分别把上 ...
随机推荐
- Qt的皮肤设计(Style Sheet)
Qt的皮肤设计,也可以说是对Qt应用程序的界面美化,Qt使用了一种类CSS的样式规则QSS. 一.Style Sheet的应用 1.直接在程序代码中设置样式,利用setStyleSheet()方法 ...
- 'Service' object has no attribute 'process'
在使用selenium+phantomjs时,运行总是出现错误信息: 'Service' object has no attribute 'process' 出现该错误的原因是未能找到可执行程序&qu ...
- (转)VS2012网站发布详细步骤
2.弹出网站发布设置面板,点击<新建..>,创建新的发布配置文件: 4. 在配置中,要选择“Release”——发布模式(Release 称为发布版本,它往往是进行了各种优化,使得程序 ...
- C#使用Process类调用外部程序(转)
在程序开发中,一个程序经常需要去调用其他的程序,C#中Process类正好提供了这样的功能.它提供对本地和远程进程的访问并使您能够启动和停止本地系统进程.一.启动进程实例 Process myProc ...
- 获取Android studio中的SHA1
因为想要弄一下百度地图. 然后要申请一个key. 需要SHA1. 按window键 +R 输入cmd 进入C:\Users\Administrator路径 输入cd .android,进行.andro ...
- mysql数据库优化日志(更)-howyue
1)记一次首页查询优化 优化前: 优化后: 主要优化: 1.select查询只查询需要字段: 2.where条件字段添加索引:
- retain two decimal digits.
package kju.o; import static kju.print.Printer.*; import java.text.*; class MathDemo { public static ...
- eclipse中更改默认编码格式
更改过程如下: (1)window->preferences->general->content Types, 选中java class file修改default encoding ...
- Java设计模式(学习整理)---工厂模式
1.工厂模式 1.1 为什么使用工厂模式? 因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时 ...
- Spring中的创建与销毁
在bean中添加属性init-method="方法名" destroy-method="方法名" init-method 该方法是由spring容 ...