java提供了一个关键字用来表示继承关系:extends
写法:class B extends A{} 表示B类继承自A类
这里的B称之为:子类,派生类
这里的A称之为:父类,基类或者超类
子类继承父类非私有成员
点击查看代码
class Animal{
String name;
int age;
public void eat(){
System.out.println("吃饭");
}
public void sleep(){
System.out.println("睡觉");
}
}
class Dog extends Animal {
//子类相当于这里有一份父类中的非私有成员
public void lookDoor(){
System.out.println("看家");
}
}
class Cat extends Animal{
}
public class ExtendsDemo1{
public static void main(String[] args) {
Dog dog = new Dog();
dog.eat();
dog.sleep();
System.out.println(dog.name);
System.out.println(dog.age);
}
}
java中,类与类之间继承的时候,不允许一次继承多个类,只允许单继承,但是可以进行多重继承,形成继承体系
点击查看代码
class Mother{
}
class GrandFather{
}
class Father extends GrandFather{
}
class Son extends Father{
}
//class Son extends Mother,Father{
//
//}
public class ExtendsDemo2 {
public static void main(String[] args) {
}
}
使用继承的注意事项:
1、子类无法继承父类中私有的成员
2、子类不能继承父类的构造方法
3、不要为了部分功能而去继承
点击查看代码
class Fu1{
int a = 10;
private int b = 20;
Fu1(){
System.out.println("这是父亲的无参构造方法");
}
public void show1(){
}
private void show2(){
}
}
class Son1 extends Fu1{
//super()之所以输出Fu1(),是因为初始化了Fu1() 此处省略了super()
public void fun1(){
System.out.println(a);//
// System.out.println(b); //b是fu1私有的
show1();
// show2(); 这是父类私有的方法,如果想调用的话需要设置一个非私有的方法在进行调用
}
}
public class ExtendsDemo3 {
public static void main(String[] args) {
Son1 son1 = new Son1();
System.out.println(son1.a);
// System.out.println(son1.b);//b是fu1私有
}
}
子类寻找成员变量并使用的流程:
1、先就近原则,在方法内部中查找一次,若找到就使用
2、若方法内部没有需要的变量,去当前类成员变量的位置上查找,若找到就使用
3、若当前类成员变量的位置上没有需要的变量,去父类中的成员变量的位置上查找,若找到就使用
4、若上面3个地方都没有找到所需要的变量,就报错
java中提供了另外一个关键字super,用法跟this很像,但是super代表的是当前子类的直接父类的引用
在子类中,可以通过super关键字使用直接父类中的非私有成员
点击查看代码
class Fu2{
int a = 10;
}
class Son2 extends Fu2{
int a = 20;
public void fun1(){
int a = 30;
System.out.println(a); // 30
System.out.println(this.a); // 20
// Fu2 fu2 = new Fu2();
// System.out.println(fu2.a);
System.out.println(super.a); // 10
}
}
public class ExtendsDemo4 {
public static void main(String[] args) {
Son2 son2 = new Son2();
son2.fun1();
}
}
super关键字的使用注意事项:
1、super仅代表当前类中的直接父类,无法使用super获取父类的父类中的成员
2、super后面不能再调用super
点击查看代码
class GrandFu3{
int a = 10;
}
class Fu3 extends GrandFu3{
int a = 30;
}
class Son3 extends Fu3{
int a = 20;
public void fun1(){
System.out.println(a);
System.out.println(super.a);
// System.out.println(super.super.a);
//如果想要获取GrandFu3的成员变量a
// 需要new一个新对象
GrandFu3 grandFu3 = new GrandFu3();
System.out.println(grandFu3.a);
}
}
public class ExtendsDemo5 {
public static void main(String[] args) {
Son3 son3 = new Son3();
son3.fun1();
}
}
继承和构造方法的关系
在java继承关系中,要想初始化子类,必须先初始化其父类,这里默认super()体现的就是这个意思
1、子类构造方法的第一句话,默认会有一个super(),对父类做初始化,只能在子类构造方法第一句出现。
问题:如果父类中没有无参构造方法呢?
1)使用super关键字调用父类中的有参构造方法,完成父类的初始化
2)调用当前类中其它有参的构造方法间接对父类做初始化
2、java中每一个只允许初始化一次
点击查看代码
class Fu4{
// Fu4(){
// System.out.println("这是父类中的无参构造方法.....");
// }
Fu4(String s){
System.out.println("这是父类中有参数的构造方法....");
}
}
class Son4 extends Fu4{
Son4(){
//super()
super("数加");
// this("数加");
System.out.println("这是子类的无参构造方法.....");
// super("数加");
}
Son4(String s){
super(s);
}
}
public class ExtendsDemo6 {
public static void main(String[] args) {
Son4 son4 = new Son4();
}
}
继承与成员方法的关系:
当子类中的方法声明【方法的返回值类型,方法名和参数列表】与父类中的方法声明一致的时候,只是方法的实现不一样,这个现象叫做方法的重写【方法的覆盖】。
java提供了一个注解帮助我们判断是否是重写@Override
点击查看代码
class Fu5{
public void fun1(){
System.out.println("这是父类中的fun1方法");
}
}
class Zi5 extends Fu5{
@Override
public void fun1(){
System.out.println("这是子类中的fun1方法");
}
public void fun2(){
System.out.println("这是子类中的fun2方法");
}
}
public class ExtendsDemo7 {
public static void main(String[] args) {
Zi5 zi5 = new Zi5();
zi5.fun2();
zi5.fun1();
}
}
重写所需要注意事项:
1、子类无法重写父类中的私有方法
2、子类无法继承且重写父类中的静态方法
3、子类重写方法的权限,要大于等于父类的方法权限,推荐在没有要求的情况下,保持和父亲一致的权限就好了
面试题:重写和重载什么区别?【overload和override什么区别?】
1、重写是发生在继承关系中的,指的是子类方法的返回值类型和方法名以及参数列表与父类方法一致,只是实现不一样
2、重载是发生在同一个类中,值的是方法名一样,参数列表不同,与返回值无关的现象
点击查看代码
class Fu6{
public void fun1(){
System.out.println("江川是世界上最帅的男人!");
}
void function1(){
System.out.println("这是父类中默认修饰符的成员方法,...");
}
public static void method(){
System.out.println("这是父类中的静态方法.....");
}
private void show1(){
System.out.println("好好学习,天天向上!");
}
}
class Zi6 extends Fu6{
@Override
public void fun1(){
System.out.println("吴问强很不服,他认为自己才是世界上最帅的男人!");
}
@Override
void function1(){
System.out.println("这是子类中默认修饰符的成员方法,...");
}
// @Override
public static void method(){
System.out.println("这是父类中的静态方法.....");
}
// @Override
private void show1(){
System.out.println("在数加好好学习!");
}
}
public class ExtendsDemo8 {
public static void main(String[] args) {
Zi6 zi6 = new Zi6();
zi6.fun1();
}
}