抽象类,接口(interface)与匿名对象

目录

抽象类

abstract:修饰方法和类

抽象方法特点

抽象类成员特点

抽象类的一些细节

接口

接口成员特点

接口与类的关系

接口与抽象类区别

例子

匿名对象


抽象类

abstract:修饰方法和类

  • 抽象方法:不同类的方法相似,但具体内容不太一样,抽取它的声明,没有具体方法体的方法.
  • 抽象类:有抽象方法的类必须是抽象类
  • 注意:一个类继承了抽象类需要重写他所有的抽象方法,否则这个类就得是抽象类

抽象方法特点

  • 抽象方法只能在抽象类中
  • 抽象类和抽象方法必须被abstract修饰
  • 抽象类不能创建对象(不能实例化)
  • 抽象类中可以有非抽象的方法
  • 抽象类和类的关系也是继承,一个类继承抽象类,要么本身定义为抽象类,要么重写所有抽象方法

抽象类成员特点

  • 可以有成员变量 ,可以有常量
  • 成员方法:可以有抽象方法,非抽象方法
  • 可以有构造方法,对抽象类成员变量初始化

抽象类的一些细节

  • 抽象类关键字abstract不能和final共存,因为其定义的成员变量不能被子类继承改写,不能与private共存,因为其修饰的成员变量不能被子类访问
  • 抽象类不能创建对象实例化,但是其本身具有构造函数,因为其本身具有成员变量并需要初始化,抽象类本身作为一个类需要被子类继承,过程需要调用父类构造
  • 抽象类必须含有抽象方法

接口

继承的特性是单一继承,接口可以实现多个继承,接口里的所有方法全是抽象方法,接口和类的关系是实现,implements

格式:  interface 接口名{ }

接口成员特点

  • 接口中只能有抽象方法,只能有常量
  • 默认且只能使用 public&abstract修饰方法      (建议主动加上默认修饰符)
  • 默认使用public static final 修饰成员变量

注意:接口不能创建对象(不能实例化)

类与接口的关系是实现关系,一个类实现一个接口必须实现它的所有方法

接口与类的关系

  • 类与类:继承关系,单一继承,多层继承
  • 类与接口:实现关系,多实现  (接口中都是抽象方法,可以同时被多个子类实现)
  • 接口与接口关系: 继承关系,多层继承

优点:  打破了继承的局限性

           对外提供规范(规则)

           降低了程序的耦合性 (实现模块化开发,定义好规则后每个人实现自己的模块,提高开发效率)

接口与抽象类区别

区别: Ⅰ与类的关系:

  •          接口与类的关系:实现关系,且是多实现,一个类可以对接多个接口
  •          抽象类与类关系:继承关系,且java中的继承是单一继承,多层继承,一个类只能有一个父类

          Ⅱ 成员变量:

  •           接口只能有常量
  •           抽象类可以有成员变量,可以有常量

               成员方法:

  •            接口只能有抽象方法,且方法有默认修饰符 public abstract
  •            抽象类可以有抽象方法,可以有非抽象方法

               构造方法

  •             接口没有构造方法
  •             抽象类有构造方法

共性:不断抽取出抽象的概念

例子

 

package CeShi;

/**
 * @author Lzy
 * @creat 2021-01-17-20:36
 */
public class InterfaceTest {
    public static void main(String[] args) {
//创建软件系学生对象
        SoftWare sw = new SoftWare();
        sw.name = "小李";
        sw.age = 20;
        sw.gender = "男";
        sw.eat();//继承父类student类继承的Person类实现 eat  sleep 方法
        sw.sleep();
        sw.study();// 继承student实现study
        sw.speak();//实现SpeakEnglish接口
        System.out.println("--------------");
//创建医学教师
        DoctorTeacher ct = new DoctorTeacher();
        ct.name = "大刘";
        ct.age = 50;
        ct.gender = "女";
        ct.eat();//继承Teacher类继承的 Person类实现 eat sleep 方法
        ct.sleep();
        ct.teach();//继承Teacher类实现 teach 方法
    }
}
class Person{
    String name;//姓名
    int age;//年龄
    String gender;//性别
//无参构造
    public Person(){}
//有参构造
    public Person(String name,int age,String gender){
        this.name = name;
        this.age = age;
        this.gender = gender;
    }
    //吃
    public void eat(){
        System.out.println("吃饭饭");
    }
    //睡
    public void sleep(){
        System.out.println("睡觉觉");
    }
}

//学生  继承Person类
abstract class Student extends Person{
    //学习
    public abstract void study();
}
//老师  继承Person类
abstract class Teacher extends Person{
    public abstract void teach();
}
//软件系  继承Student类  实现SpeakEnglish接口
 class SoftWare extends Student implements SpeakEnglish{
    @Override
    public void study(){
        System.out.println("学编程");
    }
    @Override
    public void speak(){
        System.out.println("说英语");
    }
}
//医学系 继承Student类 
 class Doctor extends Student{
    @Override
    public void study(){
        System.out.println("学医");
    }
}
//说英语
interface SpeakEnglish{
    public abstract void speak();
}
//软件老师  继承Teacher类  实现SpeakEnglish接口
class SoftWareTeacher extends Teacher implements SpeakEnglish{
    @Override
    public void teach(){
        System.out.println("教编程");
    }
    @Override
    public void speak(){
        System.out.println("说英语");
    }
}
//医学老师   继承Teacher类
class DoctorTeacher extends Teacher{
    @Override
    public void teach(){
        System.out.println("教医学");
    }
}

匿名对象

没有变量引用的对象,用于不需要创建变量直接调用对象的场景

 应用场景:当方法只调用一次时候可以使用

package CeShi;

/**
 * @author Lzy
 * @creat 2021-01-18-10:14
 */
public class Name {
    public static void main(String[] args) {
        //常规调用方法
        Students s = new Students();
        s.study();
        //匿名对象是没有变量引用的对象
        new Students().study();
    }
}

class Students{
    String name;
    int age;

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

可以当作参数进行传递,但无法在传参之前做其他事情

package CeShi;

/**
 * @author Lzy
 * @creat 2021-01-18-10:14
 */
public class Name {
    public static void main(String[] args) {
        //常规调用方法,可以对成员变量赋值并调用方法
        Students s = new Students();
        s.name = "比奇古";
        s.age = 18;
        method(s);
        System.out.println("---------");
        //匿名对象 无法在传参之前做其他事情
        method(new Students());
    }
    public static void method(Students s){
    }
}

class Students{
    String name;
    int age;
}

注意:匿名对象可以调用成员变量赋值,但赋值没有意义,因为赋值本身没有调用

 

全部评论

相关推荐

头像
10-13 18:10
已编辑
东南大学 C++
。收拾收拾心情下一家吧————————————————10.12更新上面不知道怎么的,每次在手机上编辑都会只有最后一行才会显示。原本不想写凉经的,太伤感情了,但过了一天想了想,凉经的拿起来好好整理,就像象棋一样,你进步最快的时候不是你赢棋的时候,而是在输棋的时候。那废话不多说,就做个复盘吧。一面:1,经典自我介绍2,项目盘问,没啥好说的,感觉问的不是很多3,八股问的比较奇怪,他会深挖性地问一些,比如,我知道MMU,那你知不知道QMMU(记得是这个,总之就是MMU前面加一个字母)4,知不知道slab内存分配器->这个我清楚5,知不知道排序算法,排序算法一般怎么用6,写一道力扣的,最长回文子串反问:1,工作内容2,工作强度3,关于友商的问题->后面这个问题问HR去了,和中兴有关,数通这个行业和友商相关的不要提,这个行业和别的行业不同,别的行业干同一行的都是竞争关系,数通这个行业的不同企业的关系比较微妙。特别细节的问题我确实不知道,但一面没挂我。接下来是我被挂的二面,先说说我挂在哪里,技术性问题我应该没啥问题,主要是一些解决问题思路上的回答,一方面是这方面我准备的不多,另一方面是这个面试写的是“专业面试二面”,但是感觉问的问题都是一些主管面/综合面才会问的问题,就是不问技术问方法论。我以前形成的思维定式就是专业面会就是会,不会就直说不会,但事实上如果问到方法论性质的问题的话得扯一下皮,不能按照上面这个模式。刚到位置上就看到面试官叹了一口气,有一些不详的预感。我是下午1点45左右面的。1,经典自我介绍2,你是怎么完成这个项目的,分成几个步骤。我大致说了一下。你有没有觉得你的步骤里面缺了一些什么,(这里已经在引导我往他想的那个方向走了),比如你一个人的能力永远是不够的,,,我们平时会有一些组内的会议来沟通我们的所思所想。。。。3,你在项目中遇到的最困难的地方在什么方面4,说一下你知道的TCP/IP协议网络模型中的网络层有关的协议......5,接着4问,你觉得现在的socket有什么样的缺点,有什么样的优化方向?6,中间手撕了一道很简单的快慢指针的问题。大概是在链表的倒数第N个位置插入一个节点。————————————————————————————————————10.13晚更新补充一下一面说的一些奇怪的概念:1,提到了RPC2,提到了fu(第四声)拷贝,我当时说我只知道零拷贝,知道mmap,然后他说mmap是其中的一种方式,然后他问我知不知道DPDK,我说不知道,他说这个是一个高性能的拷贝方式3,MMU这个前面加了一个什么字母我这里没记,别问我了4,后面还提到了LTU,VFIO,孩子真的不会。
走呀走:华子二面可能会有场景题的,是有些开放性的问题了
点赞 评论 收藏
分享
26应届求职ing:你这是报了豆音四哥的班?双非本硕拿这两个项目写简历里投100多家嵌软也没什么面试,感觉项目简单了,很多人用
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务