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);//访问父类中的同名变量,用super
System.out.println(this.num);//访问本类中的变量,用this
}
}
class ExtendsDemo{
public static void main(String[] args){
Zi z=new Zi();//new一产生,就会先加载父类的class Fu,然后再加载子类class Zi
z.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)

    

接口&抽象类&继承&父类和子类的更多相关文章

  1. java 接口 继承 接口 抽象类 继承 实体类

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 接口 可以 继承 接口 抽象类 可以 实现 接口 抽象类 继承实体类 需要 实体类 有 ...

  2. Net基础篇_学习笔记_第十二天_面向对象继承(父类和子类)

    继承 我们可能会在一些类中,写一些重复的成员,我们可以将这些重复的成员,单独的封装到一个类中,作为这些类的父类.Student.Teacher.Driver 子类  派生类Person         ...

  3. C#中通过类来继承两个接口,父类实例化接口中的方法,子类继承父类,调用方法

    实现了父类继承接口,父类实例化接口的方法,子类继承父类,子类调用父类的方法直接使用 代码如下: using System; using System.Collections.Generic; usin ...

  4. Python基础-接口与归一化设计、抽象类、继承顺序、子类调用父类,多态与多态性

    一.接口与归一化设计 Java接口是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为(功能). 由 ...

  5. 接口的定义——默认加public abstract默认全局常量;与继承不同,子类可以同时实现多个接口;抽象类实现接口;接口继承接口

    一. 接口的定义 接口中定义的方法,全部都为抽象方法,默认加public abstract 接口中定义的变量,全部为全局常量,默认加public static final 二.与继承不同,子类可以同时 ...

  6. C++ 子类继承父类纯虚函数、虚函数和普通函数的区别

    C++三大特性:封装.继承.多态,今天给大家好好说说继承的奥妙 1.虚函数: C++的虚函数主要作用是“运行时多态”,父类中提供虚函数的实现,为子类提供默认的函数实现.子类可以重写父类的虚函数实现子类 ...

  7. 【Java面试题】60 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法?

    接口可以继承接口.抽象类可以实现(implements)接口,抽象类可以继承具体类.抽象类中可以有静态的main方法. 问:  抽象类是否可继承实体类 (concrete class) 答: 抽象类是 ...

  8. 关于Java中的对象、类、抽象类、接口、继承之间的联系

    关于Java中的对象.类.抽象类.接口.继承之间的联系: 导读: 寒假学习JavaSE基础,其中的概念属实比较多,关联性也比较大,再次将相关的知识点复习一些,并理顺其中的关系. 正文: 举个例子:如果 ...

  9. 抽象类,interface接口,接口和继承的区别

    一.抽象类 需要抽象类的原因:父类方法不确定性的问题.考虑将该方法设计为抽象(abstract)方法所谓抽象方法就是没有实现的方法.所谓没有实现就是指,没有方法体.当一个类中存在抽象方法时,需要将该类 ...

随机推荐

  1. nginx配置https服务器

    方法一 1.创建证书 #cd /usr/local/nginx/conf #openssl genrsa -des3 -out server.key 1024 #openssl req -new -k ...

  2. Vue.js-项目目录结构解析

    1.Vue初始化项目目录如下: 2.目录各项含义如下:

  3. ubuntu linux查看cpu信息

    $ cat /proc/cpuinfo CPU核心数量 $ grep -c processor /proc/cpuinfo

  4. MSMQ学习笔记二——创建Message Queue队列

    一.创建Message Queue队列的主要流程 1.定义MQQUEUEPROPS 结构: 2.设置消息队列属性: 3.初始化MQQUEUEPROPS 结构: 4.调用MQCreateQueue创建队 ...

  5. bzoj1801 [Ahoi2009]中国象棋

    Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. Input 一行包含两个整数N, ...

  6. http知识补充

    在我的职业生涯中,没怎么重视过这http四个字,想当然的觉得不就是个网页请求嘛就没怎么当回事,而且很多http相关的长篇大论一听就困,真心是弄不下去,但是就是这种观念导致我后期的工作中不断的挖坑,不断 ...

  7. spring中使用i18n(国际化)

    简单了解i18n i18n(其来源是英文单词internationalization的首末字符i和n,18为中间的字符数)是“国际化”的简称.在资讯领域,国际化(i18n)指让产品(出版物,软件,硬件 ...

  8. Vue nodejs商城项目-搭建express框架环境

    1.express-project 搭建express框架环境 安装express generator生成器 通过生成器自动创建项目 配置分析 安装 cnpm i -g express-generat ...

  9. python与consul 实现gRPC服务注册-发现

    背景 通过对gRPC的介绍我们知道,当正常启动服务后,我们只需要知道ip,port就可以进行gRPC的连接.可以想到,这种方式并不适合用于线上环境,因为这样直连的话就失去了扩展性,当需要多机部署的时候 ...

  10. Element表单验证(1)

    Element表单验证(1) 首先要掌握Element官方那几个表单验证的例子,然后才看下面的教程. Element主要使用了async-validator这个库作为表单验证 async-valida ...