zoukankan      html  css  js  c++  java
  • java基础:4.2 对象和类(二)、数据域封装、this

    1、数据域封装

    为了避免对数据域的直接修改,应该使用Private修饰符将数据域声明为私有的,这称为数据域封装。

    在定义私有数据域的类外的对象是不能访问这个数据域的。但是经常会有客户端需要存取、修改数据域的情况。为了能够访问私有数据域,可以提供一个get 方法返回数据域的值。为了能够更新一个数据域,可以提供一个set 方法给数据域设置新值。get 方法也被称为访问器(accessor), 而set 方法称为修改器(mutator)。

    public returnType getPropertyName()
    public boolean isPropertyName()
    public vodi setPropertyName(dataType propertyValue)

    举例:

    public class Circle {
        private double radius=1;   //私有的,可以防止被篡改。
        private static int circleNumber =0;
        
        /*	set radius */
        Circle(){
            circleNumber++;
        }
        Circle(double newRadius){
            radius = newRadius;
            circleNumber++;
        }
        
        /* return radius */
        public double getRadius() {
        	return radius;
        }
        /* set radius */
        public void setRadius(double newRadius) {
        	radius = (newRadius >=0) ? newRadius : 0;
        }
        /* get the number of all circles */
        public static int getNumberOfCircle() {
        	return circleNumber;
        }
        
        public double getArea(){
            return radius*radius*Math.PI;
        }
    }
    
    

    2、对象数组

    之前学过了怎么申明数组,这里把对象和数组的知识结合在一起————申明、使用对象数组

    package day06;
    public class TestClass {
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Circle[] c = new Circle[5];    // 创建了5个对象的数组
    		for(int i=0;i<c.length;i++) {
    			c[i] = new Circle(i);   // 对象赋值
    			c[i].printC();
    		}	
    	}
    }
    
    package day06;
    import java.util.Random;
    public class TestClass {
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		final int number = 5;
    		Circle[] CircleArray;
    		CircleArray = creatCircleArray(number);
    		printArray(CircleArray);
    		printSum(CircleArray);
    	}
    	
    	public static Circle[] creatCircleArray(int number) {
    		Circle[] c = new Circle[number];
    		for (int i=0;i<c.length;i++) {
    			c[i] = new Circle(Math.random()*10);
    		}
    		return c;
    	}
    	
    	public static void printArray(Circle[] circleArray) {
    		System.out.printf("%-30s%-15s
    ","Radius","Area");
    		for(int i=0;i<circleArray.length;i++) {
    			System.out.printf("%-30f%-15f
    ",circleArray[i].getRadius(),circleArray[i].getArea());
    		}
    	}
    	
    	public static void printSum(Circle[] circleArray) {
    		double sum=0;
    		for (int i=0;i<circleArray.length;i++) 
    			sum += circleArray[i].getArea();
    		System.out.printf("sum = %.5f
    ",sum);
    	}
    }
    
    
    
    

    3、this

    this的主要三个作用

    (1)this调用本类中的属性,也就是类中的成员变量;

    (2)this调用本类中的其他方法;

    (3)this调用本类中的其他构造方法,调用时要放在构造方法的首行。

    应用一:引用成员变量

    Public Class Student {
        String name;           //定义一个成员变量name
        private void SetName(String name) {         //定义一个参数(局部变量)name
        this.name=name; }             //将局部变量的值传递给成员变量
    }  

              //两个变量名字如果相同的话,那么Java如何判断使用哪个变量?

         此时this这个关键字就起到作用了。this这个关键字其代表的就是对象中的成员变量或者方法。也就是说,如果在某个变量前面加上一个this关键字,其指的就是这个对象的成员变量或者方法,而不是指成员方法的形式参数或者局部变量。

             不过有些程序员即使在没有相同变量的时候,也喜欢使用this.成员变量的形式来引用变量,这主要是从便于代码的阅读考虑的。一看到这个this关键字就知道现在引用的变量是成员变量或者成员方法,而不是局部变量。这无形中就提高了代码的阅读性

     

    应用二:调用类的构造方法

    public class Circle {
            private double radius;
            public Circle(double radius) {
                  this.radius = radius; }   
         //  1方法. this关键字用于引用所构建的对象的隐藏数据域radius
    
            public Clrcle() {
             thls(1.0);           //  this关键字用于调用另外一个构造方法
    }

        如果要使用这种方式来调用构造方法的话,有一个语法上的限制。一般来说,利用this关键字来调用构造方法,只有在无参数构造方法中第一句使用this调用有参数的构造方法。否则的话,翻译的时候,就会有错误信息。这跟引用成员变量不同。如果引用成员变量的话,this关键字是没有位置上的限制的。如果不熟悉这个限制的话,那么还是老老实实的采用传统的构造方法调用方式为好。虽然比较麻烦,但是至少不会出错。

    应用三:返回对象的值

            this关键字除了可以引用变量或者成员方法之外,还有一个重大的作用就是返回类的引用。如在代码中,可以使用return this,来返回某个类的引用。此时这个this关键字就代表类的名称。如代码在上面student类中,那么代码代表的含义就是return student。可见,这个this关键字除了可以引用变量或者成员方法之外,还可以作为类的返回值,这才是this关键字最引人注意的地方。

  • 相关阅读:
    hdu 5007 水题 (2014西安网赛A题)
    hdu 1698 线段树(成段替换 区间求和)
    poj 3468 线段树 成段增减 区间求和
    hdu 2795 公告板 (单点最值)
    UVaLive 6833 Miscalculation (表达式计算)
    UVaLive 6832 Bit String Reordering (模拟)
    CodeForces 124C Prime Permutation (数论+贪心)
    SPOJ BALNUM (数位DP)
    CodeForces 628D Magic Numbers (数位DP)
    POJ 3252 Round Numbers (数位DP)
  • 原文地址:https://www.cnblogs.com/l20902/p/10610950.html
Copyright © 2011-2022 走看看