在Java类中,我可以看到类对象和变量可以具有相同的名称。如果它们具有相同的范围,将打印哪个值?

时间:2016-01-29 15:02:51

标签: java oop

public class Simple { 
    public float price; 
    public static void main (String[] args) { 
        Simple price = new Simple (); 
        price.price = 4;
        System.out.println(price);
    } 
} 

输出应该是什么?为什么?对象值还是4.0?

3 个答案:

答案 0 :(得分:1)

它们没有相同的范围(或者它们是相同的变量)。 narrowest 范围内仍包含用法的变量是使用的变量。

class customCell: UICollectionViewCell{
     var imgView = UIImageView()
     override init(frame: CGRect) {
         super.init(frame: frame)
         commonInit()
     }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }
    func commonInit(){
         imgView.translatesAutoresizingMaskIntoConstraints = false
         self.addcontentView.addSubview(imgView)
         //add constraints
    }
}


class CollectionViewController: UICollectionViewController {
     private let imageLib = [...] //image file name strings

     override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell : IconCollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier(keyIconCellReuse , forIndexPath: indexPath) as! IconCollectionViewCell

        let image1 = (UIImage(named: imageLib[indexPath.row])?.imageWithRenderingMode(.AlwaysTemplate))!
        cell.imgView = UIImageView(image: image1)
        cell.imgView.tintColor = UIColor(white:0, alpha:0.7)
        cell.userInteractionEnabled = true

        return cell

    }

}

输出

public static class Simple {

    public float price;

    public static void main(String[] args) {
        // Narrower scope than the instance variable.
        Simple price = new Simple();
        price.price = 4;
        // Uses the narrower one (the Price, not the float).
        System.out.println(price);
    }
}

答案 1 :(得分:1)

  

输出应该是什么?为什么?对象值还是4.0?

对象值...因为在main方法中,局部变量price将隐藏实例变量price

(实际上,println方法在对象上调用toString()并打印出结果字符串。但我猜你知道这一点。)

  

在Java类中,我可以看到类对象和变量可以具有相同的名称。如果它们具有相同的范围,将打印哪个值?

在您的示例的上下文中没有意义,因为局部变量和实例变量具有相同的范围。

(更重要的是,即使实例字段price未被隐藏,您仍然无法使用System.out.println(price);进行打印,因为您无法参考像static方法中的实例变量一样。您无法隐式或明确地在this方法中引用static。)

答案 2 :(得分:0)

因为price是在主方法范围中声明的引用变量 ,而不像在float price类范围中声明为实例变量的Simple

例如,如果您在System.out.println(price);构造函数中添加Simple,则必须打印 4.0 ,因为他会查找在那里声明的变量引用。