JAVA学习总结(四)

1.接口 interface

1.1语法:

  修饰符 interface 接口名{
    常量
    都是抽象方法
  }

修饰符:默认 | public
接口名:自定义,规则与类名相同,一般I字母打头:wifi接口(Iwifi)

//示例:
    public interface Iwifi{
        int COUNT=1;
        public abstract void send();//发送
        public void receive();//接收

    }

1.2接口与类的区别:  

  接口不能用于实例化对象。
  接口没有构造方法。
  接口中所有的方法必须是抽象方法。
  接口不能包含成员变量,除了 static 和 final 变量。
  接口不是被类继承了,而是要被类实现。
  接口支持多重继承。

1.3接口特性:

  1.接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。

  2.接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误。

  3.接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

1.4、为什么需要接口

继承:描述事物的自然属性和行为的复用。

接口:描述事物的社会属性和行为的复用。

1、重要性:在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制。正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力。

2、简单、规范性:如果一个项目比较庞大,那么就需要一个能理清所有业务的架构师来定义一些主要的接口,这些接口不仅告诉开发人员你需要实现那些业务,而且也将命名规范限制住了(防止一些开发人员随便命名导致别的程序员无法看明白)。

3、维护、拓展性:比如你要做一个画板程序,其中里面有一个面板类,主要负责绘画功能,然后你就这样定义了这个类。

4、安全、严密性:接口是实现软件松耦合的重要手段,它描叙了系统对外的所有服务,而不涉及任何具体的实现细节。这样就比较安全、严密一些(一般软件服务商考虑的比较多)。

因为类具有“单根性”,所有的类只能有一个直接父类,通过可以实现一个类有多个父类,可以实现多重继承。

java特点之一:单一继承,但能实现多个接口。

1.5、接口的特点

1)、接口中的方法可以有参数列表和返回类型,但不能有任何方法体。

2)、接口中可以包含字段,但是会被隐式的声明为static和final。

3)、接口中的字段只是被存储在该接口的静态存储区域内,而不属于该接口。

4)、接口中的方法可以被声明为public或不声明,但结果都会按照public类型处理。

5)、当实现一个接口时,需要将被定义的方法声明为public类型的,否则为默认访问类型,Java编译器不允许这种情况。

6)、如果没有实现接口中所有方法,那么创建的仍然是一个接口。子类必须实现接口中未实现的方法,除非子类也是接口。

7)、扩展一个接口来生成新的接口应使用关键字extends,实现一个接口使用implements。

8)、接口中的方法是抽象方法(abstract),不能是静态方法(static))、接口的所有方法都是抽象的,而抽象方法是没有static,有static的方法是不能override的,所以这样定义接口才有意义。

接口中的字段是默认为:static final ,通俗说就是常量。

1.6类如何实现接口:

//示例:
    public class Mobile implements IWifi{
        public void send1(){
            System.out.println("用wifi发送信息");
        }
        public void receive1(){
            System.out.println("用wifi接收信息");
        }
        public void send(){
            System.out.println("用手机发短");
        }
    }

注意:
  1.类如果没有实现全部的抽象方法,这个类必须定义为抽象类implements关键字
  2.接口可以被子接口继承,使用extends关键字
  3.子类可以继承一个父类,实现多个接口
  4.接口不能实例化对象,但接口类型变量可以引用实现的子类对象

//示例:
    public interface IUSB2{
        public abstract void send2();
        public void receive2();
    }

    public interface IUSB3 extends IUSB2{
        public abstract void connection(IUSB3 usb);
    }
//示例:继承一个父类,实现多个接口
public class Computer{
    public void downLoad(){}
    public void upLoad(){}
    ...
}
public class Dell_Computer extends Computer implements IWifi,IUSB3{
    public  void connection(IUSB3 ortherUsb){
        System.out.println("this<-->ortherUsb");
        System.out.println("连接USB3.0设置");
    }
    public  void send1(){
        System.out.println("用wifi发送信息");
    }
    public void receive1(){
        System.out.println("用wifi接收信息");
    }
    public  void send2(){
        System.out.println("用USB3.0发送信息");
    }
    public void receive2(){
        System.out.println("用USB3.0接收信息");
    }
}

接口不能实例化对象,但接口类型变量可以引用实现的子类对象

IWifi wifi设备1 = new Mobile();
Mobile 手机= new Mobile();
wifi设备1 可以访问的方法:send1()和receive1();
手机 可以访问的方法:send1(),receive1(),send();

IWifi wifi设备2 = new Dell_Computer();
IUSB2 设备3 = new Dell_Computer();
IUSB3 设备4 = new Dell_Computer();
Computer 电脑 = new Dell_Computer();
Dell_Computer 笔记本 = new Dell_Computer();

wifi设备2 可以访问的方法:send1()和receive1();
设备3 可以访问的方法:send2()和receive2();
设备4 可以访问的方法:send2(),receive2()和connection(参数);
电脑 可以访问的方法:downLoad()和upLoad();
笔记本 可以访问的方法:send1(),receive1(),send2(),receive2(),connection(参数),downLoad()和upLoad();

二、抽象类

2.1、语法定义

抽象类定义,抽象类前使用abstract关键字修饰,则该类为抽象类。

2.2、用途

a、在某些情况下,某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法
(抽象类约束子类必须有哪些方法,但并不关注子类怎么去实现这些方法。)

b、从多个具有相同特征的类中抽象出一个抽象类,以这个抽象类作为子类的模板,从而避免了子类设计的随意性。

2.3、意义

限制规定子类必须实现某些方法,但不关注实现细节。

2.4、特点

1,抽象方法一定在抽象类中

2,抽象方法和抽象类都必须被abstract关键字修饰

3,抽象类不可以用new创建对象。因为调用抽象方法没意义4,抽象类中的抽象方法要被使用,必须由子类复写起所有的抽象方法后,建立子类对象调用。

如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。

5、抽象方法没有方法体,以分号结束

//示例
package com.zhangguo.chapter5.s2;

import java.util.Scanner;

/** 动物 */
public abstract class Animal {
    /** 名称 */
    public String name;

    /** 抽象方法,无方法体,必须被子类实现(重写) */
    public abstract void eat();

    /**测试*/
    public static void main(String[] args) {
        //LSP 里氏替换原则
        Animal dog=new Dog();
        dog.name="博美";
        //int i=1;
        //Scanner input=new Scanner(System.in);
        dog.eat();
    }

    /**抽象类中可以有非抽象方法,可以有静态方法*/
    public void show(){};
}

/**抽象类动物(Animal)的子类,必须实现父类未实现的方法*/
class Dog extends Animal {
    //注解
    @Override
    public void eat() {
        System.out.println(this.name+"狗在吃骨头");
    }
}

运行结果:

2.5抽象类和接口的区别:

共同点与区别:
  1.继承的层次结构都是上层。
  2.都不能实例化对象。
  3.接口所有方法都是抽象,变量都是public static final类型,抽象类可以有抽象方法和常量。
  4.抽象类只能作为唯一的父类,接口可以实现多个也可以被继承。
  5.抽象类由abstract class定义,接口由interface定义。
  6.父类与子类是"is a"的关系,父类是抽象类,父类与子类是"like a"的关系,父类是接口。

三、Final(最终的)

3.1、final修饰类

  final修饰的类不允许被继承。

  一个类不能既是final的,又是abstract的。因为abstract的主要目的是定义一种约定,让子类去实现这种约定,而final表示该类不能被继承,两者矛盾。

3.2、final修饰方法

  final修饰方法,表示该方法不能被子类中的方法覆写Override。不能被重写

3.3、final修饰变量

  final成员变量表示常量,只能被赋值一次,赋值后值不再改变。

  当final修饰一个原生数据类型时,表示该原生数据类型的值不能发生变化;

  如果final修饰一个引用类型时,表示该引用类型不能再指向其他对象了,但该引用所指向的对象的内容是可以发生变化的。

  本质上是一回事,因为引用的值是一个地址,final要求值,即地址的值不发生变化。

  final修饰一个成员变量(属性),必须要显示初始化。

  这里有两种初始化方式,一种是在变量声明的时候初始化;第二种方法是在声明变量的时候不赋初值,但是要在这个变量所在的类的所有的构造函数中对这个变量赋初值。

  当函数的参数类型声明为final时,说明该参数是只读型的。

  

时间: 2024-10-08 14:54:21

JAVA学习总结(四)的相关文章

从.Net到Java学习第四篇——spring boot+redis

从.Net到Java学习第一篇——开篇 从.Net到Java学习第二篇——IDEA and start spring boot 从.Net到Java学习第三篇——spring boot+mybatis+mysql 接上一篇,本篇使用到的框架redis.FastJSON. 环境准备 安装redis,下图是我本机的redis绿色版,你可以网上自行下载安装,如果不知道如何怎么操作,可以移步到我的另一篇文章:ASP.NET Redis 开发 以管理员身份打开CMD窗口: C:\Users\zouqj>e

Java学习笔记四(代码块 )

1 代码块的分类:java中的代码块是指使用{}括起来的一段代码,根据位置不同可以分为四种: 普通代码块 构造快 静态代码块 同步代码块 今天主要学习前三种代码块,同步代码块在学习到多线程部分的时候再加学习. 2 普通代码块:直接定义在方法中的代码块,如下: public class CodeSpace { public static void main(String args[]){ { int x = 30; System.out.println("普通代码块x="+x); } /

JAVA学习第四十七课 — IO流(一):文件的读写

输入流和输出流相对于内存 将外部设备的数据读取到内存中:输入 将内存中的数据写入外部设备中:输出 IO流常用基类 字节流的抽象基类:InputStream,OutputStream 字符的抽象基类:Reader,Writer PS:由这四个流派生出的子类都是以父类名作为后缀名 如:InputStream的派生类FileInputStream,Reader的派生类FileReader PS:如果是文字形式的数据应该优先考虑字符流,且将数据从内存写到硬盘上应该是Writer FileWriter类

java学习 第四天 数组

数组是有序数据的集合,数组中的每个元素具有相同的数组名和下标来唯一地确定数组中的元素. §5.1一维数组 一.一维数组的定义 type arrayName[]; 其中类型(type)可以为Java中任意的数据类型,包括简单类型组合类型,数组名arrayName为一个合法的标识符,[]指明该变量是一个数组类型变量.例如: int intArray[]; 声明了一个整型数组,数组中的每个元素为整型数据.与C.C++不同,Java在数组的定义中并不为数组元素分配内存,因此[]中不用指出数组中元素个数,

java学习笔记四:static的几个角落及小谈多态

最近有点事情,没有及时更新笔记,学习不可弃,总结一下最近的学习,其中重点是static的一些应用,多态是一种设计理念,了解较容易,想如火纯清的确不是一件容易的事情. 对于static,主要有两点是我所学习的. 1.首先简单的介绍一下static的定义.static是静态的意思,就是说这个类变量或者类方法不需要实例化就可以使用.使用static的变量是类变量,也成为静态域(static field).这些是static的基本语义,了解了这些,继续向下看. java核心技术(卷一)对于静态有这样一段

JAVA学习第四十二课 — 泛型(二)—泛型接口&amp;&amp;通配符应用

一.泛型接口 interface Inter<T>{ public void show(T t); } class InterImple implements Inter<String>{//知道是字符串类型 public void show(String str){ System.out.println("show "+str); } } class InterImple_2<Q> implements Inter<Q>{//不知道是什

JAVA学习笔记(四十七)- 事件监听

定义ActionListener接口的实现类实现事件监听 import java.awt.Button; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; /* * 事件监听 */ public class Te

JAVA学习笔记(四十九)- Swing相关组件

JFrame组件 import java.awt.Color; import javax.swing.JFrame; import javax.swing.JPanel; /* * Swing是在AWT基础上的扩展 * javax.swing包及其扩展包,组件的命名多以J开关 * * JFrame组件 */ public class Test08 { public static void main(String[] args) { JFrame frame=new JFrame("我的窗体&qu

JAVA学习第四十九课 — IO流(三):缓冲区2 &amp; 装饰设计模式

一.模拟BufferedReader 自定义MyBuffereaReader 对于缓冲区而言,里面其实就是封装一个数组,对外提供方法对数组的操作,这些方法最终操作的都是数组的角标 原理:从源中取出数据存入缓冲区,再从缓冲区不断的取出数据,取完后,继续从源中继续取数据,进缓冲区,直至源中的数据取完,用-1做为结束标记 import java.io.*; class MyBufferedReader { private FileReader fr; //定义数组作为缓冲区 private char[

java学习(四)代码的设计

一.目的 1.为了使程序员编写的代码更加的简洁,使人阅读起来更加流畅 2.将运算代码与界面代码完全分离开来,利于团队开发,提高团队之间的工作效率 3. 在很短的时间内可以替换整个站点的外观: 4.使程序员可以抽象编程,而无须接触HTML代码: 5.可以重复利用以前的模板. 二.示例 引用前一篇的记忆曲线的JSP文件 1.未进行分离的代码 1 <%@ page language="java" contentType="text/html; charset=UTF-8&qu