1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
|
/*
* @test /nodynamiccopyright/
* @bug 8325805
* @summary Permit non-superclass instance field assignments before this/super in constructors
* @compile/fail/ref=EarlyAssignments.out -XDrawDiagnostics EarlyAssignments.java
*/
public class EarlyAssignments {
public static class Inner1 {
public int x;
public Inner1() {
x = 123; // OK - "x" belongs to this class
this.x = 123; // OK - "x" belongs to this class
Inner1.this.x = 123; // OK - "x" belongs to this class
super();
}
public Inner1(int y) {
y = x; // FAIL - early 'this' reference
y = this.x; // FAIL - early 'this' reference
y = Inner1.this.x; // FAIL - early 'this' reference
super();
}
public class Inner1a extends Inner1 {
public int z;
public Inner1a(byte value) {
Inner1.this.x = value; // OK - "x" belongs to outer class
z = super.x; // FAIL - "x" belongs to superclass
z = x; // FAIL - "x" belongs to superclass
this.z = x; // FAIL - "x" belongs to superclass
Inner1a.this.z = x; // FAIL - "x" belongs to superclass
Object o1 = Inner1.this; // OK - Inner1 is an outer class
Object o2 = Inner1a.this; // FAIL - Inner1a is this class
super();
}
public Inner1a(short value) {
x = value; // FAIL - "x" belongs to superclass
super();
}
public Inner1a(char value) {
this.x = value; // FAIL - "x" belongs to superclass
super();
}
public Inner1a(int value) {
super.x = value; // FAIL - "x" belongs to superclass
super();
}
}
public class Inner1b {
public Inner1b(int value) {
Inner1.this.x = value; // OK - "x" belongs to outer class
super();
}
}
}
public static class Inner2 extends Inner1 {
int y;
public Inner2(int value) {
y = value; // OK - "y" belongs to this class
this.y = value; // OK - "y" belongs to this class
x = value; // FAIL - "x" belongs to superclass
this.x = value; // FAIL - "x" belongs to superclass
Object o1 = this; // FAIL - can't acces 'this' yet
Object o2 = Inner2.this; // FAIL - can't acces 'this' yet
super();
}
}
public static class Inner3 {
public int e;
public class Inner3a {
public static int x;
public Inner3a(int val) {
x = val; // OK - "x" is a static field
val = x; // OK - "x" is a static field
e = val; // OK - "e" belongs to outer class
val = e; // OK - "e" belongs to outer class
Inner3.this.e = val; // OK - "e" belongs to outer class
super();
}
}
}
public static class Inner4 {
public int x;
public Inner4() {
x = 0; // OK
x = x + 1; // FAIL - illegal early access
super();
}
public Inner4(int a) {
this.x = 0; // OK
this.x = this.x + 1; // FAIL - illegal early access
super();
}
public Inner4(char a) {
Inner4.this.x = 0; // OK
Inner4.this.x = Inner4.this.x + 1; // FAIL - illegal early access
super();
}
}
public static class Inner5 extends Inner4 {
public int y;
public Inner5() {
y = x + 1; // FAIL - illegal early access
super();
}
public Inner5(int a) {
this.y = x + 1; // FAIL - illegal early access
super();
}
public Inner5(char a) {
Inner5.this.y = x + 1; // FAIL - illegal early access
super();
}
public Inner5(short a) {
y = super.x + 1; // FAIL - illegal early access
super();
}
public Inner5(float a) {
y = Inner5.this.x + 1; // FAIL - illegal early access
super();
}
}
public static class Inner6 {
public int x = 1;
public Inner6() {
x = 2; // FAIL - illegal early access
super();
}
}
public static class Inner7 {
public final int x = 1;
public Inner7() {
x = 2; // FAIL - illegal early access
super();
}
}
public static class Inner8 {
class Inner8a {
int x;
}
public Inner8() {
this.new Inner8a().x = 1; // FAIL - illegal early access
super();
}
}
}
|