Rumah  >  Soal Jawab  >  teks badan

java中没有抽象方法的抽象类有什么意义?仅仅是为了让别人不能创建该类的对象?

怪我咯怪我咯2761 hari yang lalu706

membalas semua(6)saya akan balas

  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:47:59

    Tempat yang paling biasa digunakan adalah untuk melaksanakan kaedah templat (Kaedah Templat)?
    Sebagai contoh, anda ingin menulis sekumpulan proksi tempatan untuk perkhidmatan jauh. Untuk kumpulan ejen ini, langkah mendapatkan alamat permintaan, menghantar permintaan dan mendapatkan kandungan yang sepadan adalah perkara biasa. Hanya dua langkah untuk mentakrifkan jenis pengekodan aksara dan mentakrifkan panggilan balik respons adalah berbeza.

    Pada masa ini, anda boleh menentukan kelas abstrak dan melengkapkan proses permintaan. Perbezaannya diserahkan kepada subkelas sebenar untuk ditentukan. Bukannya pereka bentuk [tidak membenarkan] kelas abstrak dijadikan instantiated, tetapi sesetengah atribut tidak boleh ditentukan sebelum mengetahui ciri-ciri perkhidmatan jauh, menjadikan instantiasi mustahil.

    Contoh dalam JDK ialah java.io.InputStream. Kaedah baca(bait[], int, int)nya memanggil kaedah java.io.InputStream.read(). Read() ialah kaedah abstrak dan perlu ditakrifkan dalam subkelas. Anda boleh belajar daripada kod sumber.

     public abstract int read() throws IOException;
    
     public int read(byte b[], int off, int len) throws IOException {
        if (b == null) {
            throw new NullPointerException();
        } else if (off < 0 || len < 0 || len > b.length - off) {
            throw new IndexOutOfBoundsException();
        } else if (len == 0) {
            return 0;
        }
    
        int c = read();
        if (c == -1) {
            return -1;
        }
        b[off] = (byte)c;
    
        int i = 1;
        try {
            for (; i < len ; i++) {
                c = read();
                if (c == -1) {
                    break;
                }
                b[off + i] = (byte)c;
            }
        } catch (IOException ee) {
        }
        return i;
    }
    

    balas
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:47:59

    • Anda perlu melihat sama ada ia mewarisi mana-mana kelas atau melaksanakan sebarang antara muka

    • Kemungkinan besar beberapa kaedah kongsi diletakkan

    • Jika tidak, mengapa tidak menukarnya kepada antara muka

    balas
    0
  • ringa_lee

    ringa_lee2017-04-18 10:47:59

    Sesetengah kaedah awam dan medan contoh mungkin telah diekstrak.

    balas
    0
  • 迷茫

    迷茫2017-04-18 10:47:59

    Bukannya kelas abstrak tanpa kaedah abstrak mempunyai makna istimewa. Ini hanyalah makna biasa bagi kelas abstrak, Memandangkan pelaksanaan lalai, ia mungkin memerlukan kurang kod daripada melaksanakan antara muka secara langsung. Sebaliknya, apakah gunanya memerlukan kelas abstrak untuk mengekalkan satu atau dua kaedah abstrak?

    balas
    0
  • 天蓬老师

    天蓬老师2017-04-18 10:47:59

    Sebaliknya, untuk subkelas kelas ini mencipta kaedah tertentu . Sudah tentu, ini juga merupakan keperluan antara muka, tetapi antara muka memerlukan semua kaedah menjadi kaedah abstrak. Tetapi kelas abstrak boleh mentakrifkan beberapa kaedah yang tidak perlu ditindih oleh subkelas.

    Kelas dan antara muka abstrak semuanya untuk pengabstrakan. Saya tidak akan bercakap tentang faedah pengabstrakan. Contohnya, jika kami ingin melaksanakan antara muka atau kelas Equal, kami mentakrifkan dua kaedah equal dan unequal. Jika dilaksanakan menggunakan antara muka, kelas mesti melaksanakan kedua-dua kaedah ini. Walau bagaimanapun, jika dilaksanakan dengan kelas abstrak, unequal boleh dilaksanakan sebagai !equal dalam kelas abstrak, supaya unequal perlu dilaksanakan dalam subkelasnya.

    Secara peribadi, saya lebih suka kelas abstrak (tetapi Java tidak menyokong berbilang warisan). Contohnya, antara muka Compareable sebenarnya mempunyai keperluan, jika a<b && b < c maka a < c, tiada jaminan dalam antara muka bahawa ini betul. Sudah tentu, kelas abstrak tidak dapat menyelesaikan masalah, tetapi untuk Equal di atas, pelaksanaan kelas abstrak lebih sesuai dengan keperluan tambahan.

    balas
    0
  • PHP中文网

    PHP中文网2017-04-18 10:47:59

    Contoh:
    Berdasarkan: mvc musim bunga

    public abstract class BaseController {
        protected HttpServletRequest request;
        protected HttpServletResponse response;
        protected HttpSession session;
    
        @ModelAttribute
        public void setReqAndResp(HttpServletRequest request, HttpServletResponse response){
            this.request = request;
            this.response = response;
            this.session = request.getSession();
        }
        protected Map<String,String> getLoginUser(){
            Object loginUser = request.getAttribute(Config.LOGIN_USER);
            Map<String,String> loginUserMap = new HashMap<>();
            loginUserMap.put(Config.USER_CODE,loginUser==null?"":loginUser.toString());
            return loginUserMap;
                //return (User) session.getAttribute(Constants.LOGIN_USER);
        }
    }
    

    Sesi tindak balas permintaan atribut global biasa
    Kaedah biasa getLoginUser()
    Sudah tentu akan ada yang lain (beberapa atribut dan kaedah biasa).
    Memandangkan ada controller, service dao pun boleh guna.
    Saya biasanya mengekstrak beberapa kod tetapan semula ke dalam kelas induk untuk digunakan.

    balas
    0
  • Batalbalas