百科问答小站 logo
百科问答小站 font logo



java 为什么有private关键字? 第1页

  

user avatar   xia-tian-de-pu-tao-5 网友的相关建议: 
      

修改可控你能理解吗???在不触发另一个操作的情况下,去修改变量。

private关键字

(1)修饰成员:可以修饰成员变量和成员方法

(2)特点:被private修饰的后的成员只能在本类中被访问

(3)private的应用:定义类的时候,当把成员变量给private修饰时,需提供对应的getXxx()和setXxx()方法 ,这样提高了数据的安全性。

学生类

       public class student {     String name;     private int age;      //提供get和set方法     public void setAge(int a){        // age=a;         if (a<0 || a>120){             System.out.println("你给的年龄有误");         }else{             age=a;         }     }     public int getAge(){         return age;     }      public void show(){         System.out.println(name+","+age);     } }      

学生测试类

       public class studentDemo {     public static void main(String[] args){         student p=new student();          p.name="小明";         p.setAge(-30);         p.show();     } }      

还是扎扎实实先把基础学好吧。

一些知乎最新上线的Java课程推荐:


user avatar   Ivony 网友的相关建议: 
      

没有人说到关键点,因为这里混杂了一大堆问题。事实上从C#的角度看就很清晰了……

简单的来说,private的作用是声明一个成员不是接口。而getter和setter存在的意义是,field是不能作为interface的成员的,getter和setter的本质问题就在这里,interface只能包含行为定义,而不能包含资产定义。这个事情可以认为是实现和理论的一个妥协。当然标准答案是什么setter可以增加校验逻辑之类,但是其实解释不了有些对象的成员就百分之百的永远没有校验逻辑,例如DAO。为啥还一定要设计getter和setter。

我为什么说这是实现和理论的妥协呢?很简单,我们是不是可以抽离变量定义的语义和变量访问的语义呢?当然可以,但是这样一来,你设计出来的语法就会无限接近C#的自动属性,最后JIT编译器加个优化把setter和getter优化掉,这不就完了?


爪机,我就不说太细了,我知道能看懂的没几个,有时间再给你们掰碎了讲……


其实按照Java的设计逻辑,就不应该允许public field出现才是,估计也是为了顾及性能/没想清楚。语言方面Java就是屎。所以我经常说,你要真的想搞清楚Java,你得去看C#的设计,才能深刻理解Java……


稍微解释下上文中出现的资产语义是什么意思,这个词是我造的,但不是我要装逼是我没找到合适的词。简单说资产就是说,这个对象实例在内存里面拥有的槽位。field为什么是资产,因为定义一个filed,那么所有的该类型的对象实例都会有这个field的槽位。但是方法不会有,field的资产语义和访问语义是指,private int a,预留了一个槽位存放一个整形值(资产语义)并且只有定义a的类型的成员代码,可以通过a来获取和设置值(访问语义)


user avatar   pansz 网友的相关建议: 
      

private不是不让修改,是使修改可控。

一个简单例子就是:如果你修改某个变量的同时必须触发另外一个操作,那么用setter就直接在setter里边加代码就行,直接访问变量就无法实现。

另外一个简单例子是:假如你规定禁止把它修改为某个值,可以在setter内直接返回,并不修改实际变量的值。

当然,某些语言有直接访问变量就能触发读写函数的语法糖,这样一来确实可以不用。

不过java当初不是没有属性么,所以就只能用getter setter了。


user avatar   mai-cui-ya-96 网友的相关建议: 
      

请复习面向对象三大特性并理解其含义

吃完一盒烤鸭了,来啰嗦一下吧:

我就不讲课本上明确写的那些了,先从面向对象本身这里说吧。

面向对象构造的类,对外部应该是一个黑盒:你能看到我给你的部分,但是你不知道内部构造。就好像所谓画虎画皮难画骨,知人知面不知心。

有些人的疑惑在于,那你搞那么多getter、setter的意义在哪里?这有点历史了。如果按照它原来这个概念来做东西的话,这个类是一个比较完善的类,正如你最初学java时,比如写一个鸟的类,会在里面写一个比如public void sing(){ System.out.println("鸟在唱歌");}。那既然可以这么干,实际上在getter、setter里面也是可以混入业务代码的。当然,这个问题还能涉及到现在很少有人重写的“equals”“toString”“hashCode”等方法。它一开始的思路就是要你在类里面直接实现这些逻辑。按这个思路整下去,Enterprise Java Bean就出现了。

为了以防大家会迷惑,我再补充一个例子吧。如果按这个思路搞的话,现在有一个音箱类,你可以setVolume(35),但是实际上的是把电阻从10kΩ改成了4kΩ。后面这部分,应该是对外不可见的,也不知道的。

EJB是怎么从中坚力量到被冷落的,这个有兴趣可以去考古。长话短说的话,和上面那种思路相反的一种思想就是,只把这些基础类作为数据容器使用,自己并不管业务逻辑,它在业务逻辑中是被别人推动的。打个比方就是,一只鸟它不会叫,然后你可以逗它,你就认为它叫了。这和上面不一样的地方就出现了,最初是直接去调用鸟唱歌的方法;现在你有个神奇的笼子,你把鸟放进去,然后笼子改变了鸟的音量、频率,于是鸟“叫”了。于是,这种情况下,鸟不需要“方法”了,它只需要属性。而这样的东西,被称作Plain Ordinary Java Object。

因为现在可能一上来,老师也给你讲不明白,就让你写POJO,确实不太容易理解它到底是怎么变成这样的。


user avatar   ling-jian-94 网友的相关建议: 
      

这是我看到的最准确的总结。

总的来说,就是中国的高考相对公平,所以性价比极高,所以其他活动都可以适当让步。




  

相关话题

  C# 发明者与 Java 有关系么? 
  多个 CPU 操作多线程对主内存中某一共享变量同时进行写入操作可以做到吗? 
  学java是不是只能做网页开发? 
  为什么jvm不用协程实现 gc 呢? 
  JAVA 学到什么水平就可以转战 Android 了? 
  码农们最常说的「谎言」有哪些? 
  Java bean 是个什么概念? 
  如何理解 Golang 中“不要通过共享内存来通信,而应该通过通信来共享内存”? 
  如何评价《阿里巴巴JAVA开发手册》完美版,终极版,纪念版? 
  PHP 比 Java 的开发效率高在哪? 

前一个讨论
为什么俄罗斯都知道尽量不伤害平民而美国喜欢无差别轰炸?
下一个讨论
你为什么喜欢永雏塔菲?





© 2024-11-24 - tinynew.org. All Rights Reserved.
© 2024-11-24 - tinynew.org. 保留所有权利