修改可控你能理解吗???在不触发另一个操作的情况下,去修改变量。
(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(); } }
还是扎扎实实先把基础学好吧。
没有人说到关键点,因为这里混杂了一大堆问题。事实上从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来获取和设置值(访问语义)
private不是不让修改,是使修改可控。
一个简单例子就是:如果你修改某个变量的同时必须触发另外一个操作,那么用setter就直接在setter里边加代码就行,直接访问变量就无法实现。
另外一个简单例子是:假如你规定禁止把它修改为某个值,可以在setter内直接返回,并不修改实际变量的值。
当然,某些语言有直接访问变量就能触发读写函数的语法糖,这样一来确实可以不用。
不过java当初不是没有属性么,所以就只能用getter setter了。
请复习面向对象三大特性并理解其含义
吃完一盒烤鸭了,来啰嗦一下吧:
我就不讲课本上明确写的那些了,先从面向对象本身这里说吧。
面向对象构造的类,对外部应该是一个黑盒:你能看到我给你的部分,但是你不知道内部构造。就好像所谓画虎画皮难画骨,知人知面不知心。
有些人的疑惑在于,那你搞那么多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,确实不太容易理解它到底是怎么变成这样的。
这是我看到的最准确的总结。
总的来说,就是中国的高考相对公平,所以性价比极高,所以其他活动都可以适当让步。