1.多态
(1)成员变量,编译看父类,运行看父类
(2)成员方法,编译看父类,运行看子类
public class Test {
public static void main(String[] args) {
Fu f = new Zi();
System.out.println(f.a);
f.show();
}
}
class Fu{
int a=10;
public void show(){
System.out.println("父");
}
}
class Zi extends Fu{
int a=20;
public void show(){
System.out.println("子");
}
}
打印:
10
子
2.内部类
(1)在内部类中访问外部类的成员变量 外部类名.this.变量名
public class Test {
public static void main(String[] args) {
new Fu().new Inside().show();
}
}
class Fu{
int a=10;
public void show(){
System.out.println("父");
}
class Inside{
int a=20;
public void show(){
System.out.println(Fu.this.a);
}
}
}
打印
10
(2)匿名内部类中访问了外部变量,外部变量会被final修饰,不能被修改
例如:
public class Test {
public static void main(String[] args) {
int a=10;
a=20;
new AA() {
@Override
public void show() {
System.out.println(a);//会报错
}
}.show();
}
}
interface AA{
void show();
}
在上述代码中 new AA(){}创建了一个匿名内部类对象,同时访问了外部变量a,故a的值不能被修改,但是a被赋值了两次,故会报错。
补充:如果a使成员变量是不会报错的,局部变量才会报错,代码如下:
public class Test {
static int a;
public static void main(String[] args) {
a=20;
new AA() {
@Override
public void show() {
System.out.println(a);//不会报错
}
}.show();
}
}
interface AA{
void show();
}```