zoukankan      html  css  js  c++  java
  • Java面向对象--属性和方法

    面向对象是相对于面向过程而言的,是软件开发方法。面向对象把相关的数据和方法组织为一个整体来看待,从更高的层次来进行系统设计,更贴近事物的自然运行模式。本篇博客介绍Java面向对象的属性(field)和方法(Method)。


    目录:

    ✎ 属性(field)/变量概述

    ✎ 成员变量与局部变量

    ✎ 方法(method)

    ✎ 方法的详细使用

        ☍ 方法的重载(overload)

        ☍ 可变个数的形参

        ☍ 方法参数的值传递机制

        ☍ 递归(recursion)


    属性(field)/变量

    语法格式

    ☃ 修饰符 数据型 类型 属性名 = 初始化值;

       ☄ 修饰符

    常用的权限修饰符有:private、缺省(default)、protected、public

    其他修饰符:static(类变量/静态变量)、final (使用final关键字后变量不允许修改)

    ☄ 数据类型

    基本数据类型(如int、Boolean)和引用数据类型

    ☄ 属性名

    属于标识符,符合命名规则和规范即可

    ✔ 修饰符只能在成员变量中使用,局部变量使用修饰符编译不通过

    例子:

    class Person{
        public int age = 10;
        private String name = "张三";
    }
    

    访问权限说明

    访问修饰符 同一个类 同包 不同包,子类 不同包,非子类
    private
    缺省(default)
    protected
    public

    成员变量与局部变量

    ☃ 在方法体外,类体内声明的变量称为成员变量

    ☃ 在方法体内部声明的变量称为局部变量

    ☀ 注意:二者在初始化值方面的异同

    ◐ 同:都有生命周期

    ◑ 异:局部变量除形参外,均需显式初始化

    class Person{
    	int age;
    	public static void main(String args[]){
            double weight;
            System.out.println(age);    //输出0
            //System.out.pritnln(weight);  编译不通过,必须赋初始值
        }
    }
    

    成员变量(属性)和局部变量的区别

    成员变量 局部变量
    声明的位置 直接声明在类中(方法体外) 方法形参或内部、代码块内、构造器内等
    修饰符 private、public、protected、static、final等 不能用权限修饰符修饰,可以用final修饰,其权限与声明它的方法对应
    初始化值 有默认初始化值 没有默认初始化值,必须显式赋值,方可使用
    内存加载位置 堆空间 或 静态域内 栈空间

    对象属性的默认初始化赋值

    当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。除了 基本数据类型之外的变量类型都是引用类型,包括数组。
    成员变量类型 初始值
    byte 0
    short 0
    int 0
    long 0L
    float 0.0F
    double 0.0
    char '0'或写为'u0000'(表现为空)
    boolean false
    引用类型 null

    方法(method)

    ☃ 方法是类或对象行为特征的抽象,用来完成某个功能操作。在某些语言中也称为函数或过程。

    ☃ 将功能封装为方法的目的是,可以实现代码重用,简化代码

    ☃ Java里的方法不能独立存在,所有的方法必须定义在类里

    方法的声明格式

    ```java 修饰符 返回值类型 方法名 ( 参数类型 参 形参1, 参数 类型 参 形参2, …. ){ 方法体程序代码 return 返回值; } ```

    ☄ 修饰符

        常用的权限修饰符有:private、缺省(default)、protected、public

    ☄ 返回值类型

        没有返回值:void

        有返回值,声明出返回值的类型。与方法体中<return  返回值>搭配使用

    ☄ 方法名

        属于标识符,命名时遵循标识符命名规则和规范,“见名知意”

    ☄ 形参列表

        可以包含零个,一个或多个参数。多个参数时,中间用“, ”隔开

    ☄ 返回值

         方法在执行完毕后返还给调用它的程序的数据,与返回值类型对应

    例子:

    class Student{
        String name;
        int age;
        char sex;
        //getMessage()方法
        public String getMessage(String name,int age,char sex){
       		name = name;
            age = age;
            sex = sex;
            String message = "姓名:" + name + "	年龄:" + age + "	性别:" + sex;
            return message;
    	}
    }
    

    方法的分类

    有无形参 无返回值 有返回值
    无形参 void 方法名 ( ) 返回值的类型 方法名 ( )
    有形参 void 方法名 (形参列表) 返回值的类型 方法名(形参列表)

    方法的调用

    ☃ 方法通过方法名被调用,且只有被调用才会执行

    ☀ 注意:

    ➣ 方法被调用一次,就会执行一次

    ➣ 没有具体返回值的情况,返回值类型用关键字void表示,那么方法体中可 以不必使用return语句。如果使用,仅用来结束方法,return后面不能再写其他代码

    ➣ 定义方法时,方法的结果应该返回给调用者,交由调用者处理

    ➣ 方法中只能调用方法或属性,不可以在方法内部定义方法


    方法的详细使用

    方法的重载(overload)

    重载的概念

    ☃ 在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数 类型不同即可

    重载的特点

    ☃ 与返回值类型、形参变量名、方法体都无关,只看参数列表,且参数列表必须不同。(参数个数或参数类型不同)。调用时,根据方法参数列表的不同来区别调用哪个

    例子:

    数字求和

    //两个整数求和
    int add(int a,int b){
    	int result = a +b;
    	return result;
    }
    //三个整数求和
    int add(int a, int b, int c){
        int result = a + b + c;
        return result;
    }
    //两个小数求和
    double add(double a, double b){
        double result = a + b;
        return result;
    }
    

    ☀ 使用重载方法,可以为编程带来方便

    可变个数的形参

    JavaSE 5.0中提供了Varargs(variable number of arguments)机制,允许直接定义能和多个实参相匹配的形参。从而,可以用一种更简单的方式,来传递个数可变的实参

    //JDK 5.0以前:采用数组形参来定义方法,传入多个同一类型变量
    public static void test(int a ,String[] array);
    //调用时,传入的参数也要是数组如  t.test(1,new String[]{"Hello" ,"world"})
    //JDK5.0:采用可变个数形参来定义方法,传入多个同一类型变量
    public static void test(int a ,String…array);
    //调用时直接传入同类型的参数即可,如  t.test(1,"hello", "world");
    //两种定义方式原则上是一样的,不能同时出现,但两种方式的调用有区别
    

    ☀ 注意:

    声明格式:方法名(参数的类型名 ...参数名)

    可变参数:方法参数部分指定类型的参数个数是可变多个:0个,1个或多个

    可变个数形参的方法与同名的方法之间,彼此构成重载

    可变参数方法的使用与方法参数部分使用数组是一致的

    方法的参数部分有可变形参,需要放在形参声明的最后

    在一个方法的形参位置,最多只能声明一个可变个数形参

    方法参数的值传递机制

    ☃ 方法,必须由其所在类或对象调用才有意义。若方法含有参数:

       ☄形参:方法声明时的参数

       ☄方法调用时实际传给形参的参数值

    参数传递方式

    Java里方法的参数传递方式只有一种:值传递。 即将实际参数值传入方法内,而参数本身不受影响

    ☃ 形参是基本数据类型:将实参基本数据类型变量的“数据值”传递给形参

    public class ValueTransferTest {
    	public static void main(String[] args) {
    		int m = 10;
    		int n = 20;
    //		int temp = m;
    //		m = n;
    //		n = temp;
    //		System.out.println("m:" + m + "  n:" + n);
    //		输出   m:20  n:10
    		
    		ValueTransferTest test = new ValueTransferTest();
    		test.swap(m, n);
    		System.out.println("m:" + m + "  n:" + n);
    		//输出m:10   n:20
    		
    		/*
    		 * 原因是前一种方式是直接对 实参的操作,赋值操作后改变了实参的值
    		 * 后一种方式是对形参的操作,不会影响到实参的值
    		 */
    	}
    	
    	/*
    	 * 
    	 * @method:swap
    	 * @param a
    	 * @param b
    	 * @return:void
    	 * @Description: 交换两数的值
    	 */
    	public void swap(int a, int b) {
    		int temp = a;
    		a = b;
    		b = temp;
    	}
    }
    

    ☃ 形参是引用数据类型:将实参引用数据类型变量的“地址值”传递给形参

    public class ValueTransferTest {
    	public static void main(String[] args) {
    		/*
    		 * 引用数据类型传值
    		 */
    		Data data = new Data();
    		data.m = 10;
    		data.n = 20;
    		System.out.println("交换前:data.m:" + data.m + "  data.n:" + data.n);
    //		int temp = data.m;
    //		data.m = data.n;
    //		data.n = temp;
    //		System.out.println("交换后:data.m:" + data.m + "  data.n:" + data.n);
    		//输出       交换后:data.m:20  data.n:10
    		test.swap(data.m, data.n);
    		System.out.println("交换后:data.m:" + data.m + "  data.n:" + data.n);
    		//输出       交换后:data.m:10  data.n:20
    		data.swap(data.m, data.n);
    		System.out.println("交换后:data.m:" + data.m + "  data.n:" + data.n);
    		//输出       交换后:data.m:10  data.n:20
    		test.swap(data);
    		System.out.println("交换后:data.m:" + data.m + "  data.n:" + data.n);
    		//输出       交换后:data.m:20  data.n:10
    	}
    	
    	/*
    	 * @method:swap
    	 * @param a
    	 * @param b
    	 * @return:void
    	 * @Description: 交换两数的值
    	 */
    	public void swap(int a, int b) {
    		int temp = a;
    		a = b;
    		b = temp;
    	}
    	//重载swap方法
    	public void swap(Data data) {
    		int temp = data.m;
    		data.m = data.n;
    		data.n = temp;
    	}
    }
    class Data{
    	int m;
    	int n;
    	public void swap(int a, int b) {
    		int temp = a;
    		a = b;
    		b = temp;
    	}
    }
    

    ☀ 由于引用类型传递的是“地址值”,所以实参赋值或传递引用类型变量时,两个变量(包括形参变量)实际上指向的是同一块堆空间实体对象,一方对该对象进行了操作,另一方调用的就是操作后的对象

    递归(recursion)

    ☃ 递归方法:一个方法体内调用它自身

    ☃ 方法递归包含了一种隐式的循环,它会重复执行某段代码,但这种重复执 行无须循环控制

    ☃ 递归一定要向已知方向递归(递归有限次结束),否则这种递归就变成了无穷递归,类似于死循环,会报堆溢出错误

    例子:

    1-100累加的和

    public int sum(int num){
        if(num == 1){
            return 1;
        }else{
            return num + sum(num -1);
        }  
    }
    

    本博客与CSDN博客༺ཌ༈君☠纤༈ད༻同步发布

  • 相关阅读:
    为经典版eclipse增加web and JavaEE插件
    类型之间进行隐式和显示转换&创建使用枚举&创建使用结构类型&创建使用数组&;如何处理字符串值
    VS2013秘钥
    VS2013快捷键大全
    2016年4月20日开会学习
    随机验证码.ashx
    关于代码开发的一些心得
    C#list泛型的定义,作用,用法
    String,StringBuffer与StringBuilder的区别??
    C# DataTable的详细用法
  • 原文地址:https://www.cnblogs.com/asio/p/12375423.html
Copyright © 2011-2022 走看看