zoukankan      html  css  js  c++  java
  • 廖雪峰Java2面向对象编程-2数据封装-1方法

    1.数据封装

    一个class可以包含多个field。直接把field用public暴露给外部可能破坏了封装,例如传入不合理的数值(年龄填入1000)。如下

    public class Person {
    	public String name;
    	public int age;
    }
    

    2.class模版

    用private修饰field可以拒绝外部访问
    定义public方法可以间接修改field
    使用封装可以在方法中对参数进行处理。如对name去除首尾的空格。

    方法定义:

    • 修饰符 public private
    • 方法返回值:没有返回值用void
    • 方法名称:首字母小写,后面的每个单词大写
    • 方法参数列表:多个参数用逗号隔开
    • 方法体:
      * 方法返回值通过入return语句实现,没有返回值(void)可以省略return
      * 方法内部可以使用隐式变量this:this指向当前实例,this.field可以访问当前实例的字段。
      * 不引起歧义的情况下,可省略this。局部变量名优先原则
    public class Person {
    	private String name;
    	private int age;
    	
    	public void setName(String name) {
    		this.name = name.trim();    //局部变量名优先,如果存在同名,不能省略
    	}
    	public String getName() {
    		return name;    //return this.name;
    	}
    	public void setAge(int age) {
    		this.age = age;    
    	}
    	public int getAge() {
    		return this.age;
    	}
    }
    

    3.外部代码访问class

    * 外部代码不可访问private字段 * 外部代码通过调用public方法间接设置和获取private字段 * public方法封装了数据访问 * 通过方法访问实例字段更安全 * 通过变量.方法名()来调用实例方法
    public class Hello {
    	public static void main(String[] args) {
    		Person ming = new Person();
    		ming.setName("小明");
    		ming.setAge(12);
    		System.out.println(ming.getName());
    		System.out.println(ming.getAge());
    	}
    }
    

    4.参数绑定

    更改模版类中方法的参数,实例传参无效,但也不会影响外部的变量值。没啥卵用,可忽略
    Person.java

    public class Person {
    	private String name;
    	private int age;	
    	public void setName(String name) {
    		name =" 张三 ";
    		this.name = name.trim();
    	}
    	public String getName() {
    		return this.name;
    	}
    	public void setAge(int age) {
    		age = 60;
    		this.age = age;
    	}
    	public int getAge() {
    		return this.age;
    	}
    }
    

    Hello.java

    public class Hello {
    	public static void main(String[] args) {
    		Person ming = new Person();
    		String s = "小明";
    		int i = 12;
    		ming.setName(s);
    		ming.setAge(i);
    		System.out.println("实例变量ming.getName():"+ming.getName());
    		System.out.println("实例变量ming.getAge():"+ming.getAge());
    		System.out.println("外部变量s:"+s);
    		System.out.println("外部变量i:"+i);
    	}
    }
    

    5.定义private方法

    如果public方法有重复的部分,可以定义private方法提高代码复用性。
    类中private方法只能由类的public方法调用,实例不能直接调用。
    Person.java

    public class Person {
    	private String name;
    	private int age;	
    	public void setName(String name) {
    		this.name = name.trim();
    	}
    	private String getName() {
    		return this.name;
    	}
    	public void setAge(int age) {
    		this.age = age;
    	}
    	private int getAge() {
    		return this.age;
    	}
    	private int getBirth() {
    		return calcBirth(2019);
    	}
    	private int calcBirth(int currentYear) {
    		return currentYear - age;
    	}
    	public void info() {
    		System.out.printf("我是%s,我出生于%d年,今年%d岁" ,name, getBirth(),age);
    	}
    }
    
    

    Hello.java

    public class Hello {
    	public static void main(String[] args) {
    		Person ming = new Person();
    		ming.setName("  小明  ");
    		ming.setAge(16);
    		ming.info();
    	}
    }
    

    6.总结:

    方法可以让外部代码安全地访问实例字段
    方法是一组执行语句
    方法内部遇到return时返回
    void表示不返回任何值(注意和返回null不同)
    外部代码通过public方法操作实例
    内部代码可以调用private方法

  • 相关阅读:
    a标签 不触发 目标链接
    java Byte[] to String(hex)
    error C2664: 'BOOL (PCERT_SELECT_STRUCT_A)' : cannot convert parameter 1 from 'CERT_SELECT_STRUCT *' to 'PCERT_SELECT_STRUCT_A'
    java jni c++ 例子
    Java.io.DataInputStream.readInt()
    sso demo mysql ( cas )
    sso demo 取消https (cas)
    poj 1422 Air Raid (二分匹配)
    poj 1274 The Perfect Stall (二分匹配)
    hdu 1392 Surround the Trees (凸包)
  • 原文地址:https://www.cnblogs.com/csj2018/p/10256597.html
Copyright © 2011-2022 走看看