印象网站建设,镇江网站公司,电商网站网络服务,固定ip做网站目录
1.继承的概念
2.继承的语法
3.父类成员访问
3.1子类中访问父类成员变量
3.2子类中访问父类成员方法
4.super关键字
5.子类构造方法
6.继承方式
7.final关键字和类的关系 面向对象思想中提出了继承的概念#xff0c;专门用来进行共性抽取#xff0c;实现代码复…目录
1.继承的概念
2.继承的语法
3.父类成员访问
3.1子类中访问父类成员变量
3.2子类中访问父类成员方法
4.super关键字
5.子类构造方法
6.继承方式
7.final关键字和类的关系 面向对象思想中提出了继承的概念专门用来进行共性抽取实现代码复用。就像是数学中提取每一个数的公因数一般把相同的代码提取出来单独的成为一个类但同时又可以被别的类使用其中的属性或方法。
1.继承的概念
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段它允许程序员在保持原有类特性的基础上进行扩展增加新功能这样产生新的类称派生类。继承呈现了面向对象程序设计的层次结构 体现了由简单到复杂的认知过程。继承主要解决的问题是共性的抽取实现代码复用 Cat和Dog类既有从父类Animal继承的语句也含有本身的语句。 class Animal{//父类String name;int age;public void eat(){System.out.println(this.name is eating.);}
}class Cat extends Animal{ //Animal的子类public void miaow(){System.out.println(miaomiaomiao~);}
}class Dog extends Animal{ //Animal的子类public void bark(){System.out.println(wangwangwang~);}
}
2.继承的语法 修饰符 class 子类 extends 父类{……} class Animal{//父类String name;int age;public void eat(){System.out.println(this.name is eating.);}
}class Cat extends Animal{//子类public void miaow(){System.out.println(miaomiaomiao~);}
}public class Test {public static void main(String[] args) {Cat cat new Cat();System.out.println(cat.age);System.out.println(cat.name);}
}
我们可以看到我们在main方法中只实例化了cat对象但是cat本身并没有定义任何成员变量却发现可以调用成员变量age和name。而我们又使用了继承由此可知对象cat当中的成员变量肯定来自于其父类Animal同样的我们也可以同样的访问父类的方法。
通过上面的举例我们值得注意的是
子类本身要有属于自身的语句如果和父类相同则没必要创建一个新的类。子类会将父类的成员变量和方法继承到子类当中
3.父类成员访问
3.1子类中访问父类成员变量
我们可以在子类中使用方法来访问父类的成员使用this会先在子类中寻找成员如果找不到则会进入父类寻找所以在子类中this也可以访问父类成员
class Animal{//父类String name;int age;public void eat(){System.out.println(this.name is eating.);}
}class Cat extends Animal{ //Animal子类public void setName(String name){this.name name;}public void miaow(){System.out.println(miaomiaomiao~);}
}
还有另一种情况就是子类中成员名和父类的相同。
class Animal{//父类String name; //注意1int age;public void eat(){System.out.println(this.name is eating.);}
}class Cat extends Animal{ //Animal子类String name; //注意2public void setName(String name){this.name name;}public void miaow(){System.out.println(miaomiaomiao~);}
}
此处子类和父类的成员名都相同那下面的setName方法中访问的是子类的成员还是父类的成员呢
答案是子类的。就像是C语言中局部变量和全局变量一样如果变量名相同给其赋值局部变量会优先与全局变量类似就近原则在这里也是同样的道理
“成员名相同访问父类成员变量的方法我们下面会有所提及”
于是我们总结以下几点
如果访问的成员变量子类中有优先访问自己的成员变量。如果访问的成员变量子类中无则访问父类继承下来的如果父类也没有定义则编译报错。如果访问的成员变量与父类中成员变量同名则优先访问自己的。
3.2子类中访问父类成员方法
如果成员方法名不相同的情况
和访问父类成员变量类似的先在子类中寻找要访问的成员方法如果有即可以访问。如果子类没有下一步是进入到父类寻找要访问的成员方法。父类中访问不到相应的成员方法则编译器会报错。子类的优先级是大于父类的 成员方法名相同的情况
class Base{public void methodA(){System.out.println(Base中的方法);}public void methodB(){System.out.println(Base中的方法);}
}class A extends Base{public void methodA(int a){System.out.println(A中的参数为int的methodA方法);}public void methodB(){System.out.println(A中的methodB方法);}
}
public class Test {public static void main(String[] args) {A a new A();a.methodA();//没有参数访问的是父类中的methodA方法a.methodA(5);//有参数访问的是子类中的methodA方法a.methodB();//访问的是子类的方法不可能访问到父类的方法//因为先在子类中访问再到父类}
} 总结
通过子类对象访问父类与子类中不同名方法时优先在子类中找找到则访问否则在父类中找找到则访问否则编译报错。通过派生类对象访问父类与子类同名方法时如果父类和子类同名方法的参数列表不同(重载)根据调用方法适传递的参数选择合适的方法访问如果没有则报错
4.super关键字
Java提供了super关键字该关键字主要作用在子类方法中访问父类的成员。
class Base{public void methodA(){System.out.println(Base中的方法);}public void methodB(){System.out.println(Base中的方法);}
}class A extends Base{public void methodA(int a){System.out.println(A中的参数为int的methodA方法);}public void methodB(){System.out.println(A中的methodB方法);super.methodB();//注意此处用super关键字访问到了父类的成员方法}
}
public class Test {public static void main(String[] args) {A a new A();a.methodA();//没有参数访问的是父类中的methodA方法a.methodA(5);//有参数访问的是子类中的methodA方法a.methodB();//访问的是子类的方法不可能访问到父类的方法//因为先在子类中访问再到父类}
} 注意事项
只能在非静态方法中使用在子类方法中访问父类的成员变量和方法
5.子类构造方法 因为父类和子类是继承关系即子类会继承父类的成员变量除此还有自身额外的成员变量在构建子类的构造方法的时候要先调用父类的构造方法。
class Base{public Base(){System.out.println(调用了父类的构造方法);}
}class A extends Base{public A(){super();//调用父类的构造方法 用户没有写的时候会默认自动添加System.out.println(调用了子类的构造方法);}}public class Test {public static void main(String[] args) {A a new A();}
} 注意
若父类显式定义无参或者默认的构造方法在子类构造方法第一行默认有隐含的super()调用即调用基类构造方法如果父类构造方法是带有参数的此时需要用户为子类显式定义构造方法并在子类构造方法中选择合适的父类构造方法调用否则编译失败。在子类构造方法中super(...)调用父类构造时必须是子类构造函数中第一条语句。super(...)只能在子类构造方法中出现一次并且不能和this同时出现
6.继承方式 java中的继承方式分为3种
第一种单继承
即一个类被另一个类继承
class A{……
}class B extends A{……
}
第二种多层继承
即有一个类A类B继承了A类C继承了B
class A{……
}class B extends A{……
}class C extends B{……
}
第三种不同类继承同一个类
即有一个类A类B继承A类C继承A
class A{……
}class B extends A{……
}class C extends A{……
}
7.final关键字和类的关系
当final修饰一个类的时候这个被修饰的类不能被继承 编译器会报错