A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© djx900 黑马帝   /  2012-3-20 23:04  /  2790 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 djx900 于 2012-3-21 00:05 编辑

class Res
{
        private String name;      
        private String sex;
        private boolean flag = false;

        public synchronized void set(String name,String sex)
        {
                if(flag)
                        try{this.wait();}catch(Exception e){}
                this.name = name;
               
                this.sex = sex;
                flag = true;
                this.notify();
        }
        public synchronized void out()
        {
                if(!flag)
                        try{this.wait();}catch(Exception e){}
                System.out.println(name+"........"+sex);
                flag = false;
                this.notify();
        }
}

class Input implements Runnable

{
        private Res r ;                  
        Input(Res r)
        {
                this.r = r;
        }
        public void run()
        {
                int x = 0;
                while(true)
                {
                        if(x==0)                               
                                r.set("mike","man");                               
                        else       
                                r.set("丽丽","女女女女女");                               
                        x = (x+1)%2;
                }
        }
}

class Output implements Runnable
{
        private Res r ;        //这还有
       
        Output(Res r)
        {
                this.r = r;
        }
        public void run()
        {
                while(true)
                {
                        r.out();
                }
        }
}


class  InputOutputDemo2
{
        public static void main(String[] args)
        {
                Res r = new Res();

                new Thread(new Input(r)).start();
                new Thread(new Output(r)).start();
                /*
                Input in = new Input(r);
                Output out = new Output(r);

                Thread t1 = new Thread(in);
                Thread t2 = new Thread(out);

                t1.start();
                t2.start();
                */
        }
}


Res类中变量私有了 但是没有构造函数 ,外部类也能实例化  实例化之后变量也能访问了

        private Res r ;        //这还有
       
        Output(Res r)
        {
                this.r = r;
        }

这里的 构造函数接受了参数的  这里有点迷糊 请高手指点下

顺便讲下 对单例的类 是如何访问的

3 个回复

倒序浏览
类Res的属性是私有的,但该类自己的方法可以访问, private Res r ;此处r代表一个Res类型的类变量,可以创建一个Res的实例对象,然后把对象的地址付给r;就可以通过引用对象r调用 Res中的方法,并访问Res的私有成员变量,

评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
class Output implements Runnable
{
        private Res r ;        //这还有
        
        Output(Res r)
        {
                this.r = r;
        }
        public void run()
        {
                while(true)
                {
                        r.out();
                }
        }
}
传进来的是对象的在堆中的地址,把这个地址赋给Output 类中的r。这就相当于在Output 类中有了一个
Res 类型的对象。这样就可以访问这个对象的变量和方法了。
访问时和正常的访问方式一样没什么区别,例如:如果你要访问的类里的成员变量被private修饰,那么那个类里边得有对外提供访问的public 类型 get变量名()的方法吧。
回复 使用道具 举报
1,关于默认构造函数:不是没有构造函数,是有默认的构造函数,所以没有自定义构造函数的每个类也都能创建对象;
2,关于private修饰:因为创建了对象,所以也能访问,因为是本类对象自我访问;
3,关于对单例类的访问:单例设计模式,有构造函数,但被私有化,(外界对象无法建立给类对象),外界对象可以通过静态调用获取对象,拿到了对象,就可以通过对象访问该对象的所有属性和功能;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马