1、interface接口

(1)[修饰符] interface 接口名 extends 父接口1,父接口2....
       •没有构造方法,不能实例化;
       •接口只能继承接口,不能继承类
       •接口里没有普通方法,方法全是抽象的;
       •接口里的方法默认修饰符是public abstract
       •接口里的字段全是全局常量,默认修饰符是public static final;
(2)接口里的成员包括(主要是前两个):
       •全局常量
       •公共的抽象方法
       •内部类(包括内部类,内部接口,内部枚举类);
使用接口
格式 : public class SubImpl  extends Super  implements IA,IB
 
•接口的实现必须在 extends 之后;
•实现接口的方法必须是 public 类型
•接口不能创建实例,但是可以声明引用类型的变量。
       •此时,引用类型的变量必须指向到其实现类对象。
       •IStudent s = new String();//
       •IStudent s = new StudentImpl();//
2、接口和抽象类异同点
(1)相同点:
       •都位于继承的顶端,用于被其他实现或继承;
       •都不能实例化;
       •都包含抽象方法,其子类都必须覆写这些抽象方法;
(2)区别:
       •抽象类为部分方法提供实现,避免子类重复实现这些方法,提供代码重用性;接口只能包含抽象方法;
       •一个类只能继承一个直接父类(可能是抽象类),却可以实现多个接口;(接口弥补了Java的单继承)
(3)二者的选用:
       •优先选用接口,尽量少用抽象类;
       •需要定义子类的行为,又要为子类提供共性功能时才选用抽象类;
3、内部类
(1)类中有类
       •内部类:嵌套类
       •外部类:宿主类
(2)把内部类隐藏在外部类之内,不许同包的其他类访问该类;
(3)内部类可以访问外部类的私有数据,外部类不能访问内部类的实现细节,比如字段;
(4)观察编译后的字节码文件
(5)非静态内部类;静态内部类,局部内部类;
(6)匿名内部类适合于仅使用一次使用的类;
A、非静态内部类
     Ø若外部类字段,内部类字段,内部类方法变量同名,则其访问方式分别是:
        •访问外部类的字段:外部类类名.this.字段
        •访问内部类字段:this.字段
        •访问内部类方法的局部变量:字段
非静态内部类例子:
打印结果:
             把局部变量添加到尾巴
             把内部类属性添加到尾巴
             把外部类属性添加到尾巴
第三个Snake.this.name也可以这样访问new Snake().name
在外部类以外访问非静态内部类
(1)外部类不能用private修饰,否则不能访问
(2)外部类以外的地方定义内部类变量
       •OuterClass.InnerClass varName ;
(3)非静态内部类对象是存放在外部类的对象里的,因此在创建非静态内部类对象之前,必须先创建其外部类的对象
       •OuterInstance.new InnerClass([参数列表]);
public class InnerDemo {
public static void main(String[] args) {
//Outer.Inner in = new Outer().new Inner();
Outer.Inner in;
Outer out = new Outer();
in = out.new Inner();
//in.inShow();
//Outer out = new Outer();
//out.outShow();
}
} class Outer {
class Inner {
public void inShow() {
System.out.println("inShow");
}
}
public void outShow(){
//System.out.println("outShow");
Inner in = new Inner();
in.inShow();
}
}
在外部类以外访问非静态内部类例子
B、静态内部类
(1)使用static修饰内部类,该内部类属于其外部类,而不属于外部类的实例;
(2)静态内部类可包括静态成员也可包括非静态成员。根据静态成员不能访问非静态成员的规定,所以静态内部类不能访问外部类实例成员,只能访问外部类的静态成员;
在外部类以外访问静态内部类
(1)因为静态内部类是外部类的类成员,因此在创建内部类对象时不需创建外部类的对象;
(2)创建内部类对象:
       •new OuterClass.InnerClass([参数列表])
       •注:静态内部类的全名应该是OuterClass.InnerClass,所以要看作是一个整体;
在外部类以外访问静态内部类例子
 
C、局部内部类
(1)局部内部类:定义在方法里的内部类;
(2)特点:不能在宿主类以外的地方使用,局部内部类也不能使用访问修饰符和static修饰;
(3)对于局部变量,局部内部类只能访问方法中final修饰的局部变量,因为final修饰的变量相当于一个常量,其生命周期超出了方法运行的生命周期;
       对于全局变量,局部类是可以访问的(例如下图中的name全局变量)
  
D、匿名内部类
(1)适合只使用一次的类
       •不能是抽象类,因为系统在创建匿名内部类的时候,会立即创建匿名内部类的对象。
       •匿名内部类不能定义构造器,因为匿名内部类没有类名。 
格式:
new 父类构造器([实参列表]) 或 接口()
{
    //匿名内部类的类体部分
}
注意:匿名内部类必须继承一个父类或者实现一个接口,但最多只能一个父类或实现一个接口; 
创建匿名内部类时会立即创建一个该类的实例,这个类定义立即消失,匿名内部类不能重复使用。    
4、枚举
(1)使用enum声明,默认直接继承了java.lang.Enum类,而不是Object类;
(2)枚举类的对象是固定的,实例个数有限,枚举对象后可以跟()。
(3)枚举元素是指如下这样的定义,必须位于枚举类体中的最开始部分,枚举元素后要有分号与其他成员分隔。
enum Weekend
{
MONDAY,
TUESDAY
}

而枚举元素MONDAY、TUESDAY等价于:public static final Weekend MONDAY = new Weekend();

Weekend monday1 = Weekend.MONDAY;
Weekend monday2 = Weekend.MONDAY;
System.out.println(monday1 = monday2); // true

(4)枚举类的构造方法的权限修饰符默认是private;

(5)一旦枚举对象后面加上{},那么该对象实际是枚举匿名内部类对象;
(6)所有枚举类都提供一个静态的values()方法(返回该枚举类所有对象组成的数组),便于遍历所有枚举对象;
(7)所有枚举类都提供一个静态的valueOf(String name)方法, 返回枚举类中对象名等于 name的对象。 
public enum Color{
RED(), GREEN(){}, BLUE{};
}
Java5开始出现枚举:
<1>.私有的构造方法
<2>.每个元素分别用一个公有的静态成员变量表示,枚举类的对象是固定的,实例个数有限。
<3>.枚举的直接父类java.lang.Enum;
<4>.枚举就相当于一个类,其中也可以定义构造方法、成员变量、普通方法和抽象方法。
<5>.枚举元素必须位于枚举体中的最开始部分,枚举元素列表的后要有分号与其他成员分隔。
<6>.把枚举中的成员方法或变量等放在枚举元素的前面,编译器报告错误。
<7>.枚举只有一个成员时,就可以作为一种单例的实现方式。
<8>.枚举元素有大括号对时,此时属性是枚举类的匿名内部类对象。(查看编译后的class文件)
<9>.所有枚举类都提供一个静态的values()方法(返回该枚举类所有对象组成的数组),便于遍历所有枚举对象;
<10>.Enum常见方法:
                             String name();// 返回枚举实例名称;
                             int ordinal();// 返回枚举实例在枚举类中的索引,从0开始;
                             String toString();// 返回枚举对象的"自我描述";(看源代码)
<11>.在switch语句中使用枚举对象;
<12>.枚举类的构造方法;
<13>.枚举类覆写接口抽象方法的两种方式:
                             a.在枚举类中实现接口抽象方法;
                             b.在枚举匿名内部类对象中实现接口抽象方法;
lEnum是一个抽象类,是所有枚举类的直接父类;
lEnum常见方法:
•String name();// 返回枚举实例名称;
•int ordinal();// 返回枚举实例在枚举类中的索引,从0开始;
•String toString();// 返回枚举对象的"自我描述";(看源代码)
(1)在switch语句中使用枚举对象;
(2)在枚举类中使用toString方法;
(3)使用for-each中操作枚举对象;
(4)枚举类的构造方法;
(5)枚举类覆写接口抽象方法的两种方式;注意:匿名内部类
(6)枚举实现单例模式;
 
super.toString()表示的是先调用父类的toString的方法
枚举类的构造方法
枚举类既然是一种特殊的类,那么也应该有自己的构造方法;
普通类创建对象的时候,可以接收参数,那么枚举类呢?
enum Color {
RED("红"),GREEN("绿"),BLUE("蓝"); private String name;
private Color(String name){
this.name = name;
}
public String getName(){
return name;
}
public String toString() {
return this.name;
}
}
枚举类实现接口
枚举类覆写接口抽象方法的两种方式:
     •在枚举类中实现接口的抽象方法;
     •在枚举匿名内部类中实现接口的抽象方法;
interface I{
void show();
} enum Color implements I{
RED(){
public void show(){
}
}, GREEN{
public void show(){
}
}, BLUE{
public void show(){
}
};
} enum Color implements I{
RED(), GREEN, BLUE; public void show() {
}
}
枚举类的单例模式
使用枚举类来实现单例模式的好处是这样非常简洁,并且无偿地提供了序列化机制,绝对防止多次实例化,即使是在面对复杂的序列化或者反射攻击的时候。
——来自《Effective Java》(作者:Josh Bloch)
enum Singleton {
INSTANCE;//唯一实例 public void print(){
System.out.println("使用enum实现单例模式");
}
public static Singleton getInstance(){
return INSTANCE;
}
}

java初学4的更多相关文章

  1. java初学的分析

    java初学的分析第一阶段:入门阶段学习目标:简单项目开发学习内容:1.Java入门书籍,Java基础知识.关于Java入门级的书,给大家推荐过<Java编程思想>.<Java核心技 ...

  2. 【全网最优方法】JAVA初学:错误: 找不到或无法加载主类HelloWorld

    JAVA初学:错误: 找不到或无法加载主类 HelloWorld 我这是看的黑马2019网课(B站)出现的问题. 放一下别人的图,我也是大概的问题:就是javac没问题,java却无论怎么弄都报错. ...

  3. (Java初学篇)IDEA项目新建流程和软件配置优化以及怎么彻底删除项目

    相信很多小伙伴们在初学 Java 时都会出现这样的情况,就是在网上一顿搜索加捣鼓终于把 JDK 和IDEA 这两款软件安装配置好,但是发现面对这个陌生的软件此时却无从下手,那么接下来我就给大家简单地介 ...

  4. sqlite - java 初学

    进来准备使用一种embedded database,即嵌入式数据库,方便随项目本地存储.目前学习打算是sqlite和H2. document:http://www.runoob.com/sqlite/ ...

  5. Java 初学记录之可执行jar包

    环境 jdk7 jre7 当我用jdk7开发的时候,编写完成可执行的jar工具,并且成功使用. 当我在另一台机器安装了jre6,再次运行我的小工具jar 的时候,报错 解决: http://stack ...

  6. JAVA初学(1):值类型和引用类型的区别

    JAVA值类型和引用类型的区别(转)                                                          [定义] 引用类型表示你操作的数据是同一个,也就 ...

  7. Java初学随笔

    背景 狡兔三窟,在使用了近7-8年的C#后,考虑到云化的到来,还是要面向更多的语言与技术,近期决定学习scala,先从Java为跳板,最后达到学会并熟练 使用scala的目的. <核心技术> ...

  8. java初学知识点

    public class EnumTest { public static void main(String[] args) { Size s=Size.SMALL; Size t=Size.LARG ...

  9. Java初学(四)

    一.图解二维数组 二.图解动态创建二维数组 三.杨辉三角练习: import java.util.Scanner; class Array2Demo{ //实现杨辉三角 public static v ...

  10. Java初学(三)

    一.使用键盘录入数据 三步:1.导入包:import  java.util.Scanner; 2.创建键盘录入对象:Scanner sc=new  Scanner(System.in);   3.通过 ...

随机推荐

  1. nodejs的一些概念

    上一节我们几乎是扫通http请求和响应的整个闭环,包括请求时候的头信息和服务器返回时候的头信息和状态码等等,这些在node的http中都能获取到,并且有相应都接口组装这些信息和返回它们,同时这些htt ...

  2. 如何迅速掌握并提高linux运维技能(收藏文)

    如何迅速掌握并提高linux运维技能   文章来源于南非蚂蚁   之前曾经写过一篇如何学习Linux的文章,得到了很多反馈,大家都在分享自己的学习经验和体会,并且也提出了不少意见和建议.学习这个事情其 ...

  3. Entity Framework 连接 mysql 。(code first模式)

    准备工作 1.下载vs2015 2.下载mysql2017 3.安装 1.创建类库 . 2.打开Nuget包,下载最新版的entity framewor. 3.在引用中添加 mysql.data; m ...

  4. 前端JavaScript之DOM使用案例

    1.弹出框点击关闭 (这个例子关键自己创建标签以及属性,不是太好想啊,而且作用相对来数也不是太大) <!DOCTYPE html> <html> <head> &l ...

  5. 浅谈Docker

    一.为什么使用Docker 软件开发最大的麻烦事之一,就是环境配置.很多人想到,能不能从根本上解决问题,软件可以带环境安装? 也就是说,安装的时候,把原始环境一模一样地复制过来. 目前有两个主流解决方 ...

  6. git 常用命令及仓库创建

    一.常用命令 1.添加到本地仓库缓存 git add . 2.查看本地仓库状态 git status 3.提交到本地仓库 git commit -am 'project init' 4.连接线上分支 ...

  7. 多任务版udp聊天器

    import socket import threading def send_msg(udp_socket): """获取键盘数据,并将其发送给对方"&quo ...

  8. maven 使用错误

    使用mvn test mvn test -Dtest=测试包名.测试类名时 [ERROR] Failed to execute goal org.apache.maven.plugins:maven- ...

  9. 【TP5.1】HTML标签自动转义,导致CKEditor保存内容无法正常显示!

    问题:使用Thinkphp5.1 开发的时候显示CKEditor保存的内容不符合预期. 希望的样子,肯定是不显示<p><b>等标签,而是下面的样子. 因为刚开始使用TP5.1和 ...

  10. 【js】【读书笔记】廖雪峰的js教程读书笔记

    最近在看廖雪峰的js教程,重温了下js基础,记下一些笔记,好记性不如烂笔头嘛 编写代码尽量使用严格模式 use strict JavaScript引擎是一个事件驱动的执行引擎,代码总是以单线程执行 执 ...