JAVA面向对象2

在面向对象程序设计中,方法用于实现对象的行为、功能部分。在Java中有main方法、成员方法、静态方法、静态代码块、构造方法。在Java中成员方法的定义,类似于C语言的函数,但要注意以下几点。

1.main方法的格式为:

public static void main(Sting arge[]){

    方法体;

}

main方法的格式是固定的,其中public和static是修饰符 ,void是无属性类型,String arge[] 用于接受String类型的命令行参数。

2.构造方法必须与类名一致且不能有返回值类型,也就是构造方法和其他方法的主要区别

3.有类型的方法,除了类型void,在方法结束返回前,必须有一个return(表达式)或者return 表达式语句,其中的表达式计算结果的类型与所定义的方法类型一致,或者能够自动类型转换为方法类型,否则必须在表达式前进行强制类型转换

4.在方法体中,可以用各类语句,包含变量定义、流程控制语句等组成的代码块,实现所需要的算法

在Java中每一个类可以包括一个main方法和若干个构造方法以及若干个成员方法。其中main方法也叫主方法,作为执行的入口,一个类没有main方法也是可以的,但是类编译后无法独立执行

静态方法和静态代码块由于在main方法执行前已经被初始化,而成员变量必须等到对象实例化时才分配存储空间,对象实例化必须要执行main方法才能实现,所以在静态方法和静态代码块中不能访问成员变量,只能访问静态变量

public class Test {
    String name;
    int age;
    String ID;
    public Test() {
        System.out.println("执行第一个构造方法");
        name="张";
        //没有参数的构造方法
    }
    public Test(String name,int age,String ID){
        System.out.println("执行第二个构造方法");
        this.name=name;
        //重载构造方法,构造方法含有三个参数
    }
    public Test(int age,String name,String ID){
        System.out.println("执行第三个构造方法");
        this.name=name;
        //重载构造方法,在同一形参位置不同类型
    }
    public static void main(String[] args) {
        Test text1=new Test();
        Test text2=new Test("张山",18,"1000001");
        Test text3=new Test(18,"李四","1000002");
        System.out.println(text1.name);
        System.out.println(text2.name);
        System.out.println(text3.name);
    }
}

执行第一个构造方法
执行第二个构造方法
执行第三个构造方法

张山
李四

1.构造方法

构造方法的作用:构造方法是Java类中的一个特殊的方法,它用于对象实例化,一般用于给成员变量赋初值

构造方法要求:

1.构造方法的方法名必须和类名同名(注意Java大小写敏感)、且没有方法类型,包括不能是void型

2.构造方法只能是new或者this来调用另一个构造方法。但是需要注意的是,如果要用this调用另一个构造方法时,这个语句必须是当前构造方法中的第一个语句

3.构造方法重载有三个构造方法,这三个构造方法名字一样,其中第一个构造方法没有形参、第二个构造方法有三个形参,第三个构造方法的构造方法在同一位置的形参类型完全不同,这就是方法重载。在使用构造方法时,系统会根据不同的调用方式(形参个数、或者形参的类型等),会自动识别调用那一个方法

4.构造方法不是必须的,如果一个类中,没有定义构造方法,在编译时,系统会自动增加一个无参数、空的构造方法(用javap.exe反编译,可以看到有一个没有参数的空构造方法,这是javac.exe自动追加的)

2.方法重载

和构造方法重载类似,在一个类中,方法重载是很普遍的做法

注意;方法重载是方法类型和方法名完全一样,通过不同的形参个数或类型,实现同一个方法、完成不同的功能

不同的返回值类型无法实现方法重载

如第二个构造方法和第三个构造方法为例

在类的main方法中,通过不同的参数个数、参数类型,实现不同task方法的调用

方法签名。方法重载实质上是通过方法签名来实现,带有不同参数的方法拥有不同的方法签名。第一个task的方法签名为task_;第二个task带有String参数,其方法签名为task_String;第三个task方法带有int参数,其方法签名为task_int;第四个方法带有String和int两个参数,其方法签名为task_String_int。如此可见,方法签名就是以方法名、及其所有参数类型名、用“_”隔开形成的字符串。只要方法签名不同名,就可以实现方法重载

3.方法的参数传递

参数列表的格式:

类型 变量1,类型 变量2 ……,类型 变量n

这里的类型可以包括基本数据类型和复合(引用)数据类型

在这里要说明几个问题:

1.不一定与类同名的方法都是构造类型。比如:四个名字都是exchange重载的成员方法(命名不符合规范,为了说明而为之)。为什么不是构造方法呢?因为这个方法有void的返回值类型,而构造方法不能出现返回值类型

2.方法重载的方法名称均为相同,只要方法签名不同,就可以实现方法重载

3.在实际上,采用乘除法交换同样和引用临时变量一样可以达到交换的效果

4.无论参数采用的是简单数值类型、还是复合类型、或者是数组,在方法中都能完成两个数据交换。但如果参数采用数组形式,交换将直接影响到实参,否则不影响实参

5.每个线程会分配一个JVM栈,在Java中,入栈和出栈是以栈帧为单位的,有一个方法调用另一个方法时,需要压入一个栈帧。

4.方法中带可变长度形参

可变长度形参列表的形式:

类型 形参名,类型 形参名,……

要求如下:

1.需要用到可变长度参数时,采用类型后面加上“…”,然后再写上形参名

2.一个方法中,只能有一个可变长度形参,且可变长度形参必须放在形参列表的最后一个

3.可变长度形参可以在方法重载中使用,但在方法调用时,如果固定参数和可变参数都可以匹配时,优先调用固定参数方法

在这里,用到object类,它是所有类的基类,这样可以显示采用可变长度参数的优势

系统会根据命令行的参数个数,自动创建一个数组接受所有的命令行参数

5.类的继承

类继承的格式为:

修饰符 class 子类名 extends 父类名{

    类体

}

继承是面向对象程序设计的一个主要特征,是使用已经定义的类作为基础定义新的类的技术。广义的来讲,继承是指能够直接获得已有类的性质和特征,而不要重复定义它们,因此,继承是指类之间共享属性和操作的机制。被继承的类称之为父类,继承者被称为子类。在Java中,一个子类可以继承一个父类,直接获取父类的属性和方法,Java是单继承,多接口的语言,也就是说在Java中子类只能有一个父类。因此在extends后面只能有一个父类名。

Java继承的基本规则:

1.如果子类和父类保存在同一文件夹,Java子类可以继承父类的所有非私有的属性和方法

2.Java子类可以扩展父类的成员属性和成员方法。如果父类没有,而子类需要的,可以直接增加到子类中

3.Java子类可以重写父类的成员方法。重写后,系统会自动覆盖原先父类的方法。但是有一点要注意:如果父类对应方法的修饰符有final(最终的,final的用法在本文章后面会讲到),则子类不能重写该方法。如果子类需要访问父类被重写过的方法,可以用super关键字进行访问

4.访问子类继承父类的成员属性和方法,与访问子类自身定义的属性和方法一样

5.实例化子类对象时,要先实例化父类对象。在实例化过程中,Java会调用子类的构造方法,此时会先调用父类的构造方法创建父类对象,接着创建子类对象。每个对象会自动增加两个属性this和super,其中this属性指向自身首地址、super指向父类对象的首地址(其中方法指向方法区对应方法的首地址)。在调用父类构造方法时,会自动调用参数类型、个数一样的父类的构造方法,如没有带参数自动调用没有带参数的父类的构造方法,等等;如果需要明确指定调用父类某个构造方法,或者子类需要调用父类的构造方法时,用关键字super进行访问,但要求必须是子类构造方法中的第一语句(和this一样)

6.类的向下向上转型。子类对象可以赋值给父类类型,反之不行。例如:

final的用法:

1.final类。如果一个类被声明为final,则该类为最终类,不能用于父类声明子类,也就是不能被继承

2.final方法。如果一个成员变量被声明为final,表示这个方法在子类中不能被重写,但是可以被子类继承;只有需要明确禁止该方法在子类中被重写的情况下才将方法设置为final的;且如果方法定义为private权限,隐含包括final

3.final成员变量。如果一个成员变量被声明为final,表示它只能被赋值一次;final变量可以在定义时直接赋值、或者在构造函数赋值、或者在静态代码块中赋值,但只能赋值一次,以后不能被修改;如果final变量是一个复合型变量,则其指向地址内容可以被修改

  • 19
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值