构造器
用于创建³³对象并初始化对象属性的方法,叫“构造方法”,也叫“构造器”;构造器在类中定义。
1.构造器的名称必须与类名同名,包括大小写.2。
构造器的无能写空,也不能写返回
.3。构造器的参数:一般是初始化对象的前提条件。
4.用一种方法可以调用多次。一
类方法可被调用多次。5. 类一定有构造器!这是真的,不需要质疑!
6.如果类没有声明(定义)任何的构造器,Java编译器会自动插入默认构造器!
7.默认构造是无参数,方法体是空的构造器,且默认构造器的访问权限随着所属类的访问权限变化而变化。如,若类被公修修,则默认构造器也带公修真符.8。
默认构造器是看不到的,一旦自己写上构造器则默认构造器就没有了,自己写的叫自定义构造器,即便自己写的是空参数的构造器,也是自定义构造器,而不是默认构造器。
9.如果类声明了构造器,爪哇编译器将不再提供默认构造器。没手动写出无参构造器,但却调用了无参构造器,将会报错!
10.构造器是可以重载的,重载的目的是为了使用方便,重载规则与方法重载规则相同。
11.构造器是不能继承的!虽说是叫构造方法,但实际上它不是常说的一般方法。
12.子类继承父类,那么子类型构造器默认调用父类型的无参数构造器。
13.子类构造器一定要调用父类构造器,如果父类没有无参数构造器,则必须使用super(有参数的),来调用父类有参的构造器。那么,为什么子类一定要访问父类的构造器?因为父类中的数据子类可以直接获取。所以子类对象在建立时,需要先查看父类是如何对这些数据进行初始化的,所以子类在对象初始化时,要先访问一下父类中的构造器。总之,子类中至少会有一个构造器会访问父类中的构造器,且子类中每一个构造函数内的第一行都有一句隐式超( 。)
注意事项:SPER(),SPER和这个(),这一点。
这个:在运行期间,哪个对象在调用这所在的方法,这就是代表哪个对象,隐含绑定到当前“这个对象”
.super():调用父类无参构造器,一定在子类构造器第一行使用!如果没有则是默认存在super()的!这是Java默认添加的super()。
super。是访问父类对象,父类对象的引用,与此。用法一致
this():调用本类的其他构造器,按照参数调用构造器,必须在构造器中使用,必须在第一行使用,this()与super()互斥,不能同时存在
此。是访问当前对象,本类对象的引用,在能区别实例变量和局部变量时,这个可省略,否则一定不能省!
如果子父类中出现非私有的同名成员变量时,子类要访问本类中的变量用这个。;子类要访问父类中的同名变量用超。
public class Demo {
public static void main(String[] args) {
Foo foo = new Foo();//调用了javac自动添加的默认构造器!
//Koo koo = new Koo();//编译错误,没有Koo()构造器
Koo koo = new Koo(8);
}
}
class Foo { } //Foo有构造器,有无参数的默认构造器!
class Koo {
public Koo(int a) { //声明了有参数构造器
System.out.println("Call Koo(int)");
}
}
我们说构造器是一种方法,就象讲澳大利亚的鸭嘴兽是一种哺育动物(按:老外喜欢打比喻,我也就照着翻译)。要理解鸭嘴兽,那么先必须理解它和其他哺育动物的区别。同样地,要理解构造器,那么就要了解构造器和方法的区别。所有学习的java的人,尤其是对那些要认证考试的,理解构造器是非常重要的。下面将简单介绍一下,最后用一个表作了些简单的总结。
1,功能和作用的不同
构造器是为了创建一个类的实例。用来创建一个对象,同时可以给属性做初始化。这个过程也可以在创建一个对象的时候用到:Platypus p1 = new Platypus() ;
相反,方法的作用是仅仅是功能函数,为了执行的Java代码。
2,修饰符,返回值和命名的不同
构造器和方法在下面三个方便的区别:修饰符,返回值,命名。
和方法一样,构造器可以有任何访问的修饰:public,protected,private或者没有修饰(通常被包和友好调用)。不同于方法的是,构造器不能有以下非访问性质的修饰:abstract,final,native,static,或者synchronized。
3,返回类型
方法必须要有返回值,能返回任何类型的值或者无返回值(无效),构造器没有返回值,也不需要无效。
4,命名
构造器使用和类相同的名字,而方法则不同。按照习惯,方法通常用小写字母开始,而构造器通常用大写字母开始。
构造器通常是一个名词,因为它和类名相同;而方法通常更接近动词,因为它说明一个操作。
5,调用:
构造方法:只有在对象创建的时候才会去调用,而且只会调用一次。
一般方法:在对象创建之后才可以调用,并且可以调用多次。
如图6所示, “这个” 的用法
构造器和方法使用关键字这有很大的区别。方法引用该指向正在执行方法的类的实例。静态方法不能使用此关键字,因为静态方法不属于类的实例,所以这个也就没有什么东西去指向构造器的这个指向同一个类中,不同参数列表的另外一个构造器,我们看看下面的代码:
public class Platypus{
String name;
Platypus(String input){
name = input;
}
Platypus(){
this("John/Mary Doe");
}
Public static void main(String args[]){
Platypus p1 =new Platypus("digger");
Platypus p2 =new Platyps();
}
}
在上面的代码中,有2个不同参数列表的构造器。第一个构造器,给类的成员名赋值,第二个构造器,调用第一个构造器,给成员变量名一个初始值John / Mary Doe“。
在构造器中,如果要使用关键字这一点,那么,必须放在第一行,如果不这样,将导致一个编译错误。
7, “超级” 的用法
构造器和方法,都用关键字超指向超类,但是用的方法不一样方法用这个关键字去执行被重载的超类中的方法看下面的例子。:
class Mammal {
void getBirthInfo() {
System.out.println("born alive.");
}
}
class Platypus extends Mammal {
void getBirthInfo() {
System.out.println("hatch from eggs");
System.out.print("a mammal normally is ");
super.getBirthInfo();
}
}
在上面的例子中,使用super.getBirthInfo()去调用超类哺乳动物中被重载的方法。
构造器使用超去调用超类中的构造器而且这行代码必须放在第一行,否则编译将出错看下面的例子。:
public class SuperClassDemo {
SuperClassDemo() {}
}
class Child extends SuperClassDemo {
Child() {
super();
}
}
在上面这个没有什么实际意义的例子中,构造器Child()包含了super,它的作用就是将超类中的构造器SuperClassDemo实例化,并加到Child类中。
垃圾回收:
1. 对象可能不被垃圾回收
2.垃圾回收并不等于“析构”(c++中摧毁对象必须用到这个函数)
3.垃圾回收至于内存有关
java垃圾回收技术:
1.引用计数(简单但是速度很慢):
每个对象都含有一个引用计数器,当有引用连接至对象时,引用计数加1.当 引用离开作用域或被重置为null时,引用计数键1.
2.自适应(停止-复制,标记-清扫):
(停止—复制)先暂停程序的运行(所以它不属于后台回收模式),然后将所有存活的对象从当前zui复制到另一个zui,没有被复制的全部都是垃圾。
(标记—清扫)所依据的思路同样是从zui栈和静态存储区出发,遍历所有的引用,进而找出所有存活的对象。每当它找到一个存活对象,就会给对象设一个标记,这个过程中不会回收任何对象。只有全部标记工作完成的时候,清理动作才会开始。
数组:
int [ ] a1;
int a1[ ];
int [ ] a1={1,2,3,4,5,6};