// Animal.java
public class Animal {
public String name = "小小";
public int age = 3;
public void sleep(){
System.out.println(name+"正在睡觉");
}
}
// Dog.java
public class Dog extends Animal{
public void bark(){
System.out.println(name+"在汪汪叫");
}
}
// Test.java
public class Test {
public static void main(String[] args) {
Dog dog = new Dog();
System.out.println("小狗叫"+dog.name);
dog.sleep();
dog.bark();
}
}
//父类
public class Dad {
public int a = 10;
}
//子类
public class Child extends Dad{
public int a = 20;
{
System.out.println("在代码块中输出a:"+ this.a);
}
public void printa(){
System.out.println("使用成员方法输出a:"+ this.a);
}
}
//测试类
public class Test {
public static void main(String[] args) {
Child child = new Child();
//访问的是父类的a还是子类的a?
System.out.println("通过子类对象访问a:"+child.a);
child.printa();
}
}
结果都是20,而不是父类的10,说明访问的是子类的a。
继承类中的成员变量访问规则:子类优先,父类其次。
子类无,父类无:报错。
子类有,父类无:访问子类的成员变量。
子类无,父类有 :访问父类的成员变量。(向上寻找)
子类有,父类有 [重名] :优先访问子类的成员变量。
2.2 成员方法
cpp复制代码
//父类
public class Dad {
public void A(){
System.out.println("Dad中的方法A()");
}
public void B(){
System.out.println("Dad中的方法B()");
}
}
//子类
public class Child extends Dad{
public void A(int a) {
System.out.println("Child中的方法A(int)");
}
public void B(){
System.out.println("Child中的方法B()");
}
public void method(){
A(); // 没有传参,访问父类中的A()
A(20); // 传递int参数,访问子类中的A(int)
B(); // 直接访问,则永远访问到的都是子类中的B(),父类的无法访问到
}
}
//测试类
public class Test {
public static void main(String[] args) {
Child child = new Child();
child.method();
}
}
由这个例子我们可以总结出访问子类的成员方法的规则。
继承类中的成员方法访问规则:子类优先,父类其次;重载看参数,重写用子类。
子类无,父类无:报错。
子类有,父类无:访问子类方法。
子类无,父类有 :访问父类方法。(向上寻找)
子类有,父类有 [重名] :
a. 参数列表不同(构成方法重载):根据输入的参数来决定使用哪一个方法。
b. 参数列表相同(构成方法重写):优先使用子类的方法。
父类
public class Dad {
public int a = 10;
public void A(){
System.out.println("Dad中的方法A()");
}
}
子类
public class Child extends Dad{
public int a = 20;
public void A() {
System.out.println("Child中的方法A()");
}
public void field(){
System.out.println(a); //子类的变量a
System.out.println(super.a); //父类的变量a
}
public void method(){
A(); //子类的方法A
super.A(); //父类的方法A
}
}
测试
public class Test {
public static void main(String[] args) {
Child child = new Child();
child.field();
child.method();
}
}
class Person {
public String name;
public int age;
//构造方法
public Person(String name, int age) {
this.name = name;
this.age = age;
System.out.println("构造方法执行");
}
//实例代码块
{
System.out.println("实例代码块执行");
}
//静态代码块
static {
System.out.println("静态代码块执行");
}
}
public class Test {
public static void main(String[] args) {
System.out.println("第一次:");
Person person1 = new Person("小明",10);//第一次触发类加载和静态代码块
System.out.println("============================");
System.out.println("第二次:");
Person person2 = new Person("大明",20);//第二次无类加载,不再执行静态代码块的内容
}
}