Java_继承

Posted 小企鹅推雪球!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java_继承相关的知识,希望对你有一定的参考价值。

Java_面向对象编程-继承性

Java_继承的概念(extends)

  1. 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类的相同的行为
  2. 继承存在的意义:多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承存储相同内容的类即可。
  3. 多个类被称为子类(派生类),单独的这个类称为父类(基类或超类)。

Java_类的继承格式

  1. 在Java中通过extends关键字可以申明一个类是从另一个类继承而来,
class 父类 {
}
 
class 子类 extends 父类 {
}

Java_继承关键字

  1. 继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于java.lang.Objec
  2. 当一个类没有继承的两个关键字,则默认继承object(这个类在java.lang包中,所以不需要 import)祖先类。

Java_extends关键字

  1. Java中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以extends 只能继承一个类。
public class Animal {
    private String name;  
    private int id;
    public Animal(String myName, String myid) {
        //初始化属性值
    }
    public void eat() {  //吃东西方法的具体实现  }
    public void sleep() { //睡觉方法的具体实现  }
}
 
public class dog extends  Animal{
}

Java_implements关键字

  1. 使用implements关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况
  2. 使用implements关键字可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
public interface A {
    public void eat();
    public void sleep();
}
 
public interface B {
    public void show();
}
 
public class C implements A,B {
}

Java_super和this关键字简介

  1. super关键字:可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
  2. this关键字:指向自己的引用。
class Animal {
  void eat() {
    System.out.println("animal : eat");
  }
}
 
class Dog extends Animal {
  void eat() {
    System.out.println("dog : eat");
  }
  void eatTest() {
    this.eat();   // this 调用自己的方法
    super.eat();  // super 调用父类方法
  }
}
 
public class Test {
  public static void main(String[] args) {
    Animal a = new Animal();
    a.eat();
    Dog d = new Dog();
    d.eatTest();
  }
}
输出
animal : eat
dog : eat
animal : eat

Java_final关键字

  1. final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写

    声明类:final class 类名 {//类体}

    声明方法:修饰符(public/private/default/protected) final 返回值类型 方法名(){//方法体}

https://blog.csdn.net/qq_43408367/article/details/119958012

  1. 实例变量也可以被定义为 final,被定义为 final 的变量不能被修改。被声明为 final 类的方法自动地声明为 final,但是实例变量并不是final

Java_继承的作用

  1. 继承的出现减少了代码冗余,提高了代码的复用性
  2. 继承的出现,更有利于功能的扩展。
  3. 继承的出现让类与类之间产生了关系,提供了多态的前提。
  4. 子类继承了父类,就继承了父类的方法和属性。
  5. 在子类中,可以使用父类中定义的方法和属性,也可以创建新的数据和方法。
  6. 在Java 中,继承的关键字用的是extends,即子类不是父类的子集,而是对父类的“扩展”。

注意:不要仅为了获取其他类中某个功能而去继承

Java_继承的规则

  1. 子类不能直接访问父类中私有的(private)的成员变量和方法。

  1. Java只支持单继承和多层继承,不允许多重继承,一个子类只能有一个父类,一个父类可以派生出多个子类
class SubDemo extends Demo{ } //ok
class SubDemo extends Demo1,Demo2...//error

Java_继承的实例

抽象一个动物类,其中动物分别为狗和老鼠,要求如下:
狗:属性(姓名,id),方法(吃,睡,说明)
老鼠:属性(姓名,id),方法(吃,睡,说明)

public class Animal {
    private String name; 
    private int id;
    public Animal(String myName, int myid) {
        name = myName;
        id = myid;
    }
    public void eat(){
        System.out.println(name+"正在吃");
    }
    public void sleep(){
        System.out.println(name+"正在睡");
    }
    public void introduction() {
        System.out.println("大家好!我是"         + id + "号" + name + ".");
    }
}

狗类:

public class Penguin extends Animal {
    public Penguin(String myName, int myid) {
        super(myName, myid);
    }
}

老鼠类

public class Mouse extends Animal {
    public Mouse(String myName, int myid) {
        super(myName, myid);
    }
}
  1. Animal类就可以作为一个父类,然后狗类和老鼠类继承这个类之后,就具有父类当中的属性和方法,
  2. 子类就不会存在重复的代码,维护性也提高,
  3. 代码也更加简洁,提高代码的复用性
  4. (复用性主要是可以多次使用,不用再多次写同样的代码) 继承之后的代码

Java_继承的特性

  1. 子类拥有父类非 private 的属性、方法。
  2. 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
  3. 子类可以用自己的方式实现父类的方法。
  4. Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类
  5. 多重继承是例如 A 类继承 B 类,B 类继承 C 类,所以按照关系就是 C 类是 B 类的父类,B 类是 A 类的父类,
  6. 继承提高了类之间的耦合性,但是继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差

Java_构造器

  1. 子类是不继承父类的构造器(构造方法或者构造函数)的,它只是调用(隐式或显式)。
  2. 如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super关键字调用父类的构造器并配以适当的参数列表。
  3. 如果父类构造器没有参数,则在子类的构造器中不需要使用super关键字调用父类构造器,系统会自动调用父类的无参构造器。
class SuperClass {
  private int n;
  SuperClass(){
    System.out.println("SuperClass()");
  }
  SuperClass(int n) {
    System.out.println("SuperClass(int n)");
    this.n = n;
  }
}
// SubClass 类继承
class SubClass extends SuperClass{
  private int n;
 
  SubClass(){ // 自动调用父类的无参数构造器
    System.out.println("SubClass");
  } 
 
  public SubClass(int n){
    super(300);  // 调用父类中带有参数的构造器
    System.out.println("SubClass(int n):"+n);
    this.n = n;
  }
}
// SubClass2 类继承
class SubClass2 extends SuperClass{
  private int n;
 
  SubClass2(){
    super(300);  // 调用父类中带有参数的构造器
    System.out.println("SubClass2");
  } 
 
  public SubClass2(int n){ // 自动调用父类的无参数构造器
    System.out.println("SubClass2(int n):"+n);
    this.n = n;
  }
}
public class TestSuperSub{
  public static void main (String args[]){
    System.out.println("------SubClass 类继承------");
    SubClass sc1 = new SubClass();
    SubClass sc2 = new SubClass(100);
    System.out.println("------SubClass2 类继承------");
    SubClass2 sc3 = new SubClass2();
    SubClass2 sc4 = new SubClass2(200);
  }
}

Java_方法的重写(override/overwrite)

方法重写的定义:

  1. 在子类中可以根据需要对从父类中继承来的方法进行改造,也称
    为方法的重置、覆盖
  2. 在程序执行时,子类的方法将覆盖父类的方法。

方法重写的要求:

  1. 子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表
  2. 子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型
  3. 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限
  4. 子类不能重写父类中声明为private权限的方法
  5. 子类方法抛出的异常不能大于父类被重写方法的异常

重写方法时注意:子类与父类中同名同参数的方法必须同时声明为非static的(即为重写),或者同时声明为static的(不是重写)。因为static方法是属于类的,子类无法覆盖父类的方法

重写方法的样例一

public class Person {
	public String name;
	public int age;
	
	public String getInfo() {
		return "Name: "+ name + "\\n" +"age: "+ age;
	}
}
public class Student extends Person {
	public String school;
	public String getInfo() { //重写方法
		return "Name: "+ name + "\\nage: "+ age + "\\nschool: "+ school;
	}
public static void main(String args[]){
		Student s1=new Student();
		s1.name="Bob";
		s1.age=20;
		s1.school="school2";
		System.out.println(s1.getInfo()); //Name:Bob age:20 school:school2
		
		Person p1=new Person();
		p1.getInfo();//调用Person类的getInfo()方法
		
		Student s1=new Student();
		s1.getInfo();//调用Student类的getInfo()方法
		// 这是一种“多态性”:同名的方法,用不同的对象来区分调用的是哪一个方法。
	}
}

重写方法的样例二

class Parent {
		public void method1() {}
}
class Child extends Parent {
	private void method1() {} //非法,子类中的method1()的访问权限private比被覆盖方法的访问权限public小
}
public class UseBoth {
	public static void main(String[] args) {
		Parent p1 = new Parent();
		Child c1 = new Child();
		p1.method1();
		c1.method1();
	}
}

Java_super关键字详解

  1. 在Java类中使用super来调用父类中的指定操作
  2. super可用于访问父类中定义的属性
  3. super可用于调用父类中定义的成员方法
  4. super可用于在子类构造器中调用父类的构造器
  5. 当子父类出现同名成员时,可以用super表明调用的是父类中的成员
  6. super的追溯不仅限于直接父类
  7. superthis的用法相像,this代表本类对象的引用,super代表父类的内存
    空间的标识
package com.company;

// 关键字 super 实例
class  Person {
    protected  String name = "张三";
    protected int age;
    public String getInfo() {
        return "Name: " + name + "\\nage: " + age;
        }
}
class Student extends Person {
    protected String name = "李四";
    private String school = "New Oriental";
    public String getSchool() {
        return school;
    }
    public String getInfo() {
        return super.getInfo() + "\\nschool: " + school;
    }
}

public class StudentTest {
    public static void main(String[] args) {
        Student st = new Student();
        System.out.println(st.getInfo());
    }
}

运行结果:

Java_super调用父类的构造器

  1. 子类中所有的构造器默认都会访问父类中空参数的构造器
  2. 当父类中没有空参数的构造器时,子类的构造器必须通过this(参数列表)或者super(参数列表)语句指定调用本类或者父类中相应的构造器。同时,只能”二选一”,且必须放在构造器的首行
  3. 如果子类构造器中既未显式调用父类或本类的构造器,且父类中又没有无参的构造器,则编译出错

super 调用父类构造器实例

public class Student extends Person {
	private String school;
	public Student(String name, int age, String s) {
		super(name, age);
		school = s;
	}
	public Student(String name, String s) {
		super(name);
		school = s;
	}
	// 编译出错: no super(),系统将调用父类无参数的构造器。
	public Student(String s) { 
		school = s;
	}
}

Java_this和super的区别

this和super访问属性

  1. this访问本类中的属性,如果本类没有此属性则从父类中继续查找,
  2. super直接访问父类中的属性

this和super调用方法

  1. this访问本类中的方法,如果本类没有此方法则从父类中继续查找
  2. super直接访问父类中的属性

this和super调用构造器

  1. this调用本类构造器,必须放在构造器的首行
  2. super调用父类构造器,必须放在子类构造器的首行

以上是关于Java_继承的主要内容,如果未能解决你的问题,请参考以下文章

java中封装,继承,多态,接口学习总结

java基础第五天_静态代码块类的继承和接口

编写高质量代码:改善Java程序的151个建议(第3章:类对象及方法___建议41~46)

IT十八掌作业_java基础第五天_静态代码块类的继承和接口

Java 面向对象_继承

No2_1.接口继承多态_Java学习笔记_接口