//Dog.java
public class Dog {
String name;
int age;
float weight;
public void eat(){
System.out.println(name+"正在吃饭");
}
public void sleep(){
System.out.println(name+"正在睡觉");
}
void bark(){
System.out.println(name+"汪汪汪~~~");
}
}
//Cat.java
public class Cat {
String name;
int age;
float weight;
public void eat(){
System.out.println(name+"正在吃饭");
}
public void sleep(){
System.out.println(name+"正在睡觉");
}
void mew(){
System.out.println("喵喵喵~~~");
}
}
//Animal.java
public class Animal {
String name;
int age;
public void eat(){
System.out.println(name+"正在吃饭");
}
public void sleep(){
System.out.println(name+"正在睡觉");
}
}
//Dog.java
public class Dog extends Animal{
void bark(){
System.out.println(name+"汪汪汪~~~");
}
}
//Cat.java
public class Cat extends Animal{
void mew(){
System.out.println(name+"喵喵喵~~~");
}
}
public class TestExtend {
public static void main(String[] args) {
Dog dog = new Dog();
//dog类中并没有定义任何成员变量,
//name和age属性是从父类属性Animal中继承下来的
System.out.println(dog.name);
System.out.println(dog.age);
//dog访问的eat()和sleep()方法也是从Animal中继承下来的
dog.eat();
dog.sleep();
dog.bark();
}
}
注意:
子类会将父类中的成员变量或者成员方法继承到子类中。
子类继承父类之后,必须要新添加自己特有的成员,体现出与基类的不同,否则就没有必要继承了。
4.父类成员访问
在继承体系中,子类将父类中的方法和字段继承下来了,那在子类中是否能直接访问父类中继承下来的成员呢?
4.1子类和父类不存在同名成员变量
1.子类和父类不存在同名成员变量
public class Base { //父类
int a;
int b;
}
public class Derived extends Base{ //子类
int c;
public void method(){
a = 10; //访问从父类中继承下来的a
b = 20; //访问从父类中继承下来的b
c = 30; //访问子类自己的c
}
}
2.子类和父类成员变量同名
public class Base {
int a;
int b;
int c;
}
public class Derived extends Base{
int a; //与父类中成员a同名,且类型相同
int b; //与父类中成员b同名,且类型相同
public void method(){
a = 100; //访问父类继承的a,还是子类自己新增的a?
b = 101; //访问父类继承的b,还是子类自己新增的b?
c = 102; //子类没有c,访问的肯定是从父类继承下来的c
//d = 103; //编译失败,因为父类和子类都没有定义成员变量b
}
}
在子类方法中或者通过子类对象访问成员时:
如果访问的成员变量子类中有,优先访问自己的成员变量。
如果访问的成员变量子类中无,则访问父类继承下来的,如果父类也没有定义,则编译报错。
如果访问的成员变量与父类中成员变量同名,则优先访问自己的。
成员变量访问遵循就近原则,自己有优先自己的,如果没有则向父类中找。
4.2子类中访问父类的成员方法
1.成员方法名字不同
public class Base {
public void methodA(){
System.out.println("Base中的methodA()方法");
}
}
public class Derived extends Base{
public void methodB(){
System.out.println("Derived中的methodB()方法");
}
public void methodC(){
methodB(); //访问子类自己的methodB()
methodA(); //访问父类继承的methodA()
//methodD(); //编译失败,在整个继承体系中没有发现方法methodD()
}
}
public class Base {
int a;
int b;
public void methodA(){
System.out.println("Base中的methodA()方法");
}
public void methodB(){
System.out.println("Base中的methodB()方法");
}
}
public class Derived extends Base{
int a; //与父类中成员变量同名且类型相同
int b; //与父类中成员变量同名但类型不同
//与父类中methodA()构成重载
public void methodA(int a){
System.out.println("Derived中的methodA()方法");
}
//与父类中的methodB()构成重写
public void methodB(){
System.out.println("Derived中的methodB()方法");
}
public void methodC(){
//对于同名的成员变量,直接访问时,访问的都是子类
a = 100; //等价于this.a = 100;
b = 101; //等价于this.b = 101;
//注意:this是当前对象的引用
//访问父类成员变量时,需要借助super关键字
//super是获取到子类对象中从父类继承下来的部分
super.a = 200;
super.a = 201;
//父类和子类中构成重载的方法,
//直接可以通过参数列表区分清访问父类还是子类
methodA(); //没有传参,访问父类的methodA
methodA(20); //传递int参数,访问子类的methodA(int)
//如果在子类中要访问重写的基类方法,则需要借助super关键字
methodB(); //直接访问,永远访问到的都是子类中的methodB()
super.methodB();//访问父类中的methodB()
}
}
在子类方法中,如果想要明确访问父类中的成员时,借助super关键字即可。
【注意事项】:
只能在非静态方法中使用,在静态方法中this和super都不能使用。
在子类方法中,访问父类的成员变量和方法。
6.子类构造方法
先有父再有子,即:子类对象构造时,需要先调用父类构造方法,然后再执行子类的构造方法。
public class Base {
public Base(){
System.out.println("Base()");
}
}
public class Derived extends Base {
public Derived() {
//super(); //注意子类构造方法中会默认调用基类的无参构造方法:super()
//用户没有写时,编译器会自动添加,而且super()必须是子类构造方法中的第一条语句,
//并且只能出现一次
System.out.println("Derived()");
}
}
public class Test{
public static void main(String[] args) {
Derived d = new Derived();
}
}
结果打印:
Base()
Derived()
public 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 static void main(String[] args) {
Person person1 = new Person("haha",10);
System.out.println("============================");
Person person2 = new Person("wawa",18);
}
}
//执行结果:
静态代码块执行
示例代码块执行
构造方法执行
============================
示例代码块执行
构造方法执行
静态代码块先执行,并且只执行一次,在类加载阶段执行。
当有对象创建时,才会执行示例代码块,示例代码块执行完成后,最后构造方法执行。
【继承关系上的执行顺序】
class Person{
public String name;
public int age;
public Person(String name, int age){
this.name = name;
this.age = age;
System.out.println("Person:构造方法执行");
}
{
System.out.println("Person:示例代码块执行");
}
static{
System.out.println("Person:静态代码块执行");
}
}
class Student extends Person{
public Student(String name, int age){
super(name,age);
System.out.println("Student:构造方法执行");
}
{
System.out.println("Student:实例代码块执行");
}
static{
System.out.println("Student:静态代码块执行");
}
public static void main(String[] args) {
Student stu1 = new Student("张三",18);
System.out.println("=============================");
Student stu2 = new Student("李四",19);
}
}
//运行结果:
Person:静态代码块执行
Student:静态代码块执行
Person:示例代码块执行
Person:构造方法执行
Student:实例代码块执行
Student:构造方法执行
=============================
Person:示例代码块执行
Person:构造方法执行
Student:实例代码块执行
Student:构造方法执行
package extend01; //extend01包中
//为了演示基类中不同访问权限在子类中的可见性,
//为了简单,类B中就不设置成员方法了
public class B {
private int a;
protected int b;
public int c;
int d;
}
package extend01; //extend01包中
//同一个包中的子类
public class D extends B{
public void method(){
//super.a = 10; //编译报错,父类private成员在相同包子类中不可见
super.b = 20; //父类中protected成员在相同包子类中可以直接访问
super.c = 30; //父类中public成员在相同包子类中可以直接访问
super.d = 40; //父类中默认访问权限修饰的成员在相同包子类中可以直接访问
}
}
package extend02; //extend02包中
import extend01.B; //引用extend01包中的B类
public class C extends B{
public void method(){
//super.a = 10; //编译报错,父类中private成员在不同包子类中不可见
super.b = 20; //父类中protected修饰的成员在不同包类中可以直接访问
super.c = 30; //父类中public修饰的成员在不同的包子类中可以直接访问
//super.d = 40; //父类中默认访问权限修饰的成员在不同包子类中不能直接访问
}
}
package extend02; //extend02包中
//不同包中的类
public class TextC {
public static void main(String[] args) {
C c = new C();
c.method();
//System.out.println(c.a); //编译报错,父类中private成员在不同包其他类中不可见
//System.out.println(c.b); //父类中protected成员在不同包其他类中不能直接访问
System.out.println(c.c); //父类中public成员在不通报其他类中可以直接访问
//System.out.println(c.d); //父类中默认访问权限修饰的成员在不同包其他类中不能直接访问
}
}
final public class Animal {
int a;
//...
}
public class Bird extends Animal{
//...
public static void main(String[] args) {
System.out.println(a);
}
}
//编译出错--> java:无法从Aniamal中进行继承
一只老辣鸟的自我救赎 不科普,简单记录学习过程。 开发环境约束: jdk1.8 Spring Boot 1.5.9 Spring 4.3.13 Maven 3.3.3 Intellij IDEA 2017 【脑瓜灵光的开发环境随意,不灵光尽量按上述约束设置。看了好些教程总…