构造器
学习java必须了解构造器这一概念,构造器是一种方法,不过它与普通方法是有区别的,他以所处类名作为该方法名,构造器是为了创建一个类的实例,同样也可已在创建对象中用到。如下小例:
class person{
String[] skin ;
int age ;
String name ;
public person() {//一般此构造方法不写的话是默认存在的
}
}
public class java {
public static void main(String[] args) {
//创建对象时调用构造方法,per具有person类属性
person per = new person();
}
}
构造器和方法有三个重要区别:命名,修饰,返回值,命名规定构造器名必须与所处类名一致;和普通方法一样,构造器可以有任何访问的的修饰,public protected private或者没有修饰,不同于方法的是,构造器不能以非访问性质的修饰:abstract,final ,native ,static , synchronized;普通方法有返回值或者是void型返回值,而构造器是没有返回值的,也不能加void 。
深入理解构造器
说过构造器是创建对象的重要途径,通过new关键字来调用构造器,构造器也确实返回了该类的对象,但这个对象并不完全是由构造器创建的。实际上,当调用构造器时,系统会为该对象分配内存空间,并为这个对象执行默认初始化,如果这个对象已经产生,那么这些操作在执行操作之前就已经完成,所以说当系统开始构造器的执行体之前,系统已经创建一个对象,只是这个对象还不能够被外界程序所访问,只能在该构造器中通过this来引用,当构造器的执行体执行结束后,这个构造器作为构造器的返回值被返回。通过赋值给另一个引用类型的变量,从而让外部程序访问。
this方法的用法
this代表他所在函数所属对象的引用。那个对象调用this所在的函数,this就代表那个对象。
this可用于构造方法之间的互相调用,调用时要放在构造方法的首行。
this引用成员变量:
class person{
String name ;
int age ;
public person(String name ,int age) {
//不能写成name = name,age= age,必须调用this关键字加以区分
this.name = name ;
this.age = age ;
}
}
public class java {
public static void main(String[] args) {
person per = new person("zhangsan",12);
}
}
如上代码所示,当调用构造方法时,如果没有this关键字来引用成员变量的话,两个name和age是无法实现互相赋值的。this关键字代表的时对象的成员变量或方法,而不是成员方法的形参或局部变量。
this调用构造方法
class person{
private String name ;
private int age ;
public person(String name ,int age) {
this.person();
this.name = name ;
this.age = age ;
System.out.println("姓名:"+name);
System.out.println("年龄:"+age);
}
public person() {
this.name = "zhangsan ";
this.age = 20 ;
this(name,age);//表示调用上述有参构造方法
Systeem.out.println("我是一个人!")
}
}
public class java {
public static void main(String[] args) {
person per = new person();
}
}
在用this来调用构造方法时,只能在没参数的构造方法中调用有参数的构造方法,且this必须放在构造方法首行。
this返回对象的值,this除了引用变量或成员方法之外,还可以返回类的引用。作为返回值返回给调用方法。
重载
class animal{
public void eat(){
System.out.println("Animal eat different food!\n");
}
}
class dog extends animal{
public void eat() {
// 当需要在子类中调用父类的被重写方法时,要使用super关键字
super.eat();
System.out.println("Dog eat bones!");
}
public void eat(String name) {
System.out.println("dog is eatting"+name);
}
public void eat(int num) {
System.out.println("dog has eaten "+num)
System.out.printf("fishes");
}
}
public class test{
public static void main(Strinf[] args) {
dog dg = new dog();
dog dg1 = new dog("cat");
dog dg2 = new dog(10);
}
}
重载(overloading) 是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不同。
每个重载的方法(或者构造函数)都必须有一个独一无二的参数类型列表。
最常用的地方就是构造器的重载。
重载规则:
- 被重载的方法必须改变参数列表(参数个数或类型不一样);
- 被重载的方法可以改变返回类型;
- 被重载的方法可以改变访问修饰符;
- 被重载的方法可以声明新的或更广的检查异常;
- 方法能够在同一个类中或者在一个子类中被重载。
- 无法以返回值类型作为重载函数的区分标准。
继承(extends)
没错你想的继承和java中的继承没什么两样,小王继承他爹老王的家产才可以那么嚣张跋扈。在java中采用继承使得类之间具有一定的层次感,如果多个类在属性和方法上具有比较多的相关点,可以将这些共同点集合起来定义为一个父类,再定义其他子类采用继承的方式来利用父类的属性及方法,这样子类就不用再在其自己内部定义相应的方法了。要是想改变所继承的父类的方法,那就改为接下来要说的重写。
重写
重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变。即外壳不变,核心重写!
重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。
class animal{
public void eat(){
System.out.println("Animal eat different food!\n");
}
}
class cat extends animal{
public void eat() {
super.eat();//可以调用super关键子来调用父类构造器,否则eat方法将被重写
System.out.println("Cat eat fish!");
}
}
class dog extends animal{
public void eat() {
super.eat();
System.out.println("Dog eat bones!");
}
}
由于在编译阶段,只是检查参数的引用类型。
在运行时,Java虚拟机(JVM)指定对象的类型并且运行该对象的方法。
因此在上面的例子中,之所以能编译成功,是因为animal类中存在eat方法,然而运行时,运行的是特定对象的方法。
重写规则:
- 参数列表必须与被重写方法相同
- 返回类型必须与被重写方法
- 访问权限不能比被重写方法的访问权限低,例如:父类的访问权限是public子类不能是protected。
- 父类的成员方法只能被他的子类重写。
- 声明为final的方法不能被重写。
- 声明为static的方法不能被重写,但能被重新声明。
- 子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
- 子类和父类不在同一个包中,那么子类只能够重写父类的声明为public和protected的非final方法
- 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
- 构造方法不能被重写。
- 如果不能继承一个方法,则不能重写这个方法。