java笔记2.10

java笔记2.10,第1张

今天是抽象类(C++中应该是叫虚基类)

先复习一下多态

import javax.sound.sampled.SourceDataLine;

public class b {
    public static void main(String[] args) {

        // 关于多态一定要记住,p1和p2依旧是person类,只能访问person类中有的东西
        person p1 = new student();
        person p2 = new teacher();
        p1.function();
        p2.function();

        // 子类类型,才可以访问衍生所扩展的方法
        student s1 = new student();
        teacher t1 = new teacher();
        s1.study();
        t1.teach();
    }
}

class person {
    public int age;
    public String name;
    public int height;

    public void function() {
        System.out.println("人类: " + name + ",身高:" + height + ",年龄:" + age);
    }
}

class student extends person {
    public void function() {
        System.out.println("学生: " + name + ",身高:" + height + ",年龄:" + age);
    }

    public void study() {
        System.out.println("学生学习");
    }
}

class teacher extends person {
    public void function() {
        System.out.println("教师: " + name + ",身高:" + height + ",年龄:" + age);
    }

    public void teach() {
        System.out.println("老师教书");
    }
}
抽象:类和方法
public abstract class b {
    public abstract void function();

	public void function2()
	{
		System.out.println("但是有什么用呢?抽象类中可以包含非抽象方法");
	}
}

但是有什么用呢?有什么特别的?
.
.
.
.
.
需要没有方法体的方法
抽象类不能直接使用,不可直接实例化

抽象类中不一定是抽象方法
但含抽象方法,就一定是抽象类

二种用法
1. 重写抽象类中所有抽象
2. 子类也是抽象类

class class2 extends class1 {
    @Override
    void function() {
        /* 重写 */}
}

// 继续抽象类
abstract class class3 extends class1 {
    // 这一句写与不写都一样
    abstract void function();
}

.
.
.
.
.
.

抽象类有何优势?相比较于直接多态?

貌似并没有什么好处
强制要求重写方法
强制继承后才可使用
(保证安全性?)

好处就是:当我不希望能够实例化父类的时候可以使用抽象类
比如说:人类,我不希望你能够实例化一个人类对象,我只希望你能够实例化更具体的对象,比如说,男人,女人;这时候可以使用抽象类
人类,并不是所需要的具体的类的时候。

.
.
.
.
换种说法:当我需要黑人白人黄种人男人女人…等多种类的时候,而我又不需要人类这个类。
为了通过继承减少代码量,我就创建一个抽象类,抽象类是对“各种人”的特征集合!

public class b {
    public static void main(String[] args) {
        class1 c1 = new class2();
        class1 c2 = new class3();
        c1.function();
        c2.function();

        // 还是不可以,和多态相比较有何优势吗?
        // c1.function2();
        // c2.function2();

    }
}

abstract class class1 {
    abstract void function();
}

class class2 extends class1 {
    @Override
    void function() {
        System.out.println("class2这里重写抽象类中的方法");
    }

    void function2() {
        System.out.println("class2自己的方法");
    }

}

class class3 extends class1 {
    void function() {
        System.out.println("class3这里重写抽象类中的方法");
    }

    void function2() {
        System.out.println("class3自己的方法");
    }
}


.
.
.
.
.
.

回顾C++中的多态
#include<iostream>
using namespace std;
class Person 
{
    public:
    virtual void function()
    {
        cout<<"这是人类"<<endl;
    }  
};

class Student : public Person
{
   public:
   virtual void function() 
   {
       cout << "学生学习" << endl;
   }
};

class Teacher : public Person
{
   public:
   virtual void function() 
   {
       cout << "老师教书" << endl;
   }
};

int main()
{
    // 不同类,调用不同的函数
   Student s;
   Person p;
   Teacher t;
   s.function();
   t.function();
   p.function();

}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1354063.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-14
下一篇 2022-06-14

发表评论

登录后才能评论

评论列表(0条)

保存