Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 10 của 10
  1. #1

    thắc mắc về hàm truyền tham biến trong java

    mình có thử ví dụ vs 5 Class A B C D G như sau:
    Mã:
    public class A {
        public void show(){
            System.out.println("A");
        }
    }
    Mã:
    public class B extends A{
        public void show(){
            System.out.println("B");
    
        }
    }
    Mã:
    public class C {
        public A obj;
        public A x;
        public C(){
            x=new A();
            obj= new B();
        }
    }
    Mã:
    public class D extends C{
        public D(){
            x= new B();
            obj=new A();
        }
    }
    Mã:
    public class G {
       public static void get(C objC){
           objC=new D();
       }
    }
    mình chạy 1 đoạn code sau:

    Mã:
    public class Program {
        public static void main(String[] args){
            C y=new C();
            G.get(y);
            y.x.show();
            y.obj.show();
            
        }
    }
    mong muốn là nó sẽ in ra B,A (gọi phuơng thức show() lần lượt của B và A) nhưng thực tế lại in ra là A,B
    Tức là đoạn lệnh
    Mã:
    G.get(y);
    không có tác dụng,xin mọi người giải đáp dùm

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Truyền tham số vào phương thức nó sẽ tạo một con trỏ (tham chiếu) của phương thức trỏ vào đối tượng cần tham chiếu. Nên khi thay đổi giá trị của tham số ở con trỏ tại phương thức thì không làm thay đổi giá trị của con trỏ gốc.
    http://www.javaworld.com/javaqa/2000...0526-pass.html
    http://stackoverflow.com/questions/4...s-by-reference
    http://www.programmerinterview.com/i...e-or-by-value/

    Nói ngắn gọn thì khi truyền tham số nó sẽ truyền "bản sao" chứ không truyền "bản gốc", nên khi thay đổi "bản sao", "bản gốc" vẫn còn nguyên.

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    nhưng theo mình hiểu thì truyền đầu vào là những kiểu nguyên thủy thì mới là truyền tham trị và không ảnh hướng đến tham số gốc,còn ở đây hàm G là truyền vào một đối tượng nên mình nghĩ nó là tham chiếu và có thay đổi chứ?
    nếu hàm G như trên ko đúng thì cụ thể phải viết thế nào để nó thay đổi đc?

    p/s:

    Nói ngắn gọn thì khi truyền tham số nó sẽ truyền "bản sao" chứ không truyền "bản gốc", nên khi thay đổi "bản sao", "bản gốc" vẫn còn nguyên.
    mình đã thử sửa phuơng thức get của G thành
    public class G {
    public static void get(C objC){
    objC.x=new B();
    }
    }
    lúc này thì in ra B,B,tức là đã có thay đổi của x trong "bản gốc" rồi mà

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    ai làm ơn giúp mình chút,mình đang cần hiểu rõ để làm bài tập

  5. #5
    Ngày tham gia
    Feb 2014
    Bài viết
    0
    Bạn nên học cách đặt tên trước khi muốn làm cái gì với Java.
    Code của bạn gây khó khăn cho người đọc.

  6. #6
    Trích dẫn Gửi bởi Wazi Armstrong
    Bạn nên học cách đặt tên trước khi muốn làm cái gì với Java.
    Code của bạn gây khó khăn cho người đọc.
    mới học oop nên còn nhiều thiếu sót,mà mình thấy cách đặt tên cũng đâu sai nhỉ

  7. #7
    Ngày tham gia
    Sep 2015
    Đang ở
    Hà Nội
    Bài viết
    0
    Trích dẫn Gửi bởi vandt
    mình đã thử sửa phuơng thức get của G thành
    public class G {
    public static void get(C objC){
    objC.x=new B();
    }
    }
    lúc này thì in ra B,B,tức là đã có thay đổi của x trong "bản gốc" rồi mà
    Đấy vấn đề đã được giải quyết như thế, thay vì bạn gọi new D(); thì bạn chỉ gán lại 2 trường của objC thì nó ra đúng ý bạn.

    Để hiểu được nó thì bạn nên hiểu ngược về các ngôn ngữ bậc thấp.
    Cách lưu trữ dữ liệu, các con trỏ, đối tượng/cấu trúc của đối tượng.

    Các đối tượng thực sự thì nó bao gồm các con trỏ trỏ đến các đối tượng/giá trị nguyên thủy khác.
    Xem 3 liên kết mà mình đưa. Có mấy cái hình minh họa dễ hiểu đấy.

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi SITUVNX
    Đấy vấn đề đã được giải quyết như thế, thay vì bạn gọi new D(); thì bạn chỉ gán lại 2 trường của objC thì nó ra đúng ý bạn.

    Để hiểu được nó thì bạn nên hiểu ngược về các ngôn ngữ bậc thấp.
    Cách lưu trữ dữ liệu, các con trỏ, đối tượng/cấu trúc của đối tượng.

    Các đối tượng thực sự thì nó bao gồm các con trỏ trỏ đến các đối tượng/giá trị nguyên thủy khác.
    Xem 3 liên kết mà mình đưa. Có mấy cái hình minh họa dễ hiểu đấy.
    còn 1 phương án nữa là khai báo x và obj trong class C dưới dạng static thì sẽ có thay đổi khi gọi hàm get của G,đúng là có nhiều cái vẫn chưa rõ ràng để cố đọc dần vậy

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Tĩnh (static) có nghĩa là địa chỉ con trỏ đó cố định từ khi ứng dụng chạy.
    Cách bạn vừa nói là cách đầu mà mình làm để giải quyết vấn đề B trước A của bạn.

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi vandt
    mới học oop nên còn nhiều thiếu sót,mà mình thấy cách đặt tên cũng đâu sai nhỉ
    Không sai. Chỉ là vô nghĩa thôi.

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •