Tôi vào giải quyết một số câu đố Java và vấp vào một này:JDK 1.7 vs JDK 1.6 lớp bên chênh lệch thừa kế
public class Outer {
class Inner1 extends Outer {}
class Inner2 extends Inner1 {}
}
Trong khi biên dịch mã này với javac 1.6.0_45
tôi nhận được, như mong đợi, lỗi này:
Outer.java:8: cannot reference this before supertype constructor has been called
class Inner2 extends Inner1 {}
^
Điều này là do các trình biên dịch tạo ra constructor mặc định cho Inner2
lớp với mã tương tự, điều này giải thích lỗi trên:
Inner2() {
this.super();
}
Và nó rõ ràng bây giờ, bởi vì bạn thực sự không thể làm điều này trong Java 1.6.0_45, JLS 8.8.7.1 (như tôi có thể đoán):
An explicit constructor invocation statement in a constructor body may not refer to any instance variables or instance methods declared in this class or any superclass, or use this or super in any expression; otherwise, a compile-time error occurs.
See (accepted answer trong Odd situation for "cannot reference this before supertype constructor has been called")
Nhưng nếu tôi cố gắng biên dịch nó với javac 1.7.0_79
- OK!
Và đây là câu hỏi - Điều gì đã được thay đổi trong Java 1.7, mã này hiện đã chính xác chưa?
Cảm ơn trước!
@EJP bạn đã kiểm tra [câu trả lời được chấp nhận] (http://stackoverflow.com/a/3383555/365237) của cái đó, vì cái đó có vẻ có liên quan – eis
@EJP, cũng, 'this.super() 'is ** not ** tương đương với' super() '. Nếu bạn cố gắng làm điều này trong lớp không lồng bên trong, bạn sẽ gặp phải lỗi biên dịch, trước khi [JLS1.6 8.8.7.1]. 'Nếu S không phải là một lớp bên trong, hoặc nếu khai báo của S xảy ra trong một bối cảnh tĩnh, không có trường hợp bao bọc ngay lập tức của i đối với S tồn tại. Lỗi compiletime xảy ra nếu lời gọi hàm tạo của lớp bậc trên là một lời gọi hàm tạo của lớp bậc trên đủ điều kiện.' Tương tự như [JLS1.7 8.8.7.1]. – ar4ers