জাভাতে স্ট্যাটিক ভেরিয়েবল ব্যবহার

আমি জানতাম যে স্ট্যাটিক ভেরিয়েবল তৈরি করা হয় এবং শুধুমাত্র একবারের জন্য ইনিশিয়ালাইজ করা হয়। যখন ক্লাসটি লোড করা হয় এবং প্রতি বস্তুর প্রতি নয়।

নীচের কোডে যা আমি করতে চেষ্টা করছি তা হল: আমি একটি এন্ট্রি ভ্যারিয়েবল "a" এটিকে স্ট্যাটিক হিসাবে ক্লাস এ রূপে ঘোষণা করেছি এবং এটি 5 এর মান নির্ধারণ করেছি। যখন প্রধান চালানো হয় আমি তার মানটি 6 এর মধ্যে পরিবর্তন করে প্রোগ্রামটি তৈরি করেছি লুপ অসীমভাবে। তাই বর্তমানে "a" মান হল 6।

এখন আমি যা করতে চেষ্টা করেছি তা হল আমি অন্য বর্গ বর্গের এই ভ্যারিয়েবলটি অ্যাক্সেস করার চেষ্টা করেছি যখন বর্গ এটি এখনও লুপিং এবং আমি আশা করি 6 বিট প্রিন্ট করা উচিত যখন আমি ক্লাস B দাড়িয়েছি (কারণ আমি ক্লাস B "a" মান দাড়িয়েছি পরিবর্তিত 6) কিন্তু বিস্ময়করভাবে এটি এখনও আমাকে দিয়েছে 5।

কেন এই ঘটছে যদিও আমি ঘোষণা "একটি" হিসাবে স্ট্যাটিক? এই পদ্ধতির সাথে কি কি ত্রুটি খুঁজে বের করতে অক্ষম

class A{
    static int a=5;

    public static void main(String args[]){
        System.out.println(A.a+"");
        a=6;
        while(true){
        }
    }
}

class B{    
    public static void main(String args[]){
        System.out.println(A.a+"");
    }
}
2
যোগ সম্পাদিত
মতামত: 1
আপনি এমেইন এবং B.Main এর মাধ্যমে দুটি পৃথক প্রোগ্রাম চালাচ্ছেন। আপনি কি দেখতে চান তা প্রদর্শন করতে একই প্রক্রিয়ার মধ্যে থ্রেডগুলি ব্যবহার করতে হবে।
যোগ লেখক Steve Townsend, উৎস
বা ভাল - একটি স্ট্যাটিক প্রাথমিক ব্লক
যোগ লেখক Hovercraft Full Of Eels, উৎস
আমি থ্রেড প্রয়োজন মনে করি না। বি। `পাবিক স্ট্যাটিক অকার্যকর প্রধান (স্ট্রিং [] আর্গুম) {A। প্রধান (আর্গুম); পদ্ধতি . আউট println (এ। a + ""); }
যোগ লেখক emory, উৎস

4 উত্তর

আপনি যে সমস্যাটি করছেন তা হল যে আপনি দুটি ভিন্ন JVM প্রসেস চলছে। আপনার কি করা উচিত তার নিজস্ব থ্রেড আপনার "প্রধান" পদ্ধতি প্রতিটি চলমান করা উচিত। এই ভাবে তারা ভাগ (এবং তাই পরিবর্তন করতে পারেন) একই মেমরি। থ্রেড ব্যবহার করার জন্য এখানে আপনার উদাহরণ সংশোধন করা হয়েছে:

public class Main{
    public static int v = 5;

    public static void main(String[] args) throws Exception{
        new Thread(new A()).start();
        Thread.sleep(5000);
        new Thread(new B()).start();
    }
}

class A implements Runnable{
    public void run(){
        System.out.println(Main.v);
        Main.v = 6;
    }
}

class B implements Runnable{
    public void run(){
        System.out.println(Main.v);
    }
}

সাইড নোট: এই উদাহরণটি যখন প্রশ্ন থেকে প্রত্যাশিত হয় তা প্রদর্শন করে, তবে অনেকগুলি থ্রেড ব্যবহার করে এমন একটি সঠিক জাভা প্রোগ্রাম লেখার ক্ষেত্রে অনেকগুলি ভুল আছে। আপনার reasearch কি

4
যোগ
ঠিক আছে আমি বিভিন্ন প্রোগ্রামে দুটি প্রোগ্রাম লোড করার চেষ্টা করেছি ভুল যে। ধন্যবাদ!
যোগ লেখক user1406427, উৎস

আপনি সত্যিই এ প্রধান লুপ সঞ্চালন না।

শুধু মান পরিবর্তন করার জন্য একটি পদ্ধতি তৈরি করুন।

0
যোগ
কোথায় আপনি প্রথম "এ" চালানো? আপনি কি চান চান পেতে, আপনি একই ক্লাসে যারা দুটি চালানো হবে। তারা এখনও দুটি আলাদা বস্তু, একে অপরের সাথে কিছুই করার নেই। তাই আপনি শুধু ভেরিয়েবল অ্যাক্সেস করছেন, আপনি এটি সঙ্গে এটি অ্যাক্সেস করার আগে এটি সত্যিই পরিবর্তন না।
যোগ লেখক OmniOwl, উৎস
আমি ক্লাস প্রথম দৌড়ে তাই "একটি" মান পরিবর্তন করা উচিত 6 এর পরে, একটি সময় যখন লুপ মধ্যে আঘাত করা হয় আমি বর্গ বি "এ" অ্যাক্সেস করার চেষ্টা করেছি উত্তর হিসাবে 5 পেয়েছিলাম।
যোগ লেখক user1406427, উৎস
ঠিক আছে আমি বিভিন্ন প্রোগ্রামে দুটি প্রোগ্রাম লোড করার চেষ্টা করেছি ভুল যে। ধন্যবাদ!
যোগ লেখক user1406427, উৎস

কারণ এটির প্রধান পদ্ধতিটি কখনও চালু করা হয় না।

0
যোগ

আপনার দুটি জাভা প্রক্রিয়া এবং দুটি প্রোগ্রাম চলছে। দ্বিতীয় ক্লাসলোডার শ্রেণী A লোড করে এবং তার স্ট্যাটিক ভ্যারিয়েবলটি 5 সেট করে তবে Class A এ সংজ্ঞায়িত করা স্ট্যাটিক মেইন() পদ্ধতি চালু করার জন্য class B এ কোন কল নেই </কোড> যেটি 6 এ বাড়ায়

0
যোগ
ঠিক আছে আমি বিভিন্ন প্রোগ্রামে দুটি প্রোগ্রাম লোড করার চেষ্টা করেছি ভুল যে। ধন্যবাদ!
যোগ লেখক user1406427, উৎস