MyException - 我的异常网
当前位置:我的异常网» 编程 » java中到底是沿袭父类变量还是访问父类变量

java中到底是沿袭父类变量还是访问父类变量

www.MyException.Cn  网友分享于:2013-02-16  浏览:6次
java中到底是继承父类变量还是访问父类变量

 对于访问父类的变量我们到底应该如何做??

1.  直接访问通过方法访问父类的变量:

package com.huawei.test
public class ProtectedVariable extends Parent{	
	public static void main(String[] args) {
		Parent v1 = new ProtectedVariable();
		v1.setName("keke8614");
		System.out.println(v1.getName());
		Parent v2 = new ProtectedVariable();
		v2.setName("keke8615");
		System.out.println(v2.getName());
		System.out.println(v1.getName());
	}
}
class Parent{
	private String name;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

 2. 第二种方法通过继承访问父类的变量:

package com.huawei.test;
public class ProtectedVariable extends Parent{
	public static void main(String[] args) {
		Parent v1 = new ProtectedVariable();
		v1.name = "keke8614";
		System.out.println(v1.name);
		Parent v2 = new ProtectedVariable();
		v2.name = "keke8615";
		System.out.println(v1.name);
		System.out.println(v2.name);
	}
}
class Parent{
	protected String name;
}

       

       通过上面的方法我们都可以访问到变量,那么到底哪种访问符合便准的编程规范呢,我很是疑惑?

这是我在看一些源码中时发现的。而源码中更多的是以下的编码格式

 

package com.huawei.test;
public class ProtectedVariable extends Parent{	
	public static void main(String[] args) {
		Parent v1 = new ProtectedVariable();
		v1.setName("keke8614");
		System.out.println(v1.getName());
		Parent v2 = new ProtectedVariable();
		v2.setName("keke8615");
		System.out.println(v2.getName());
		System.out.println(v1.getName());
	}
}
class Parent{
	protected String name;
	public String getName() {
		//可能对name进行操作
		return name;
	}
	public void setName(String name) {
		//可能对name进行操作
		this.name = name;
	}
}

 

    这样设计到底起到了什么好处啊??希望给予正解......

 

1 楼 tangzhibin 前天  
保护私有变量、封装数据,将对变量的访问与变量本身区分开;
而且还可以在getter和setter方法中做一些数据转换,而不直接操作变量本身,对外部调用者不必关心
2 楼 keke8614 前天  
tangzhibin 写道
保护私有变量、封装数据,将对变量的访问与变量本身区分开;
而且还可以在getter和setter方法中做一些数据转换,而不直接操作变量本身,对外部调用者不必关心

如果是这样,那protected对父类属性就失去了意义,是不是有更好的解释呢?
3 楼 ohunbeyond 昨天  
keke8614 写道
tangzhibin 写道
保护私有变量、封装数据,将对变量的访问与变量本身区分开;
而且还可以在getter和setter方法中做一些数据转换,而不直接操作变量本身,对外部调用者不必关心

如果是这样,那protected对父类属性就失去了意义,是不是有更好的解释呢?


这种类设计的目的就是用来被继承的,用protected正合适!
4 楼 keke8614 昨天  
ohunbeyond 写道
keke8614 写道
tangzhibin 写道
保护私有变量、封装数据,将对变量的访问与变量本身区分开;
而且还可以在getter和setter方法中做一些数据转换,而不直接操作变量本身,对外部调用者不必关心

如果是这样,那protected对父类属性就失去了意义,是不是有更好的解释呢?


这种类设计的目的就是用来被继承的,用protected正合适!

单只用protected是不够的,如果这里不是String对象,而是一个OutputStream对象呢,我们需要子类可以根据自己的需求初始话OutputStream,那此时怎么抉择呢?
5 楼 audrey1226 昨天  
keke8614 写道
ohunbeyond 写道
keke8614 写道
tangzhibin 写道
保护私有变量、封装数据,将对变量的访问与变量本身区分开;
而且还可以在getter和setter方法中做一些数据转换,而不直接操作变量本身,对外部调用者不必关心

如果是这样,那protected对父类属性就失去了意义,是不是有更好的解释呢?


这种类设计的目的就是用来被继承的,用protected正合适!

单只用protected是不够的,如果这里不是String对象,而是一个OutputStream对象呢,我们需要子类可以根据自己的需求初始话OutputStream,那此时怎么抉择呢?


子类也需要初始父类的变量, 不知道我理解的正确不正确, 我写了个小例子

package entity;

import java.io.OutputStream;

import entity.Father;

public class Son extends Father {
   private final OutputStream son;

   public Son(OutputStream father, OutputStream son) {
      super(father);
      this.son = son;
   }

   class Father {
      protected final OutputStream father;

      public Father(OutputStream father) {
         this.father = father;
      }
   }
}
6 楼 jackra 23 小时前  
如果如文中所述
此处不应用继承
而应使用聚合

private在继承体系确可以体现继承线上的特色。
但如果特色需要被子类使用,private的限制应转变为protected。

此问题是指:使用面向对象的语言,却不用面向对象的思想做事。

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有