java中为什么java 静态成员变量量私有化了,不用get方法也能访问到。求解

Java子类到底有没有继承父类的私有字段? - 知乎42被浏览<strong class="NumberBoard-itemValue" title="分享邀请回答public class Person {
private String name;
public Person(String name) { this.name = name; }
public String getName() { return name; }
Student类继承Person类,public class Student extends Person {
private int id;
public Student(String name, int id) {
super(name);
this.id = id;
Student没有name字段,但它内部的Person对象有,而且还可以打出来看。public static void main(String[] args) {
Student s = new Student("bitch",99);
System.out.println(s.getName()); // BITCH
System.out.println(s.name); // ERROR: name has private access in Person
而且注意,我要直接打印Student的name字段 "s.name" ,报错说的是:Person类的name字段为私有,你不可以访问。而不是没有name字段。大胆一点的话,我们还可以给Student类再加一个name字段。这时候的Student对象本身有一个name字段,内部的基类Person对象还有一个name对象。public class Student extends Person {
private int id;
private String name;
public Student(String personName, String studentName, int id) {
super(personName);
this.name = studentName;
this.id = id;
这时候,会打出来什么呢?public static void main(String[] args) {
Student s = new Student("bitch","whore",99);
System.out.println(s.getName()); // BITCH
System.out.println(s.name); // WHORE
所以,王翠花进了高盛,同事都叫她Susan,而且她不想让同事知道她其实叫王翠花。是不是这个道理?通过这个例子,可以体会一下一个“面向对象”的编程语言是怎么封装数据的。3022 条评论分享收藏感谢收起85 条评论分享收藏感谢收起19:27 提问
java中有关get方法的使用(具体程序分析)
最近在学习java,用的徐彩霞的java基础教程。
有个例子不太明白。
/* /注释部分的get部分有和没有结果一样,想知道为什么要用get?
又必须要用的情况吗?
刚学,懂得比较少,谢谢了~
class Person
private void talk()
System.out.print("I'm "+name+" and " + age+" years old");
public void say()
public void setName(String str)
public void setAge(int a)
/*public String getName()
public int getAge()
public class TestPersonDemo5 {
public static void main(String[] args)
// TODO Auto-generated method stub
Person p=new Person();
p.setName("John");
p.setAge(30);
按赞数排序
set和get字面理解是设置和取得,在Java中也基本就是这种意思,你可以在一个类中进行设置变量值,然后又设置get方法可以让该变量值在别处让其它的类去得到。也就是get就是给别处一个得到的方法,所以你说的删除一些不影响因为这里不是别处。如果是其它的类去取得该值没有get方法就不行了,我的理解希望帮到你。
面向对象编程告诉我们在一个类中,通过set方法设置属性的值,通过get方法获取属性的值,而不要将属性直接暴露。你可以在get方法中进行各种处理,然后得到结果。
这个例子只是展示java中一个类的基本函数成员,虽然在这个例子的运行中get函数没有用,但是它代表了一种获取与封装类成员的基本方法。作为一种隐蔽函数成员与处理方式的接口,set与get系列函数是类的基本成员函数。
这涉及到面向对象中的封装,很多情况下一个对象的属性我们只能获取不能修改,我们只能把这个属性设置为private或者protected,但是这样的话外部连获取该属性也获取不到了。所以我们只能手动添加一个public 的get方法,利用方法来返回private属性的值。这样可以保护属性不能被外部修改。
这个涉及到对象的封装,如果成员变量用private修饰 ,那么属性只能由本类进行访问,其它类是无法访问到的。如果使用默认的,或者 public可能把成员变量暴露给用户,这样不利于应用程序的安全性。那么,这时候 ,如果我们要得到内存当中成员变量的值 ,只能公开一个public的方法,因是get方法,来取得变量的值 ,保证应用程序可以正常运行。
这个涉及到对象的封装,如果成员变量用private修饰 ,那么属性只能由本类进行访问,其它类是无法访问到的。如果使用默认的,或者 public可能把成员变量暴露给用户,这样不利于应用程序的安全性。那么,这时候 ,如果我们要得到内存当中成员变量的值 ,只能公开一个public的方法,因是get方法,来取得变量的值 ,保证应用程序可以正常运行。
这个问题问的很好;对于java这类oop的语言,为了封装内部状态;尽量把成员对象设成private。这样外面的程序就不能直接访问这些成员变量了。但是有的时候,外面的对象要set或者get内部变量的值,所以就产生了accessor(get方法)和modifier(set方法)。在这个例子里。貌似accessor方法没有必要,但是生成person对象的目的是为了将来能访问它,如果缺少accessor方法,将来如何访问这些成员变量呢。
再加一句,对于这个例子,设计是有问题的,首先对人的设计,普通只设计生日(生日不变的),这样生日就是final类型了。至于姓名。取决于你的姓名是否改变。理论上来说即使姓名会改变,我们最好把姓名设计成final的。这样就不需要setName和setAge方法了。而是在构造函数里面设置姓名和生日。这里追加这么一句的原因是变量的常量化很重要,尤其对多线程编程环境。
java面向对象,有一种叫做“私有(privat)成员变量”的结构,可以有效防止外部类的非法或非故意的调用,比如,
public class 人{
public int 年龄;
public class 死神{
Vector&生物& set = new Vector&生物&();
public void 杀了活的太长的生物(){
大致是这个意思。。。。。
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐java程序规范中会建议大家尽量将类中的属性私有化,即定义为private变量,通过设置set和get函数来对属性进行操作。一些人存在这样的疑问,为什么不直接将属性设置为public,以后调用属性时直接通过对象进行访问不是更方便?当然java中这样做有它的原因:1&&将数据与行为分离,也就是java的面向对象的概念。&&&对象就是属性+行为,封装就是把对象的私有属性封装起来,只有通过自己公开的行为去改变(获得)对象内部的私有属性信息,而那些public的方法正是面向其他对象的接口,只有通过接口去改变(获得)对象的私有属性2&&安全性&&&&设想,你有一个Person类代表一个人,Person有一个char类型的sex字段表示性别,理论上,sex只接受两个值, 'M '和 'F ',但如果你把sex字段设为public,你很难限制你的用户只给它赋 'M '或 'F '值。将sex设为private,再用setSex()来设置性别,你就完全可以控制这种行为了。而且你还可以控制只能get不能set,或相反,但如果是public就不行了。别外有一点属性我们可能并不希望其他用户对我们的属性进行写操作,这个时候,可以直接不写setX方法。这就是只读属性了。3&&编码规范性&&&&我们在设计类,或者作com组件时经常告诉其实coder,你只需要调用我的XX接口方法就可以了,内部我是怎么实现的,你不用管,如果面向特定的环境特定的时间段,直接将属性声明为public,让外部对象访问也未偿不可,没有面象对象思想时,我在写C语言程序时结构中的变量是可以随意被访问的,因为没有pulbic,private之分,现在我们是面向对象编程,我们需要在接口处作文章,而保护对象的私有属性,即安全性,只有通过对外公开的接口方法去访问在面向对象理论上认为是安全的。4&&稳定性5&&可扩展性6&&便于维护
阅读(...) 评论()没有更多推荐了,
不良信息举报
举报内容:
【封装】java中为什么要将属性进行私有化,又使用set和get方法来设置和获取属性呢?
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!欢迎加入我们,一同切磋技术 &
用户名: &&&
密 码: &
共有 13010 人关注过本帖
标题:从未学习过java面向对象编程的朋友,一篇文章包你学会,通俗易懂。【xiao金 ...
来 自:广东
等 级:论坛游民
帖 子:67
专家分:38
结帖率:90.91%
&&已结贴√
&&问题点数:20&&回复次数:8&&&
从未学习过java面向对象编程的朋友,一篇文章包你学会,通俗易懂。【xiao金刚】
学了一个月的java编程发表下对面向对象的一些总结。课堂上讲的有点系统性,部分细节方面没有讲到,(构造函数 构造代码快 匿名函数 this关键字 静态 静态代码块)这些只能通过课外的知识来扩充一下,下面是本人总结了课堂学习和课外教程的总结 对面向对象的理解。花了三个多小时整理出来的,希望能帮助一些刚刚开始学习java面向对象的朋友。丑话说在前头。想学的就看下去,不管多长终有结束。看完了文章你就能把类和对象使用自如,关于对象和类在堆和栈内存中的过程我会在后面的文章慢慢说。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& xiao金刚&&原创
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&qq :&&
1 面向对象介绍
1.什么是面向对象对象其实就是现实生活中的各种物体,他们有各种各样的功能,当我们需要借助这些物体去完成我们的需求时,我
们就是在面向这些对象,使用它们其中的功能,至于他们其中的功能是如何实现的,我们无需知道,只要能完成需求既可。万物皆对象,刚开始学
习对象和类的时候建议不要看构造函数, 构造带码块 ,匿名函数, 封装 ,成员代码块,this关键字,以及静态修饰,学习一些基本的东西就
不会让你感觉到类和对象是那么烦的东西,其实类和对象很简单,不要想的那么复杂,为什么我下面会说oop(面向对象)是一种思想呢,
因为当你了解了对象之后就会知道对象的使用是 多么简单,对象就好像是一个人一样,你让他干嘛他就干嘛。他不会罢工,只要这段代码
的生存周期还在的前提下,就是说这个人还活着。他有钥匙(变量)你让他开门(方法)[函数调用变量进行操作],他就开门,至于他怎么开
门你不用理会先,你只需要知道了你让他干嘛他就干嘛这就是一种面向对象的思想。回到那个人开门那里。为什么他会开门。就因为这个人(对
象)拥有开门的方法,所谓的方法就是函数,函数怎么定义呢。相信学到这里的人都应该知道如何写函数了吧。我这里就带过了。我们让他开门
他就得开。然后我们再命令另外个人去开窗,这两个人是不一样得人,拥有得方法(函数)不一样。我们可以创建另外一个对象,叫他去开窗。
如果你想让这个人拥有开门又拥有开窗的方法,那么就要给一个对象定义多个方法(函数),那我们就不需要再去创建多一个对象浪费内存了。
至于类和对象得关系就更简单了。类就相当于一个概念,都有共同的属性,比如说年龄 名字 他们都拥有这些属性,类的实例化就是对
象。 什么是实例化呢。实例化就是说精确到一个个体(一个人)。在一个类中创建一个对象就需要用到一个关键词“new”,这个关键字的功能很
多,这里只说一点,他就是用来创建对象。 创建了对象之后我们就要叫这个人做事了,做事总得有个方法来叫是不是,那就是专业词语
(其实也不算专业)调用,调用得方法就是&&&&&&&&&&&&&&&&&&&&对象名.方法&&&&&&&&&&&& (打点空格让你们看清楚)&&&这就是叫那个人做事的命令。你想要
他干嘛他就干嘛。你想他有什么功能就直接到类里面去定义,要实例化了才能调用,(即创建对象,暂时需要知道的就是要先创建对象,至于学
到后面直接引用类名.方法就需要使用静态修饰这里不多说,免得造成初学者的困难)比如你要他执行a和b相加。直接在类里面的函数里创建下
变量 然后执行一个a+b的方法return下返回值就可以了。调用完就可以得到 一个数,就是说你用这个方法就能得到了这个相加后的值。 在
我觉得面向对象的复用性就是面向对象的最好用的特点,因为它可以减少你的敲写代码的时间,增大代码的可观看性(也可以说事理解性,这样
能更好的帮助阅读你的程序的人)。&&它两的关系就这么简单。有什么不懂的pm我。当你完全学会了面向对象的思想就可以一步一步的学习下面
的构造函数和静态 还有封装的一些性质。
2.什么是面向对象编程(OOP):Object Oriented Programming是一种编程思想, 使用对象去进行编程.
它的特点有: 封装,继承, 多态 。&&
3.对象从哪来:对象是需要先用类来描述, 然后使用类来创建.
类是对象的描述, 对象是类的实例.
4.面向对象的优点
&&&&&&&&&&&&&&提高代码复用性.
&&&&&&&&&&&&&&使用者无需关心对象其中是如何实现的.
&&&&&&&&&&&&&&让程序员从一个编写者转换成一个使用者.
&&&&&&&&&&&&&&更加符合人的思维能力,使编程更简单.
1.成员变量
在类中用变量来描述这一类对象公有的特征.
2.成员函数
在类中用函数来描述这一类对象公有的行为.
3 创建和使用对象
1.怎么创建
使用&new 类名()&形式创建一个对象
2.怎么使用
通过&.&语法来访问类的成员.
&&&&&& 例如: Person p = new Person();//创建对象 p
&&&&&&&&&&&&&&& p.name = &张三&;&&//给对象定义的name赋值
&&&&&&&&&&&&&&& p.eat(); //调用p对象里面的eat方法
4对象的初始化过程
类在第一次使用的时候被加载到内存中
2.初始化成员变量
当创建对象的时候, 成员变量会初始化为默认值, 基本数据类型都是0, 引用数据类型都是null
5对象的生命周期
new关键字创建对象的时候, 生命周期开始
没有任何引用指向对象, 该对象成为垃圾, 被虚拟机回收
6 匿名对象
1.什么是匿名对象
没有任何引用指向的对象, 就叫匿名对象
2.匿名对象有什么特点
匿名对象在创建之后立即被回收, 只能使用一次
1.什么是封装
封装就是将一类事物的特征和行为封装在一个类中, 定义成成员变量和成员函数
创建对象之后, 这些成员函数可以访问自己的成员变量
2.对成员变量的封装
使用private关键字将成员变量私有化
如果需要对外部提供访问方式, 写公有的get,set方法
8 构造函数
&&& 1.什么是构造函数
&&&&&&&&&&&&&&构造函数是一个特殊的函数.
&&&&&&&&&&&&&&函数名必须和类名一致.
&&&&&&&&&&&&&&没有返回值类型.(不等于void,不能写任何返回值).
&&&&&&&&&&&&&&可以写return,但是不能写return+值(尽量不要写).
&&&&&&&&&&&&&&new关键字创建对象时自动调用
&&& 2.应用场景
&&&&&&&&&&&&&&如果我们希望一段代码在创建对象的时候执行, 就可以写在构造函数中
&&&&&&&&&&&&&&通常我们使用构造函数对成员变量进行赋值
&&&&&& 3.构造函数和成员变量的执行顺序
成员变量优先于构造函数先执行,因为通常使用构造函数都是对成员变量进行初始化,所以如果没有成员变量,构造函数是没有任何意义的.
&&&&&& 4.构造函数的重载
&&&&&&&&&&&&&&和普通函数一样, 参数列表不同(类型不同,顺序不同,个数不同)即可.
&&&&&&&&&&&&&&重载只与参数列表有关
&&& 5.构造函数的调用
&&&&&&&&&&&&&&在创建对象时自动调用.
在构造函数的第一条语句可以使用&this(被调用的构造函数的实际参数)&的形式调用该类其他构造函数.
&&& 6.自动生成构造函数
在一个类中构造函数是一定存在的.
因为在一个类中如果没有写任何的构造函数, 编译时也会自动生成一个无参的构造函数, 里面什么代码都没有.
&&&&&&&&&&&&&&如果写了任何一个构造函数, 那么就不会有自动生成的了
注意:我们在类中只写了一个有参构造函数的时候, 这个类就不能使用无参的构造函数创建对象了
&&&&&& 7.构造函数的访问权限
通常构造函数的访问权限都是公有的, 因为构造函数就是为了让别人创建对象时调用的
个别情况下在定义类时不希望外部创建对象, 这时可以使用private修饰构造函数, 例如:单例设计模式(Singleton)
9 成员代码块(构造代码块)
&&&&&& 1.什么是成员代码块
&&&&&&&&&&&&&&在类中使用&{}&定义一段代码, 这段代码在创建对象的时候会自动运行
&&&&&& 2.成员代码块和构造函数的区别
&&&&&&&&&&&&&&构造函数在创建对象的时候是N个选1个调用
&&&&&&&&&&&&&&而代码块是一定执行
&&&&&&&&&&&&&&构造函数可以传入参数
&&&&&&&&&&&&&&代码块不能传入参数
&&&&&& 3.创建对象时内存中的工作顺序
&&&&&&&&&&&&&&在内存中查找指定的类, 如果没有就加载类, 有则直接引用
&&&&&&&&&&&&&&在内存中开辟一块空间, 将成员变量初始化为默认值, 0和null
&&&&&&&&&&&&&&按照类代码从上到下的顺序, 执行代码块或者成员变量赋值
&&&&&&&&&&&&&&执行构造函数中的代码
&&&&&& 4.在方法中也可以写代码块(方法代码块),但是不常用
10成员变量和局部变量
&&&&&& 1.成员变量
&&&&&&&&&&&&&&在类中定义的变量,(Field),在整个类都可以访问(用于描述着一类事物的共有特征).
&&&&&&&&&&&&&&成员变量随着对象的建立而建立,存在于对象所在的堆内存中.
&&&&&&&&&&&&&&成员变量有默认初始值(0/false/null)
&&&&&& 2.局部变量
&&&&&&&&&&&&&&在方法/语句中定义的变量(Local Variable),
&&&&&&&&&&&&&&存在于栈内存中.
&&&&&&&&&&&&&&作用范围一结束,变量的空间会自动释放.
&&&&&&&&&&&&&&局部变量是没有初始值的.
&&&&&& 3.同名问题
&&&&&&&&&&&&&&在同一个作用域中成员变量不能重复, 局部变量也不能重复
&&&&&&&&&&&&&&但是成员变量和局部变量可以同名, 他们互相不冲突
&&& 4.访问问题
在局部变量和成员变量同名的时候, 如果直接用变量名访问一个变量, 那么是先找局部变量, 如果不存在才找成员变量
&&&&&&&&&&&&&&这时如果不想找局部变量, 直接找成员变量, 应该用&this.变量名&
11 this关键字
&&& 1.构造函数中
&&&&&&&&&&&&&&&this(参数)&形式可以在构造函数的第一条语句中调用其他的构造函数
&&&&&&&&&&&&&&&this.成员名&形式可以调用当前对象的成员
&&&&&2.普通函数中
&&&&&&&&&&&&&&this用在普通的函数中, 可以代表调用当前函数的对象
&&&&&&&&&&&&&&哪个对象调用this所在的函数,this就代表那个对象.
3.内部类中
&&&&&&&&&&&&&&可以使用 外部类名.this.成员 来访问外部类的成员.
12静态(static)变量
1.什么是静态变量
&&&&&&&&&&&&&&用static修饰的成员变量就是静态变量(随着类的加载而加载)
&&&&&&&&&&&&&&优先于所有非静态成员及成员代码块.
2.静态变量和普通变量有什么不同
&&&&&&&&&&&&&&静态变量在类加载后就初始化, 不用创建对象可以直接使用.
&&&&&&&&&&&&&&静态变量被类的所有对象共享(在共享区), 通过一个对象改变, 所有对象都改变.
静态变量可以使用&类名.变量名&形式访问, Java推荐使用这种方式, 而不是通过对象访问.
&&&&&& 3.类在什么时候加载
&&&&&&&&&&&&&&类在第一次使用的时候加载
&&&&&&&&&&&&&&例如:创建对象, 使用静态变量, 使用静态方法
&&&&&&&&&&&&&&定义变量的时候不加载类.
&&&&&& 4.静态变量在什么时候使用
&&&&&&&&&&&&&&在定义一个类的时候, 如果希望这个类的所有对象共享一个数据时, 就可以使用静态成员变量
[ 本帖最后由 xiao金刚 于
04:33 编辑 ]
搜索更多相关主题的帖子:
来 自:内蒙古
等 级:贵宾
威 望:17
帖 子:453
专家分:2351
这个有点困难 说的很经典 实践起来有点难度
马马虎虎 不吝赐教 我是路过蹭分滴
来 自:广东
等 级:论坛游民
帖 子:67
专家分:38
回复 2楼 zxd543
对照例子一下子可以看明了。这一篇主要概括的是一种面向对象的思想。让初学者不会认为面向对象很困难。理解的理想加上例子肯定可以掌握面向对象。
来 自:江苏
等 级:贵宾
威 望:24
帖 子:3442
专家分:19330
学 会看代码…学习写程序…学会搞开发…我的目标!呵呵是不是说大话啊!!一切皆可能 !
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
面向过程的程序设计中,程序员在解决一个问题的时候,需要建立问题空间(实际要解决的问题)到解空间(问题建模的地方,如计算机)的某种联系,当问题过于复杂的时候,建立这种联系是既费时又费力的,而且建立这种联系其实是编程之外的任务。所以,代码越写越多,一但出现问题就很难维护。
而面向对象使我们可以直接基于问题空间来建模,这样就无需建立与机器相关的联系,从而前进了一大步(当然完全脱离机器环境还是不可能的)。
对象就充当了问题空间里的元素,每个对象都提供服务,程序员需要做的就是要建立这些对象来提供服务,而这也是面向对象编程的难点,在于抽象出来对象的质量。而要设计出一些好的方案就需要经验了(这里和设计模式有很大的关联)。
My life is brilliant
来 自:广东
等 级:论坛游民
帖 子:67
专家分:38
回复 5楼 lz
java 拥有23设计模式,适合的设计模式可以让自己的代码更加优秀。斑竹。请问一位高级的程序员至少需要学会多少种设计模式呢?如果说23种都必须会。那么我想java高级程序员不是那么好当的吧。。高级程序员和低级程序员的区别在于哪里?是在于设计程序代码时的代码效率呢,还是处理异常的效率。&&一个标准的程序员在完成一个程序时所花的时间更多是在于哪部分。敲写代码的时间。还是处理程序异常的时间?如何做到一名可以高效率开发程序的程序员。请斑竹耐心解答。新手学java的困惑。
来 自:四川
等 级:贵宾
威 望:37
帖 子:2011
专家分:5959
回复 6楼 xiao金刚
1、在代码风格上面统一,要写出一种自己喜欢的风格并加以保持,但是现在很少有程序员做到了,当代码多的时候自然就乱了。(我一直比较关心这个)
2、算法。好的算法比用逻辑来做要强大得多。
3、设计模式。在使用别人的库或自己的库来建立程序的时候,怎样才能让耦合性最低?怎样才是高效的?以及安全性等等各种蛋疼的问题。要做好这个需要经验及分析能力。
写代码的时间和你改错误的时间是差不多的。所以好的设计才会让程序员更轻松。
其实很多东西要在实际中获得,代码写多了,自然就明白了。要多思考,并且掌握真正的面向对象会在设计上起到很大的帮助。这也是面向对象的主要目的。
[ 本帖最后由 lz 于
16:56 编辑 ]
My life is brilliant
等 级:新手上路
等 级:新手上路
版权所有,并保留所有权利。
Powered by , Processed in 0.748756 second(s), 7 queries.
Copyright&, BCCN.NET, All Rights Reserved

我要回帖

更多关于 java中成员变量 的文章

 

随机推荐