* 8:方法:abstract必须继承才能使用,static不能被覆盖,final不能被覆盖,所有不能同时作为修饰符
* 9:局部变量和成员变量,在同一个类中,不能有重名的成员变量,在同一方法中不能有重名的局部变量,但同一个类中多个不同方法,成员变量和局部变量可以重名(冲突)。
局部变量,要先赋值,在进行计算。而成员变量new出来就已经赋有初值值。
实现代码:
父类:
package ca.bx.staticextends; public class APClass { private String p1; private int p2; //有参构造方法 public APClass(String x,int y){ this.p1 = x; this.p2 = y; } //默认构造方法 public APClass(){ super(); } //成员变量(属于对象) private int a = 1; int b = 2; protected int c = 3; public int d = 4; public int f = 444; public static final int h = 555; //静态变量,类变量(属于类) public static int sa = 5; public static int sc; public static int sd; public static int sf; //静态块,初始化静态成员变量 static{ sc = 6; sd = 7; sf = 8; } //成员方法(属于对象) public int add(int x,int y){ return x + y; } //静态方法,类方法(属于类) public static int multiply(int x,int y){ return x * y; } //final修饰方法 public final int minus(int x,int y){ return x - y; } //省略对私有属性,访问接口,getter和setter方法 }子类继承父类:
package ca.bx.staticextends; public class SClass extends APClass{ private boolean p3; private String p4; //调用构造方法, //this和super不能同时使用 public SClass(boolean b,String s){ this();//相当于本类的public SClass()构造方法,也可以this(false,"ss");必须第一行 this.p3 = b; this.p4 = s; } //默认构造方法 public SClass(){ super("ss", 1);//调用父类的public APClass(String x,int y)构造方法;必须第一行 } //成员变量(属于对象) private int a = 11; int b = 22; protected int c = 33; public int d = 44; //静态变量,类变量(属于类) public static int sa = 55; public static int sc; public static int sd; //静态块,初始化静态成员变量 static{ sc = 66; sd = 77; } //成员方法(属于对象) public int add(int x,int y){ return x + y+8; } //静态方法,类方法(属于类) public static int multiply(int x,int y){ return x * y *2; } //Error:不能覆盖final方法,故报错 // public final int minus(int x,int y){ // return x - y; // } //super调用父类的成员 public void apcPrint(){ System.out.println("父类b属性:"+super.b+",父类add方法:"+super.add(4, 9)); } //this局部变量和成员变量,优先级前者高 public void scPrint(){ int b = 200; System.out.println("变量(局部)b:"+b+",成员变量b:"+this.b); } }
package ca.bx.staticextends; public class TestX { public static void main(String[] args) { SClass sc = new SClass(); APClass apc = new SClass(); int x = 2; int y = 3; System.out.println("调用方法:"); System.out.println(apc.add(x, y));//2 + 3 + 8 //成员方法被覆盖,多态 System.out.println(apc.multiply(x, y));//2 * 3 //静态方法未被覆盖(静态),无多态 *APClass.multiply(x, y) //用final保证用户调用时动作的一致性,可以防止子类覆盖情况的发生 System.out.println(sc.minus(x, y)); System.out.println(apc.minus(x, y)); sc.apcPrint(); sc.scPrint(); System.out.println("子类对象调用属性1:"); //父类访问修饰符对子类可见,子类才可以继承(*方法也类似*) //a属性,为private,本来可见,子类不可见,不继承 //b属性不在同包下,不可见,不继承 System.out.println(sc.b); System.out.println(sc.c); System.out.println(sc.d); System.out.println(sc.f); System.out.println(sc.sa); System.out.println(sc.sc); System.out.println(sc.sd); System.out.println(sc.sf); System.out.println(sc.h); System.out.println("父类对象调用属性1:"); System.out.println(apc.b); System.out.println(apc.c); System.out.println(apc.d); System.out.println(apc.f); System.out.println(apc.sa); System.out.println(apc.sc); System.out.println(apc.sd); System.out.println(apc.sf); System.out.println(apc.h); //***可见类的成员变量,可继承,但不可被子类覆盖 } }输出结果:
调用方法:
13
6
-1
-1
父类b属性:2,父类add方法:13
变量(局部)b:200,成员变量b:22
子类对象调用属性1:
22
33
44
444
55
66
77
8
555
父类对象调用属性1:
2
3
4
444
5
6
7
8
555