JAVA萌新学习day12 抽象与接口

JAVA萌新学习day12
一.回顾

1.Object类,是所有类的父亲,默认继承Object
equals()方法:判断两个对象是否相等
return this == obj;
**==:**基本类型比较的数据,引用类型比较的地址。
equals() 默认和 == 一样。
String 中 equals 重写了 Object 中的 equals 方法。
hashCode()方法:返回对象的地址。
getClass()方法:返回类对象,获取类的名称。
toString()方法:返回对象的字符串形式。

2.**多态:**同一个父类引用类型,使用了不同的子类实例,执行不同的操作,父类引用,子类对象。
实现多态的要素或条件:
2.1 子类继承父类,子类必须重写父类的方法
2.2 使用父类变量,子类对象
多态表现形式:
2.3 使用父类作为方法的参数
2.4 使用父类作为方法的返回值
向上转型和向下转型:
向上转型:子类转成父类。
向下转型:父类转成子类,前提必须先向上转型,才能向下转型。
**instanceof:**判断对象是否是某种类型。
例如:

if(pet instanceof Dog){
 	Dog dog = (Dog)pet;
}

3.final 终止的
3.1 final 修饰的变量,表示常量,只能赋值一次。

当final修饰一个基本数据类型时,表示该基本数据类型的值一旦在初始化后便不能发生变化;如果final修饰一个引用类型时,则在对其初始化之后便不能再让其指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。本质上是一回事,因为引用的值是一个地址,final要求值,即地址的值不发生变化。

final修饰成员变量:

final修饰一个成员变量(属性),必须要显示初始化。这里有两种初始化方式,一种是在变量声明的时候初始化;第二种方法是在声明变量的时候不赋初值,但是要在这个变量所在的类的所有的构造函数中对这个变量赋初值。
当函数的参数类型声明为final时,说明该参数是只读型的。即你可以读取使用该参数,但是无法改变该参数的值。
例如:

class Man{
	private final int i = 0;
	public Man(){
	i = 1;
	final Object obj = new Object();
	obj = new Object();
	}
}
//上面的一段代码中,对变量i和obj的重新复制都报错了。

3.2 final修饰方法:终止方法不能被重写,可以被继承。
3.3 final修饰类:终止类,不能被继承。

复习完了,今天就开始学习新的内容啦!那么看看今天的任务吧!
1.抽象类
2.抽象方法
3.接口

二.抽象

1.为什么要使用抽象类
有些类创建对象不具体,需要把这个定义为抽象类

1. Animal animal = newAnimal();
2. Pet pet = new Pet;

使用 abstract 修饰类变成抽象类:不能实例化,只能被继承。
抽象类的构造方法不能直接使用,只能被子类调用。

2.abstract 关键字
abstract
可以修饰类:叫做抽象类。
可以修饰方法:叫做抽象方法,没有方法体,需要使用分号表示生命结束,抽象方法所在的类必须是抽象类。
子类必须重写父类的抽象方法,除非子类也是抽象类。

3.抽象方法
使用abstract关键字修饰,只表示声明了一个方法,但是没有任何实现。
特点:

  1. 没有方法体,需要使用分号表示方法声明结束。
  2. 如果一个类中有一个方法是抽象的,那么这个类必须是抽象的。
  3. 抽象方法必须被子类重写,除非子类也是抽象类。

4.抽象类
使用abstract关键字修饰
特点:

  1. 抽象类中可以包含抽象方法,也可以不包含抽象方法。
    2)抽象类中有构造方法,但是不能创建对象,构造方法可以在子类中会被调用。
    3)抽象类的存在就是为了被继承,子类必须重写父类的抽象方法,除非子类也是抽象类。

5.抽象类和普通类的区别
1)抽象类需要abstract,而普通类不需要。
2)构造方法:都有,但是抽象类不能实例化对象,普通类可以。
3)成员方法:抽象类中可以纯在抽象方法也可以存在非抽象方法,而普通类中只能存在非抽象方法。

  1. 两个关键字修饰方法
    final修饰的方法特点:可以被继承不能被重写;
    abstract修饰的方法特点:必须被重写;
    所以这两个关键字不能同时修饰同一个方法。
  2. 两个关键字修饰类时:
    final修饰的类特点:不能被继承;
    abstract修饰的方法特点:必须被重写;
    所以这两个关键字不能修饰同一个类。
  3. final的类种不能有abstract方法,abstract方法必须是abstract类,abstract类是必须被重写的,而final修饰的类不能被继承。
  4. abstract类中可以有final方法,final方法可以被继承。
三.接口

1.接口的概念
从语法上讲:借口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有方法的实现。
从功能上讲:接口表示一种约定(规范)或能力。

2.接口的好处
·扩展类的功能,保持对外借口一致。
·接口实现了多重继承,完成类和任何实现接口子类的同心和交互。
·降低了代码之间的耦合性。

3.接口的特点
1)接口不能创建对象,而且接口没有构造方法。
2)接口中的方法一般都是共有抽象方法:public abstract。
3)接口中所有的属性都是共有静态属性:public static final。
在一个接口中声明方法是,若没有声明访问权限,默认也是public,若没其他修饰默认也是abstract;
声明属性时,若没有声明访问权限和静态常量,默认也是 public static final。

4.接口的声明语法
关键字 interface :表示一个接口,接口 interface 和类 class 是平级关系。
接口命名习惯:
如果接口表示一种能力,命名采用:名字+后缀able,比如 Serializable Comprarble。
如果接口表示一种约定或规范,按照类的命名规范 Usb,Comparator,CharSequence

语法:
public interface 接口名{
	//接口中的成员:抽象方法和静态常量.
} 

5.接口的实现类
接口与类的关系:implements:实现
一个类可以实现多个接口。

语法:
public interface I{
	public abstract void fun();
}
public class Impl implements I{
	public void fun(){

	}
}
/*
一个类实现某个接口之后,可以存在父类,实现接口和继承类不冲突。
*/
//若一个类有父类同时也实现接口,声明类时,必须先继承在实现接口
语法:
public calss Dog extends Animal implements I{
	public void fun(){
	}
}

6.接口的分类
1)普通接口:在接口中可以声明抽象方法和静态常量属性。
2)常量群接口:在接口中只声明一组静态常量属性。
3)标志性接口:在接口中没有抽象方法,作用为了标记某个类具有某个功能。

7.接口和接口的关系
继承关系:使用关键字extends实现接口与接口的继承关系。
接口继承的特点:
1)接口中没有私有成员,所以父接口中的所有成员都会被子接口继承。
2)父子关系中都是接口,所以子接口中不需要实现任何抽象方法。
3)接口可以多继承。
例如:
现有类A和类B,两个类中都有fun()方法,假如类C继承类A和类B,当使用类C的对象调用fun方法时,如何执行?此时不知道执行哪个fun()方法,所以类不可多继承
现有接口A,B,两个接口中都有fun方法,接口C继承A,B,由于接口中的没有方法体,所以只要在接口C中存在了fun方法即可,所以接口支持多继承。

8.接口中的特殊方法

  1. JDK1.8之后接口中使用static关键字修饰的方法有方法体
    静态方法需要有方法体,注意只能通过 接口名.方法 调用,因为不能被继承。
  2. JDK1.8之后接口中使用default关键字修饰的方法有方法体
    可以被继承,通过现实类调用。

9.抽象类和接口的区别
语法:
1)抽象类使用abstract,接口使用interface
2)抽象类中可以包含抽象方法,也可以包含非抽象方法,接口中只能包含抽象方法和静态常量,jdk1.8之后接口可以包含静态方法和默认方法。
3)抽象类和接口都不能实例化
4)抽象类可以包含构造方法,接口中没有构造方法。
功能:
1)抽象类一般用来表示同类实物,接口可以表示不同类实物。
2)抽象类可以实现代码的重用,也可以约束子类的功能,接口就是约束显示类的功能,降低代码之间的耦合性。
使用场景:
1)程序或模块内部使用抽象类
2)程序架构或模块之间使用接口

四.程序

ComplexDemo

/*
* 1.Person(人,父类)
* 2.Student Teacher(学生 老师)抽象类
* 3.SmallStudent MiddleStudent 继承于 Student
* 4.SmallTeacher MiddleTeacher 继承于 Teacher
* 5.SmallInterface MiddleInterface 两个接口
*/

public class ComplexDemo {
    public static void main(String[] args) {
        System.out.println("ComplexDemo.main");

        ComplexManager.test();
    }
}

Person

//人 类 我们本程序中的根类
public abstract class Person {
    //姓名
    String name;
    //年龄
    int age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    //抽象方法,所有子类必须重写
    public abstract void eat();

    public void sleep(){
        System.out.println("Person.sleep");


    }
}

Student

public abstract class Student extends Person{
    //学号
    int number;
    //所在学校名称
    String schoolName;

    public int getNumber() {
        return number;
    }

    public void setNumber(int number) {
        this.number = number;
    }

    public String getSchoolName() {
        return schoolName;
    }

    public void setSchoolName(String schoolName) {
        this.schoolName = schoolName;
    }

    //学习的方法
    public abstract void study();
}

Teacher

public abstract class Teacher extends Person {
    //老师所教学科
    String subject;
    //工资
    int money;

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public int getMoney() {
        return money;
    }

    public void setMoney(int money) {
        this.money = money;
    }

    //给学生上课
    public abstract void teachStudent();
}

SmallStudent

public class SmallStudent extends Student{

    //爱好
    String love;

    //用来记录产生的小学生数量
    public static int count = 0;

    public SmallStudent(){
        this("玩游戏");
    }

    public SmallStudent(String love){
        //记录有一个新的学生产生了学号
        count ++;
        this.love = love;
    }

    //玩游戏的方法
    public void playGame(){
        System.out.println("SmallStudent.playGame" + this );
    }

    public String getLove() {
        return love;
    }

    public void setLove(String love) {
        this.love = love;
    }

    @Override
    //重写父类继承来的方法,为了能让系统帮我们直接打印对象内容
    public String toString(){
        String str =  "姓名:" + name + ";年龄:" + age + ";爱好:" + love  + ";学号:" + number + ";学校" + schoolName;

        System.out.println();
        return str;
    }

    @Override
    public void study() {
        System.out.println("SmallStudent.study" + this);

    }

    @Override
    public void eat() {
        System.out.println("SmallStudent.eat" + this);

    }
}

MiddleStudent

public class MiddleStudent extends Student {

    //朋友
    String friend;

    //用来记录产生的中学生数量
    public static int count = 0;

    public MiddleStudent(){
        this("没朋友");
    }

    public MiddleStudent(String friend) {
        count ++;
        this.friend = friend;
    }

    public String getFriend() {
        return friend;
    }

    public void setFriend(String friend) {
        this.friend = friend;
    }

    @Override
    public String toString(){
        String str = "姓名:" + name + " 年龄:" + age +  " 朋友:" + friend +  " 学校:" + schoolName;
        return str;
    }

    @Override
    public void study() {
        System.out.println("MiddleStudent.study");
    }

    @Override
    public void eat() {
        System.out.println("MiddleStudent.eat");
    }
}

SmallTeacher

public class SmallTeacher extends Teacher implements SmallInterface,MiddleInterface{

    //技能
    String skill;

    public SmallTeacher(){
        this("能歌善舞");
    }

    public SmallTeacher(String skill) {
        this.skill = skill;
    }

    public void findParent(){
        System.out.println("SmallTeacher.findParent" + "有问题找家长");
    }

    public String getSkill() {
        return skill;
    }

    public void setSkill(String skill) {
        this.skill = skill;
    }

    @Override
    public String toString(){
        String str = "姓名:" + name + ";年龄:" + age + ";技能" + skill  + ";学科:" + subject + ";工资:" + money;

        return str;
    }

    @Override
    public void teachStudent() {
        System.out.println("SmallTeacher.teachStudent" + this);
    }

    @Override
    public void eat() {
        System.out.println("SmallTeacher.eat" + this);
    }

    @Override
    public void dance(){
        System.out.println("SmallTeacher.dance" + this);
    }

    @Override
    public void english() {
        System.out.println("SmallTeacher.english" + this);
    }
}

MiddleTeacher

public class MiddleTeacher extends Teacher implements  SmallInterface,MiddleInterface{

    String otherJob;

    public MiddleTeacher(){
        this("带孩子");
    }

    public MiddleTeacher(String otherJob) {
        this.otherJob = otherJob;
    }

    @Override
    public String toString(){
        String str = "姓名:" + name +"职业:" + otherJob + ",学科:" + subject + ",工资:" + money;

        return str;
    }

    @Override
    public void teachStudent() {
        System.out.println("MiddleTeacher.teachStudent" + this);
    }

    @Override
    public void eat() {
        System.out.println("MiddleTeacher.eat" + this);
    }

    @Override
    public void english() {
        System.out.println("MiddleTeacher.english" + this);
    }

    @Override
    public void dance() {
        System.out.println("MiddleTeacher.dance" + this);
    }
}

接口MiddleInterface

public interface MiddleInterface {

    //会英语
    public void english();
}

接口SmallInterface

public interface SmallInterface {

    //会跳舞
    public void dance();
}

ComplexManager

import java.util.Random;

public class ComplexManager {
    public static void test() {

        //创建一个Person数组,用来保存所有对象
        Person[] persons = new Person[10];

        for (int i = 0; i < persons.length; i++) {
            Person p =null;
            if(i % 2 == 0) {
                //p = createPerson(1);
                p = createPerson(3);
            }
            else{
                //p = createPerson(2);
                p = createPerson(4);
            }
            if(p != null){
                persons[i] = p;
            }
        }

        //测试每一个对象的使用
        for (int i = 0; i < persons.length; i++) {
            //打印当前对象的额值
            System.out.println(persons[i]);
            //测试当前的方法调用
            print(persons[i]);
        }
    }

    public static void print(Person p){
        //检查当前对象类型
        if(p instanceof SmallStudent){
            SmallStudent s = (SmallStudent)p;
            s.playGame();
            System.out.println();
        }
        else if(p instanceof MiddleStudent){
            MiddleStudent m = (MiddleStudent)p;
            m.study();
            System.out.println();
        }

        //检查当前对象是否实现了指定接口
        if(p instanceof MiddleInterface){
            ((MiddleInterface)p).english();

        }
        if(p instanceof SmallInterface){
            ((SmallInterface)p).dance();
        }

    }

    public static void printTeacher(Person q){
        //检查当前对象类型
        if(q instanceof SmallTeacher){
            SmallTeacher st = (SmallTeacher)q;
            st.english();
            System.out.println();
        }
        else if(q instanceof MiddleTeacher){
            MiddleTeacher mt = (MiddleTeacher)q;
            mt.dance();

        }
    }


    //获得指定长度的随机字符串
    private static String randomString(int length){
        String source = "abcdefghijklmnopqrstuvwxyz";
        Random random = new Random();
        String result = "";

        for (int i = 0; i < length; i++) {
            int index = random.nextInt(source.length());
            //从原字符串中获取指定索引位置字符
            result += source.charAt(index);

        }
        return result;
    }

    //创建一个随机学科
    private static String randomStringTeacher(){
        Random a = new Random();


        String[] randombOject = new String[3];
        randombOject[0] = "Math";
        randombOject[1] = "China";
        randombOject[2] = "English";
        String b = " ";
        for (int i = 0; i < randombOject.length; i++) {
            b = randombOject[a.nextInt(2)];
        }
        return b;

    }

    public static Person createPerson(int type){

        Person p = null;


        Random r = new Random();

        Random me = new Random();

        switch(type){
            case 1:
                //创建一个小学生对象
                SmallStudent  s = new SmallStudent();

                String name = randomString(5);
                s.setName(name);
                int age = r.nextInt(6) + 6;
                s.setAge(age);
                String love = randomString(10);
                s.setLove(love);
                int number =1000 + SmallStudent.count;
                s.setNumber(number);
                String schoolName = randomString(15);
                s.setSchoolName(schoolName);

                p = s;
                System.out.println();
                break;
            case 2:
                //创建一个中学生对象
                MiddleStudent m = new MiddleStudent();
                name = randomString(5);
                m.setName(name);
                age = r.nextInt(6) + 12;
                m.setAge(age);
                String friend = randomString(5);
                m.setFriend(friend);
                number = 2000 + MiddleStudent.count;
                m.setNumber(number);
                schoolName = randomString(15);
                m.setSchoolName(schoolName);

                p = m;
                System.out.println();
                break;
            case 3:

                //创建一个小学老师对象
                SmallTeacher st = new SmallTeacher();
                name = randomString(4);
                st.setName(name);
                age = r.nextInt(10) + 20;
                st.setAge(age);
                String subject = randomStringTeacher();
                st.setSubject(subject);
                int money = me.nextInt(3000) + 3000;
                st.setMoney(money);

                p = st;
                System.out.println();
                break;
            case 4:
                //创建一个中学老师对象
                MiddleTeacher mt = new MiddleTeacher();
                name = randomString(4);
                mt.setName(name);
                age = r.nextInt(30) + 30;
                mt.setAge(age);
                subject = randomStringTeacher();
                mt.setSubject(subject);
                money = me.nextInt(3000) + 7000;
                mt.setMoney(money);

                p = mt;
                System.out.println();
                break;

        }

        return p;
    }
}

Keyboard

import com.qf.java1904.day12.Usb;
import com.qf.java1904.day12.Vga;

public class Keyboard implements Usb, Vga {
    @Override
    public void connect() {
        System.out.println("Keyboard.connect");
    }

    @Override
    public void vgaConnect() {

    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值