
看来你还不了解实例化的过程?
实例化 就是调用类中的构造器用来初始化类中成员变量,通过“参数列表”来选择具体的构造器
A a=new A(9);//传递了参数9,表示调用的是“含参构造器”,在含参构造器中存在访问本类中的无参构造器这么一个方法,这个过程很简单。。。。
你只创建了一个实例,分配了一块内存
关于Java中的构造函数Constructor的内容,以下就是该内容的详细介绍。
每创建一个类的实例都去初始化它的所有变量是乏味的。如果一个对象在被创建时就完成了所有的初始工作,将是简单的和简洁的。因此,Java在类里提copy;了一个特殊的成员函数,叫做构造函数(Constructorcopy;。一个构造函数是对象被创建时初始对象的成员函数。它具有和它所在的类完全一样的名字。一copy;定义好一个构造函数,创建对象时就会自动调用它。构造函数没有返回类型,即使是void类型也没有。这是因为一个类的构造函数的返回值的类型就是这个类本身。构造函数的任务是初始一个对象的内部状态,所以用new *** 作符创建一个实例后,立刻就会得到一个清楚、可用的对象。下面这个例子里,用构造函数取代了成员函数init。
classUniversity{Stringname,city;University(Stringname,Stringcity){thisname=name;thiscity=city;}}
classUniversityCreate{publicstaticvoidmain(Stringargs[]){Universityu=newUniversity("北copy;大学","北copy;");Systemoutprintln("大学:"+uname+"城市:"+ucity);}}
new语句中类名后的参数是传给构造函数的。
使用方法:
JavaScript Booleanconstructor()方法返回一个引用到创建实例的原型布尔函数。
语法
booleanconstructor()
返回值:
NA
下面是参数的详细信息:
返回创建此对象的实例。
例子:
<html>
<head>
<title>JavaScript constructor() Method</title>
</head>
<body>
<script type="text/javascript">
var bool = new Boolean( );
documentwrite("boolconstructor() is:"+boolconstructor);
</script>
</body>
</html>
这将产生以下结果:
1
boolconstructor() is : function Boolean() { [native code] }
您好,
一、成员变量(类或对象的状态)
1、认识成员变量(类或对象的状态)、类变量、实例变量、局部变量、方法参数之间的区别
成员变量(field)是没有定义在代码块(包括初始化块、成员方法)中的变量。成员变量是类变量还是实例变量取决于在其声明中是否使用了static关键字。
类变量在声明是用了static关键字,它的另一个名字叫静态变量、静态成员变量(static field) 。
实例变量是在声明时没有使用static关键字的成员变量,它的另一个名字叫非静态成员变量(non-static field)。
定义在代码块里的变量被称为局部变量(local variable)。
定义在方法声明中的变量叫方法参数。
[java] view plaincopyprintpublic class Lesson08 { // 类变量 static String s1 = "类变量"; // 实例变量 String s2 = "实例变量"; // 初始化代码块里的局部变量 { String s3 = "初始化代码块里的局部变量"; Systemoutprintln(s3); } // 静态初始化代码块里的局部变量 static { String s4 = "静态初始化代码块里的局部变量"; Systemoutprintln(s4); } // 方法的参数和方法里的局部变量 public void printString(String s5) { String s6 = "方法里的局部变量"; Systemoutprintln("方法的参数:"+s5); Systemoutprintln(s6); } // 类方法 public static void printString() { String s7="类方法里的局部变量"; Systemoutprintln(s7); } // main方法 public static void main(String[] args) { //调用类方法 Lesson08printString(); //打印类变量 Systemoutprintln(s1); //创建对象 Lesson08 lesson = new Lesson08(); //打印实例变量 Systemoutprintln(lessons2); //调用实例方法 lessonprintString("参数的值"); } }
对于他们之间的区别,我们在以后的学习中你会越来越清晰的。
2、变量的初始化
实例变量一经定义就会有初始值,局部变量定义时不赋初值而直接使用,编译器会报错
[java] view plaincopyprintpublic class Lesson08_1 { int i; static int j; { int k; Systemoutprintln(k); } static { int l; Systemoutprintln(l); } public void print(String m){ Systemoutprintln(m); } // main方法 public static void main(String[] args) { int n; Systemoutprintln(n); Lesson08_1 lesson =new Lesson08_1(); lessonprint("m"); } }
运行程序,查看结果:
然后我们再给局部变量都附上初值,再把实例变量和类变量都打印出来看看,代码如下:
[java] view plaincopyprintpublic class Lesson08_1 { int i; static int j; { int k=2; Systemoutprintln(k); } static { int l=2; Systemoutprintln(l); } public void print(String m){ Systemoutprintln(m); } // main方法 public static void main(String[] args) { Systemoutprintln(j); int n=2; Systemoutprintln(n); Lesson08_1 lesson =new Lesson08_1(); lessonprint("m"); Systemoutprintln(lessoni); } }
运行程序,查看结果:
我们看到类变量和实例变量没赋值照样有值打印出来,我们也看到int的初始值是0 。
实例变量和类变量的类型 初始值
整数 0
浮点类型 00
字符类型 ‘/u0000′
布尔类型 boolean false
引用数据类型(譬如数组、接口、类) null
二、方法(类或对象的行为)
1、方法
Java中类的行为由类的成员方法来实现。类的成员方法由方法的声明和方法体两部分组成。
修饰符,可选,用于指定谁有权限访问此方法。
返回值类型,必选,用于指定该方法的返回值数据类型;如果该方法没有返回值,则要用关键字 void 进行标示。方法的返回值只能有一个。
参数列表,可以有0到多个,多个参数之间要用逗号隔开,参数的写法形如:String[] args, int age 这样。
方法名,必选,这个……,好吧命名规则是方法名和变量名的首字母要小写,别丢我人,弄个大写方法名出来。
方法体,可选,这个……,
大括号,大括号不写的方法叫抽象方法。
2、属性和方法之间的关系
有句绕口令是这么说的:“状态影响行为,行为影响状态”。你有没有想过这问题,如果每个对象都是从同一个类中生成出来,每个对象如果都一摸一样,那么这个世界是不是太无趣了。好在,我们看到前面的例子中,小狗的大小属性影响了他叫的方式。通过设置狗大小的方法又改变了它的状态。这些属性和方法的细节上的不同导致了,多姿多彩的对象,我们后面还会讲到更多的技术,也会导致更多的多样性。
三、方法重载 overload
Java里可以提供同一个方法的多个不同参数的版本供我们调用,譬如上面的小白,它叫 bark() 的方法有两种,一种是很随意的叫,无拘无束的叫,还有一种是根据它心情的不同来叫,当然我还可以再定义一个方法可以让他根据主人的脸色来叫,我们也可以再定义一个方法,穿的参数是食物,那么它的叫声可能就是边吃边幸福的吼叫了…… 这样一个bark方法就带来了丰富多彩的变化。
在Java 中允许类定义中多个方法的方法名相同,只要它们的参数声明不同即可。这种情况下,该方法就被称为重载(overloaded ),这种方式就叫做方法重载(method overloading )。方法重载是实现程序多样性的一个重要手段。也可以称作多态的一种表现方式。
SubClass(int n) {
//super();
Systemoutprintln("SubClass(" + n + ")");
thisn = n;
}
你在SubClass类里这样写的 super(); 这个意义是调用父类无参数的构造器,其实这一句你可以不用写。一般子类都会默认调用父类无参数的构造器,但是如果没给父类写一个对子类可见的默认无参数构造器的话,就必须在子类的构造器里显式调用父类的 含参数的构造器
因为java创建对象,总是要先要从父类开始创建,因为只有父才有子嘛对不对?
你在代码里是没有创建它不错,但是JAVA的机制就是从父类创建开始,而且JAVA里任何一个父类都是继承自javalangObject的,它是所有类的基类,JAVA总是从创建这个类开始,然后再一个个向下建立子类
三、
java中的重载(overload)
1、相同方法名,不同参数表。
2、方法重载时,对于参数的匹配有个向上就近原则。(这样可以节省栈空间资源);
3、为什么面向对象中要有方法重载?
方法的重载使同一类方法由于参数造成的差异对于对象的使用者是透明的。对象的使用者只负责把参数交给对象,而具体怎么实现由对象内部决定。
4、java中的运算符重载
java中唯一重载的运算符是string类型的“+”号,任何类型+string类型结果都为stirng类型。
5、注意点:重载不仅出现在同一个类中,也可以出现在父子类中。
java中的重写(override)
1、
参数表、方法名必须完全相同,访问修饰符要求子类宽于父类。返回值类型在jdk50以前要求完全相同,
50以后可以父类返回一个对象a,子类返回一个该对象a的子类也是覆盖。子类方法覆盖父类方法时要求子类方法的访问修饰符宽于或等于父类的访问修饰符。
2、
为什么面向对象中要有方法覆盖?
覆盖允许子类用自己特色的方法去替换调父类已有的方法。
3、
父类中的私有方法与子类中任何方法不够成覆盖关系,
也就是说只有父类被子类继承过来的方法,才有可能与子类自己的方法构成覆盖关系。
4、少覆盖原则:如果子类覆盖了父类过多的方法,那么我们要重
新思考一下这两个类之间到底是不是继承关系。
注:子类的属性和父类的属性同名时叫遮盖(区覆盖)
属性的遮盖是没有多态的。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)