IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【Java答疑一】父类与子类的详解 -> 正文阅读

[Java知识库]【Java答疑一】父类与子类的详解

最近在学Java的继承,发现里面还是有很多坑的,所以借此做个笔记巩固学习。下面以问答的形式展现我学习过程的问题。

1.父类与抽象类区别?

抽象类只能对属性或者方法的申明,不能对其实现。而继承这个类的子类一定要实现抽象类的所有方法。注意,抽象类的方法必定都是抽象的。而父类可以抽象也可以非抽象,可以不用重写所有方法(除抽象方法)
我们同样无法实现抽象类的实例化,这是什么意思,见下段代码:

abstract class Person{
	public abstract void run();
}
class Student extends Person{
	@override//这个相当于注释,编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错 
	void run(){System.out.println("123");}
}
//在主函数中不可以这样定义
Person a=new Person();
//但是可以这样定义
Person a=new Student();

2.super怎么用的?

首先对于super来说:1.可以用来引用直接父类的实例变量。2.可以用来调用直接父类方法。3.可以用于调用直接父类构造函数。
对于1来说,见如下代码:

class Animal {
    String color = "white";
}

class Dog extends Animal {
    String color = "black";

    void printColor() {
        System.out.println(color);// prints color of Dog class
        System.out.println(super.color);// prints color of Animal class
    }
}

public class TestSuper1 {
    public static void main(String args[]) {
        Dog d = new Dog();
        d.printColor();
    }
}

打印结果也是很明显的,就是打印出black 和 white
所以:如果我们打印color属性,它将默认打印当前类的颜色。 要访问父属性,需要使用super关键字指定。
对于2来说,见如下代码:

class Animal {
    void eat() {
        System.out.println("eating...");
    }
}

class Dog extends Animal {
    void eat() {
        System.out.println("eating bread...");
    }

    void bark() {
        System.out.println("barking...");
    }

    void work() {
        super.eat();
        bark();
    }
}

class TestSuper2 {
    public static void main(String args[]) {
        Dog d = new Dog();
        d.work();
    }
}

所以:如果方法被覆盖就可以使用 super 关键字来指定父类方法。
对于3来说:

class Animal {
    Animal() {
        System.out.println("animal is created");
    }
}

class Dog extends Animal {
    Dog() {
        super();
        System.out.println("dog is created");
    }
}

class TestSuper3 {
    public static void main(String args[]) {
        Dog d = new Dog();
    }
}

3.子类没有super是否会默认构造?使用了super是否会改变子类的成员变量?

对于问题一来说,任何子类都会默认构造super,什么意思呢?见如下代码

class Animal {
    Animal() {
        System.out.println("animal is created");
    }
}

class Dog extends Animal {
    Dog() {
        System.out.println("dog is created");
    }
}

public class Test1 {
    public static void main(String args[]) {
        Dog m = new Dog();
    }
}

大家猜猜会出现什么?
运行结果如下:
在这里插入图片描述
是不是不可思议?没有使用super,编译器竟然默认有,和构造方法一样。
如何使用super构造呢?

class Person {
    int id;
    String name;

    Person(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

class Emp extends Person {
    float salary;

    Emp(int id, String name, float salary) {
        super(id, name);// reusing parent constructor
        this.salary = salary;
    }

    void display() {
        System.out.println(id + " " + name + " " + salary);
    }
}

public class Test2 {
    public static void main(String[] args) {
        Emp e1 = new Emp(1, "ankit", 45000f);
        e1.display();
    }
}


运行结果:
在这里插入图片描述

4.为什么我子类构造方法中有super但是多打印出null?

这就是回到前面的问题了,如果没有super语句,子类会默认构造,也就是说,没有出现构造的方法均会被实现,当然了这个构造就是普通的类名(),否则就会造成null的输出。
如果父类没有无参的构造函数,所以子类需要在自己的构造函数中显示的调用父类的构造函数,即不能使用系统默认的“super()”,而需要显性写出super(xxx)
以下是程序的说明:

public class Main{
    public static void main(String[] args){
        Ming a=new Ming(101,"JACIN");
        System.out.println(a.toString());
        Ming b=new Ming(100,"JACKSON",98);
        System.out.println(b.toString());
    }
}

class Student{
    String name;
    int num;
    Student(int num,String name){
        this.name=name;
        this.num=num;
    }
    Student(){
    }
    Student(String name){
        this.name=name;
    }
    public String toString(){
        return this.num+" "+this.name;
    }
}

class Ming extends Student{
    int num;
    String name;
    int score;
    public Ming(int num,String name){
        super(num,name);
    }
    Ming(int num,String name,int score){
        this.num=num;
        this.name=name;
        this.score=score;
    }
    public String toString(){
        return this.num+" "+this.name;
    }
}

这个运行结果会这样:
在这里插入图片描述
为什么会出现这样的问题呢?我们的疑惑就来了,super到底会不会改变子类的成员变量。这里的程序少了一步,也就是在Ming中super下面加一句,this的使用,否则会出现null
注意这里使用父类的构造方法,所以会根据父类的初始化来改变!

public Ming(int num,String name){
        super(num,name);
        this.name=name;
        this.num=num;
    }
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:14:58  更:2022-03-08 22:18:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 11:00:21-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码