1.接口是什么?

  接口可以理解为一个特殊的抽象类,是由全局常量和公共抽象方法组成的。

  所以,如果,一个抽象类的方法都是抽象的,那么就可以通过接口的形式来表示。

  class 用于定义类

  interface 用于定义接口

2.接口中成员定义的格式:

  常量  public static final

  抽象方法  public abstract(这里的抽象方法必须有public修饰)

3.接口是不可以创建对象的,因为有抽象方法,必须被子类实现,子类对接口中的方法全部覆盖后,子类才可以实例化。(抽象类是不可以实例化的)

4.接口的最大任务就是实现多态。

interface Inter{public static final int NUM=3;public abstract void show();
}
interface InterA{public abstract void show();
}
class Demo{public void function(){};
}
class Test extends Demo implements Inter,InterA{public void show(){};
}
//可以看到这个Test类既继承了Demo类,又实现了Inter,InterA接口,所以既具备了Demo的功能,又具备了接口的功能,这样就扩展了Test的功能
class InterfaceDemp{public static void main(String[] args){Test t=new Test();System.out.println(t.NUM);}
}

5.关于抽象类

栗子1:

abstract class Student{abstract void study();abstract void study1();
}
class BaseStudent extends Student{void study(){System.out.println("base study");}void study1(){System.out.println("base study1");}
}
//可以看到子类必须覆盖抽象类中所有的方法,如果子类只覆盖了部分抽象方法,则该子类还是个抽象类。

  注意:(1)抽象类中可以不存在任何成员,可以有非抽象方法。

     (2)抽象类可以被抽象类继承,结果还是抽象类。

     (3)抽象类只能作为其他类的基类,不能直接被实例化。

     (4)如果一个非抽象类从抽象类这派生,则其必须通过覆盖来实现所有继承而来的抽象成员。

栗子2:

abstract class Person{public abstract void sayHello();public void about(){System.out.println("sayHello");}
}
class Nurse extends Person{//建立实体类Nurse继承Person//没有覆盖抽象方法sayHello,这个类是错误的。
}
abstract class Worker extends Person{//建立抽象类Worker继承Person//抽象类继承抽象类,可以不覆盖抽象方法sayHello,这个类是正确的。
}

也就是说,子类继承父抽象类的时候,必须继承父类里面的抽象方法。哪怕用空的表示也是可以的

如:父类中有abstract public void myfunc();

  子类中,就可以这样,public void myfunc(){};  

栗子3:

关于抽象类与最终类(final修饰的类),下列说法错误的是?D错误

  A.抽象类能被继承,最终类只能被实例化。

  B.抽象类和最终类都可以被声明使用

  C.抽象类中可以没有抽象方法,最终类中可以没有最终方法

  D.抽象类和最终类被继承时,方法可以被子类覆盖

解释:抽象类时专门拿来被继承的,其实也可以没有抽象方法。抽象类是不能实例化的,实例化必将加载类,然后根本不知道抽象方法的方法体大小,所以不能实例化。

而final类,之所以被定义为final类是认为这个类已经很完美了,不希望被继承被扩展或者被修改。不可以被覆盖。
栗子4:

  方法的重写(override)两同两小一大原则:

  A.方法名相同,参数类型相同

  B.子类返回类型小于等于父类方法返回类型,

  C.子类抛出异常小于等于父类方法抛出异常,

  D.子类访问权限大于等于父类方法访问权限。

  已知如下类定义:

class Base {  public Base (){ //... }  public Base ( int m ){ //... }  public void fun( int n ){ //... }
}
public class Child extends Base{  // member methods
}

  如下哪句可以正确地加入子类中?  D

   A.private void fun( int n ){ //...}

   B.void fun ( int n ){ //... }
   C.protected void fun ( int n ) { //... }

   D.public void fun ( int n ) { //... }

子类方法的权限至少要大于父类方法的权限,只能选D

栗子5:

下面代码运行结果是(A)

public class Test{ public int add(int a,int b){   try {return a+b;      } catch (Exception e) {  System.out.println("catch语句块");}finally{ System.out.println("finally语句块");}return 0;} public static void main(String argv[]){ Test test =new Test(); System.out.println("和是:"+test.add(9, 34)); }
} 

  A.finally语句块

   和是:43

  B.和是:43

   finally语句块

解释:1.finally{}代码块比return先执行。
2.多个return是按顺序执行的的,多个return执行了一个后,后面的return就不会执行了。
3. 记住一点,不管有不有异常抛出, finally都会在return返回前执行。

6.继承

  (1)在Java中,只支持单继承(一个类只能有一个父类)

  (2)字符类出现后,类中成员的特点也有所改变

    1)变量:

     --- 如果子类中出现非私有的同名成员变量时,子类要访问本类中的变量,用this(this代表本类对象的引用)

     --- 如果子类要访问父类的同名变量,用super (代表父类对象的引用)

class Fu{int num=4;
}
class Zi extends Fu{int num=5;void show(){System.out.println(super.num);//访问父类中的同名变量,用superSystem.out.println(this.num);//访问本类中的变量,用this}
}
class ExtendsDemo{public static void main(String[] args){Zi z=new Zi();//new一产生,就会先加载父类的class Fu,然后再加载子类class Ziz.show();}
}

    2)子父类函数的特点——覆盖(重写)

      --- 子类覆盖父类必须保证子类权限大于父类权限,如父类中定义void show(){},而子类中确实private void show(){},这样子类就不能覆盖父类

      --- 静态只能覆盖静态

    3)字符类中的构造函数

      在子类对象进行初始化时,父类的构造函数也会运行,那是因为子类中所有的构造函数默认第一行有一条隐式语句super();

      这个super()回访问父类中空的构造函数。super.属性,可以访问父类的属性。

class Fu{Fu(int x){//父类的构造函数System.out.println("Fu:"+x);}
}
class Zi extends Fu{Zi(){//子类构造函数super(4);//这个要手动自己去定义,访问指定的父类构造函数}Zi(int x){this();//这个就是访问自己本类中的构造函数了,Zi(){}}
}

  总结:继承会破坏封装性,因为会将父类的实现细节暴露给子类

栗子:

  对文件名为Test.java的java代码描述正确的是(C)

class Person {String name = "No name";public Person(String nm) {name = nm;}
}
class Employee extends Person {String empID = "0000";public Employee(String id) {empID = id;}
}
public class Test {public static void main(String args[]) {Employee e = new Employee("123");System.out.println(e.empID);}
}

  A.输出:0000

  B.输出:123

  C.编译报错

  D.输出:No name

解释:

  子类在实例化过程中,一定要访问父类中的构造函数。而且默认都会访问父类中空参数的构造函数。如果父类中没有空参数的构造函数时,子类必须手动通过super语句形式访问父类中的构造函数。

  所以题目中,子类Employee中没有super(nm);所以编译会有错误。

如:

class Person{private String name;private int age;public Person(String name,int age){this.setName(name);this.setAge(age);
}
}
class Student extends Person{private String school;public Student(String name,int age,String school){super(name,age);this.setSchool(school);
}
}

  可以看到子类Student中,有super(name,age)

    

转载于:https://www.cnblogs.com/GumpYan/p/5740048.html

接口抽象类继承父类和子类相关推荐

  1. java类注解是否可以通过实现接口或继承父类的方式获得

    接口类 @Service public interface UserService {public void get(); } 实现类 public class UserServiceImpl imp ...

  2. C++ 继承: 父类与子类构造函数与析构函数的关系

    C++ 继承: 父类与子类构造函数与析构函数的关系 一句话:调用子类构造函数时,父类的先调用,然后调用子类的构造函数.调用子类的析构函数时,先调用子类的析构函数,然后调用父类的析构函数. 例:点类,点 ...

  3. java 接口 抽象类 继承 重载 重写 多态

    4.1 抽象类 在面向对象领域由于抽象的概念在问题领域没有对应的具体概念,所以用以表征抽象概念的抽象类是不能实例化的. 同时,抽象类体现了数据抽象的思想,是实现多态的一种机制.它定义了一组抽象的方法, ...

  4. java子类继承父类_子类可以继承父类的什么

    展开全部 子类可以获得除private权限以外的所有父类属性,但是: 1.在子类继承62616964757a686964616fe58685e5aeb931333431343130父类的时候,子类必须 ...

  5. A 子类继承父类,子类的构造函数会覆盖父类的构造函数

    //子类 没有定义 构造 函数时,默认继承父类的构造方法:输出结果为 Class A... // 子类 定义了 构造 函数时,就不会继承父类的构造方法:输出结果是  Class B... <?p ...

  6. C++ 单继承 父类和子类

    1.如果派生类的继承方式为public,则这样的派生类称为基类的子类: 2. C++ 允许父类指针指向子类对象,父类引用子类对象,无须通过强制类型转换保持赋值类型相容,因为子类对象isa父类对象,编译 ...

  7. php 继承 父类使用子类,在PHP中使用 来 实现子类和父类之间的继承 。

    在PHP中使用 来 实现子类和父类之间的继承 . 更多相关问题 在迄今为止的工业社会,相对于其他要素来说,知识是最为重要也是最为稀缺的. 人们要成为现实的旅游者必须具有旅游动机足够的可以自由支配收入和 ...

  8. c++继承父类的子类,如何调用父类的同名函数?

    https://blog.csdn.net/qq_26399665/article/details/52080215 子类调用父类的同名函数: 子类和父类返回值参数相同,函数名相同,有virtual关 ...

  9. java 中普通类继承,抽象类继承,接口类继承,子类一定要重写父类中的方法吗

    一.简单总结,需要重写的有 普通类继承抽象类,重写所有抽象类方法:(不包括普通方法) 普通类继承接口,重写所有接口方法.(不包括default关键字修饰的方法) 详解见下: 普通类继承,并非一定要重写 ...

最新文章

  1. 风控算法最常见的知识WOE讲解!
  2. Redis集群CentOS系统配置企业级数据备份方案以及数据恢复的操作(在开启AOF功能下恢复冷备RDB文件数据,保持AOF和RDB双开情况下恢复数据及错误的数据恢复步骤详解)
  3. Python学习:基本概念
  4. 同一类的不同对象,在调用相同的成员函数时,入口地址是相同的
  5. disruptor入门
  6. ETL异构数据源Datax_图形化数据同步_11
  7. WinForm 中 comboBox控件之数据绑定
  8. rvm的安装, 使用rvm, 安装ruby, 以及gem的使用 (转)
  9. [洪流学堂]Hololens开发高级篇5:空间映射(Spatial mapping)
  10. JavaScript——创建运动框架
  11. 洛谷 P1137 旅行计划
  12. pip install报错_【Python】pip install django报错
  13. 怎样在计算机桌面上安装驱动器,怎么用韩博士驱动助理安装电脑驱动
  14. kirin710f是什么处理器_hisiliconkirin710是什么处理器
  15. HanLP-命名实体识别总结
  16. OCR识别数学公式图片,获得原始公式代码
  17. 基于ibeacons三点定位(微信小程序)
  18. 42-表格表单和简单CSS引用
  19. 【博弈论】Nim游戏
  20. Jenkins教程(一)安装Jenkins

热门文章

  1. Python3 requests post 中文乱码 UnicodeEncodeError: ‘latin-1‘ codec can`t encode characters in ……
  2. ToDesk远程控制软件
  3. navicate破解失败后删除注册表
  4. BZOJ4197 [Noi2015]寿司晚宴 【状压dp】
  5. 使用C#创建SQLite控制台应用程序
  6. PHP实现支付宝即时到账功能
  7. Pidgin Portable 使用点滴
  8. 什么心态阻碍了你职业的发展
  9. 用owncloud 打造自己的云盘
  10. Uploadify v3.2.1