01 2019 档案
摘要:到目前为止,从文件或标准输入读取数据还是一件相当痛苦第事情,一般第解决之道就是读入一行文本,对其进行分词,然后使用Integer Double 等类第各种解析方法来解析数据: //: strings/SimpleRead.java\package strings;import java.io.*;
阅读全文
摘要:boolean equalsIgnoreCase() 方法忽略大小写比较两个字符串是否相等
阅读全文
摘要:一.打印数组 二.方法引用 利用方法引用 上面的代码也可以被写成如下形式 str.forEach(System.out::print);//方法引用,System.out::print等价于x -> System.out.println(x) //output: fdsfsdfds 三. 接口 pu
阅读全文
摘要:一.基础 1.一般来说正则表达式就是以某种方式来描述字符串,因此你可以说如果一个字符串中含有这些东西,那么它就是我正在找的东西."例如,要找一个数字,它可能有一个负号在最前面,那么你就写一个负号加上一个问号,就像这样: -? 2. 在Java中使用正则表达式, \\ 的意思是要插入一个正则表达式的反
阅读全文
摘要:一. 可以之际像c语言一样用System.out.printf()格式化输出 二. System.out.format 1. format()方法模仿自printf(), 可用于PrintStream或PrintWrter对象,其中也包括System.out对象 三.Formatter类 1.在ja
阅读全文
摘要:https://blog.csdn.net/wuzhiwei549/article/details/80626677 代码 生成的字节码如下
阅读全文
摘要:可以证明,字符串操作时家属及程序设计中最常见的行为 String类代表字符串。Java程序中的所有字符串文字(例如"abc" )都被实现为此类的实例。 一. 不变的字符串 1. 字符串不变; 它们的值在创建后不能被更改。 字符串缓冲区支持可变字符串。 因为String对象是不可变的,它们可以被共享
阅读全文
摘要:指令码 助记符 说明 0x00 nop 什么都不做 0x01 aconst_null 将null推送至栈顶 二、const系列 该系列命令主要负责把简单的数值类型送到栈顶。该系列命令不带参数。注意只把简单的数值类型送到栈顶时,才使用如下的命令。 比如对应int型才该方式只能把-1,0,1,2,3,4
阅读全文
摘要:https://www.cnblogs.com/dreamroute/p/5089513.html
阅读全文
摘要:应该在以下情况使用异常: 1.)在恰当的级别处理问题.(在知道如何处理的情况下才捕获异常) 2.)解决问题并且重新调用异常的方法 3.)进行少许的修补,然后绕过异常发生的地方继续执行 4.)用别的数据进行计算,以代替预计返回的值 5.)把当前运行环境下能做的事情尽量做完,然后把相同的异常重新抛到高层
阅读全文
摘要:Integer -> String String -> Integer
阅读全文
摘要:一.当我们不知道该怎么处理这个异常,但是也不想把它"吞"了,或者打印一些无用的信息,可以使用异常链的思路解决.可以直接报"被检查的异常"包装进RuntimeException里面,就像这样: 这种技巧给了你一种选择,你可以不写try-catch子句或异常说明,直接忽略异常,让它自己沿着调用栈往上冒泡
阅读全文
摘要:最简答而又不用写多少代码就能保护异常信息的方法,就是把它们从main()传递到控制台,对于简单的程序可以像这样: 通过把它传递到控制它这里就不必写try-catch子句了.
阅读全文
摘要:异常起源于PL/1和Mesa之类的系统中. 1.) 不在于编译器是否会强制程序员去处理错误,而是要由一致的,使用异常来报告错误 2.) 不在于什么时候进行检查,而是一定要有检查.
阅读全文
摘要:异常处理的一个原则时,只有当你在知道如何处理的情况下才捕获异常,异常处理的一个重要目标时将错误处理代码同错误发生的地点相分离. "被检查异常"强制你在还没准备好处理错误的时候被迫加上catch子句,这就导致了吞食则有害的问题.异常被吞食了.
阅读全文
摘要:抛出异常的时候,异常处理系统会安装代码书写顺序找出"最近"的处理程序. 找到匹配的程序后,它就认为异常将得到清理,然后就不再继续查找. 查找的时候并不要求抛出的异常同处理程序的异常完全匹配.派生类的对象也可以配备其基类的处理程序 换句话说,捕获基类的异常,就可以匹配所有派生类的异常
阅读全文
摘要:有一点很重要,即你要时刻询问子句"如果异常发生了,所有东西能被正确清理码?",尽管大多数情况下时非常安全的,但涉及到构造器时,问题出现了,构造器会把对象设置成安全的初始状态,但还会又别的动作,比如打开一个文件,这样的动作只有在对象使用完毕并且用户调用了特殊的清理方法之后才能得以清理,如果在构造器内抛
阅读全文
摘要:一. 1.) 在覆盖方法的时候,只能抛出在基类方法的异常说明里列出的那些异常 2.) 在基类构造器声明的异常,在子类必须抛出,子类的构造器可以抛出任何异常,但是必须抛出基类构造器的异常 3.) 在基类和接口方法声明的异常,子类覆盖的方法可以不抛出基类和接口方法声明的异常以外的异常,但可以少或不抛出
阅读全文
摘要:一.java的异常实现也是又缺陷的,异常作为程序出错的标志决不能被忽略,但它还是可能被轻易地忽略.下了可以看到前一个异常还没处理就抛出下一个异常,没有catch捕获异常,它被finally抛出下一个异常所取代 二.在finally中加入return语句,没有用catch语句捕获异常,下面这种情况编译
阅读全文
摘要:一.使用finally进行清理 对于一些代码,可能会希望无论try块中的异常是否被抛出,它们都能得到执行,这通常适用于内存回收之外的情况(内存回收由垃圾回收器完成),为了达到这个效果,可以异常处理程序后面加上finally子句,完整的异常处理程序看起来像这样: 为了证明finaly总会被执行,可以试
阅读全文
摘要:一.Throwable这个Java类被用来表示任何可以作为异常被抛出的类.Throwable对象可分为两种类型(从Throwable继承而得到的类型): 1.) Error用来表示编译时和系统错误 2.) Exception是可以被抛出的基本类型(程序员关系的通常是Exception 二.特例Run
阅读全文
摘要:一.有时希望把刚捕获的异常重新抛出,尤其时在使用Exception捕获所以异常的时候,既然已经得到了对当前异常对象的引用,可以重新把它抛出: 二 : 1.重新抛出异常会把异常抛给上一级环境中的异常处理程序,同一个try块的后续catch字句将忽略. 2.异常对象的所有信息都得以保持,所以高一级环境中
阅读全文
摘要:1.) 常常会想要在捕获一个异常后抛出另一个异常,并且希望把原始异常的信息保存下来,被称为异常链. 2.)Throwable子类在构造器中可以接受一个cause(因由)对象作为参数.这个cause就是用来表示原始异常,这样通过原是异常传递给新的异常,使得即使在当前位置抛出了新的异常,也能通过异常链追
阅读全文
摘要:printStackTrace()方法所提供的信息可以通过getStackTrace()方法直接访问. getStackTrace()方法返回一个由根轨迹中的元素所构成的数组,每一个元素都表示栈中的一帧,元素0是栈顶元素,并且是调用序列总的最后一个方法调用,数组中最后一个元素和栈底元素是调用序列中的
阅读全文
摘要:1.) 通过捕获异常类型的基类Exception就可以处理所有类型的异常.(事实上还有其它的基类,但Exception是同编程活动相关的基类) 2.)因为Exception是与编程有关的所有异常类的基类,所以捕获包含太多的具体的信息,不过可以调用它从其基类Throwable继承的方法
阅读全文
摘要:异常说明使用了附加的关键字 throws ,后面接一个所有潜在异常类型的列表,方便客户端程序员查看.
阅读全文
摘要:一. 把jdk下的jre文件copy到eclipse安装目录 二. 打开eclipse 重新设计library和工作空间
阅读全文
摘要:打开https://www.oracle.com/technetwork/java/javase/downloads/index.html 选择Development版本(server为服务器版本),即第一个选项,点击链接 下载和系统对应的版本 解压到指定文件夹 例如:/opt/jvm 解压后如下:
阅读全文
摘要:tar.gz格式 sudo tar -xvf file.tar.gz -C /目录/ //注意C为大写,-C /目录是可选的 zip sudo jar xvf file.zip //jar为java的解压命令
阅读全文
摘要:https://blog.csdn.net/freeking101/article/details/80522586
阅读全文
摘要:一. 你可能还想利用java.util.logging工具将输出记录到日志中 二. 尽管LoggingException将所有记录日志的基础设施都构建在了异常自身中,使用它非常方便.但更常见的是我们需要捕获和记录其它人编写的异常, 我们还可以进一步自定义异常,比如加入额外的构造器和成员,因为我们必须
阅读全文
摘要:java的基本理念是"结构不佳的代码不能够运行" 一.概念 发现错误的理想时机是编译阶段,然而,编译期间并不能找出所有的错误,余下的问题必须在运行时期解决。 二.基本异常 异常情形(exceptional conditin)是指阻止当前方法或作用域继续执行的问题. 普通问题是指在当前环境下能得到足够
阅读全文
摘要:java提供了大量的持有对象的方式: 1)数组将数字和对象联系起来,它保存类型明确的对象,查询对象时,不需要对结果做类型转换,它可以时多维的,可以保存基本数据类型的数据,但是,数组一旦生成,其容量就不能改变 2)Collection保存单一的元素,而Map保存相关联的键值对.有了java泛型,你就可
阅读全文
摘要:如果现在有一个Iterable类,你想要添加一种或多种在foreach语句中使用这个类的方法,例如方向迭代,应该怎么做呢? 如果之间继承这个类,并且覆盖iterator()方法,你只能替换现有的方法,而不能实现选择 一种解决方案是所谓的adapter方法的惯用法,"适配器"部分来自于设计模式,因为你
阅读全文
摘要:foreach语法主要用于数组,但是它也可以用于Collection对象,下面是一个示例 cs是一个Colllection,所以这段代码展示了能够与foreach一起工作是所有Collection对象的特性 之所以能够工作,是因为Iterable接口,该接口包含了一个能够产生Iterator的ite
阅读全文
摘要:Collection是描述所有 序列容器的共性的根接口,它可以被认为是一个"附属接口",即因为要表示其他若干个接口的共性而出现的接口,另外,java.uitl.AbstaractCollection类提供了Collection的默认实现,使得你可以创建AbstractCollection的子类型,而
阅读全文
摘要:先进先出描述了最典型的队列.队列规则是值在给定一组队列中的元素的情况下,确定下一个弹出队列的元素的规则,先进先出声明的是下一个元素应该是等待时间最长的元素 优先级队列声明下一个弹出的元素是最需要的元素(具有最高优先级),当在PriorityQueue调用offer()方法插入一个对象时,这个对象就会
阅读全文
摘要:队列是一个典型的先进先出(FIFO)的容器,即从容器的一端放入事物,从另一端取出,并且事物放入容器的顺序与取出的顺序是相同的,队列常常被当作一种可靠的对象从程序的某个区域传输到另一个区域,队列在并发编程中特别重要 对于Queue所继承的Collection在不需要使用其它任何方法的情况下,就可以拥有
阅读全文
摘要:Comparable: 一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序,sort方法调用compareTo()方法里定义的方法进行排序,Comparable的缺点是只能按一种方式排序
阅读全文
摘要:删除全部/** *和/* */注释: 按 Ctrl + F 键 ,复制/\*{1,2}[\s\S]*?\*/ 进查找框,选中正则表达式,选择全部替换
阅读全文
摘要:https://www.cnblogs.com/lzq198754/p/5780165.html Map.一组成对的"键值对"对象,允许你使用键来查找值,ArrayList允许你使用数字来查找值,因此在某种意义上讲,它将数字与对象关联在了一起.映射表允许我们使用另一个对象,它也被称为"关联数组",因
阅读全文
摘要:set不保存重复的元素(至于如何判断元素相同则较为复杂,后面将会看到).Set中最常被使用的是测试归属表,你可以很容易地询问某个对象是否在某个Set中,正因如此,查找就成了Set最重要的操作,因此通常会选择一个HashSet的实现,它专门对快速查找进行了优化. set具有与Collection完全一
阅读全文
摘要:"Stack" 通常时指"后进后出"(LIFO)的容器,有时栈也被称为叠加栈,因为最后"压入"栈的元素,第一个"弹出"栈,经常用来类比栈的事物时装有弹簧的储存器中的自助托盘,最后装入托盘的总是最先拿出. LinkedList具有能够直接实现栈的所有功能的方法,因此可以直接将LinkedList当栈使
阅读全文
摘要:LinkedList也像ArrayList一样实现了基本的List接口,但是它执行某些操作(在List的中间插入和移除)时比ArrayList更高效,但在随机访问方面却要逊色一些 LinkedList还添加了可以使其用作栈,队列或双端队列的方法 这些方法有些彼此之间只是名称有差异,或者只是存在些许差
阅读全文
摘要:LIstIterator是一个更加强大的Iterator的子类型,它只能用于各种List类的访问,尽管Iterator只能向前移动,但是ListIterator可以双向移动,它还可以产生相对于迭代器在列表指向的当前位置的前一个和后一个元素的索引,并且可以使用set()方法替换它访问过的最后一个元素.
阅读全文
摘要:任何容器类,都必须有某种方式可以插入元素并将它们再次取出,毕竟持有事物是容器最基本的工作,对于List,add()插入fang,get()取出,如果从更高层的角度思考,会发现这里有个确定:要用容器,必须对容器的确切类型编程,这样如果原本是List编码的,但是后来要应用于Set,那么此时该怎么办,是重
阅读全文
摘要:list承诺可以将元素维护在特定的序列中,List接口在Collection的基础上添加了大量的方法,使得可以在List的中间插入和移动元素 有两种List 基本的ArrayList,它长于随机访问元素,但时在List的中间插入和移除元素较慢 LinkedList,它通过代价较低的在List中间进行
阅读全文
摘要:在ubuntu编译java程序时报错:type Iterator does not take parameters 源码如下: 报错原因:包里面有之前编写的一个Iterator类,编译时优先调用了包里的Iterator而没有调用java.util里面的Iterator
阅读全文
摘要:Java容器类库中的两种主要类型,它们的区别在于容器中每个"槽"保存的元素个数 Clollection容器只能在保存一个元素,此类容器包括: List,它以特定顺序保存一组元素 Set对于每个值都只保存一个对象,不能有重复元素 Queue 只允许在容器的一"端"插入对象,并从另一端移除对象(很像数据
阅读全文
摘要:在java包中的Arrays和Collection类中都有很多实用方法,可以在一个Collection中添加一组元素,Array.asList()方法接受一个数组或是一个用逗号分隔的元素列表(使用可变参数),并将其转化为一个List对象,Collections.addAll()方法接受一个Colle
阅读全文
摘要:java容器类类库的用途时"保存对象",并将其划分为两个不同的概念: 1)Collection(采集).一个独立元素的序列,这些元素都服从一条或多条规则,List必须按照插入的顺序保存元素,而Set不能有重复元素,Queue按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同) 2)Map.
阅读全文
摘要:游戏 cocos2d 是一个基于MIT协议的开源框架,用于构建游戏、应用程序和其他图形界面交互应用。 untiy3d
阅读全文
摘要:http://how2j.cn/ 教学网站 慕课视频下载网站 电子书网站
阅读全文
摘要:我学院课设是Javaweb程序,要用eclipse,tomcat,jbdc,和数据库 jbdc,是连接数据库的驱动,tomcat是一种类似于服务器的东西,现在买不起服务器,就用tomcat
阅读全文
摘要:使用java SE5之前的容器的一个主要问题就是编译器允许你向容器插入不正确的类型,例如: 使用Java泛型创建类会非常复杂,但是,应用预定义的泛型通常会很简单,例如Apple的ArrayList可以声明为ArrayList<Apple>,而不仅仅时ArrayList,其中尖括号括起来的参数是类型参
阅读全文
摘要:@SuppressWarnings() 注解以@开头可以接受参数 @SuppressWarnings("unchecked") 不受检查的警告信息应该被抑制
阅读全文
摘要:如果一个程序中只包含固定数量的且其生命周期都是已知的对象,那么这是一个简单的程序 通常程序总是根据运行时才知道的某些条件去创建对象,为解决这个普遍的编程问题,需要在任意时刻,任意位置创建任意数量的对象 java有多种方式保存对象,如数组,数组比较时候保存基本数据类型,但数组的尺寸固定,显得过于受限
阅读全文
摘要:可以在代码块里创建内部类,典型的方法是在一个方法体的里面创建,局部内部类不能有访问说明符,因为它不是外围类的一部分,但是可以访问当前代码块的常量,以及此外围类的所有成员,下面分别对局部内部类和匿名内部类进行了比较 局部内部类和匿名内部类都实现了这个功能, 它么具有相同的行为和能力,既然局部内部类的名
阅读全文
摘要:如果创建了一个内部类,然后继承其外围类并重新定义内部类时,"覆盖"内部类就好像是其外围类的一个方法,并不起作用, 这两个内部类是完全独立的两个实体,各自在自己的命名空间内 当然,明确的继承某个内部类也是可以的
阅读全文
摘要:因为内部类的构造器必须连接到指向其外部类对象的引用. 因为在继承内部类的时候那个指向外部类对象的"秘密的"引用必须被初始化,而在导出类中不再存在可连接的默认对象,要解决这个问题必须用特殊的语法来明确说清它么之间的关联:
阅读全文
摘要:应用程序控制框架(application framework)就是设计解决某类特殊问题的一个类,或一组类,要运用某个应用程序框架,通常是继承一个类或多个类,并覆盖这些方法.在覆盖的方法中编写代码定制应用程序框架提供的解决方案,以解决你的问题 控制框架是一类特殊应用程序框架,它用来解决响应事件的需求,
阅读全文
摘要:闭包(closure)是一个可调用的对象,它记录了一些信息,这些信息来自于创建它的作用域. 内部类是面向对象的闭包,因为它不仅包含外围类对象(创建内部类的作用域)的信息,还自动拥有一个指向此外围类对象的引用,在此作用域内,内部类有权操作所有的成员,包括private成员 回调的价值在于它的灵活性--
阅读全文
摘要:每个内部类都能独立地继承自一个(接口的)实现,所以无论外围类是否已经继承了某个(接口的)实现,对于内部类都没有影响 内部类有效的实现了多重继承,也就是说,内部类允许继承多个非接口类型(类或抽象类) 如果拥有抽象类或具体的类,而不是接口,那就只能使用内部类才能够实现多重继承 如果不需要解决多重继承的问
阅读全文
摘要:一.打开https://www.eclipse.org/babel/downloads.php 选择一下版本的Bable(通天塔) 选择 解压 打开Eclipse 软件 选择Help->install New software 点击ADD后选择前面解压的Bdble后等待一分钟左右 选择全部(Sele
阅读全文
摘要:一个内部类被嵌套多少层并不重要--它能透明地访问所有它能嵌入的外围类的所有成员
阅读全文
摘要:正常情况下,不能在接口放置任何代码,但嵌套类可以作为接口的一部分,你放到接口中的任何类都自动地是public和static.因为类是static的,只是将嵌套置于接口的命名空间内,这并不违反接口的规则,你甚至可以在内部类中实现其外围接口 如果你需要创建某些公共代码,使得它么可以被某个接口的所有不同实
阅读全文
摘要:如果不需要内部类对象与其外围类对象之间有联系,那么可以将内部类声明为static,这通常称为嵌套类,想要理解static应用于内部类时的含义,就必须记住,普通的内部类对象隐式地保存了一个引用,指向它的外围类对象,然而,当内部类时static时,就不是这样了,嵌套类意味着: 1)要创建嵌套类的对象,并
阅读全文
摘要:用内部类实现工厂模式 :优先使用类而不是接口,如果你的设计中需要某个接口,你必须了解它,否则不到迫不得已,不要将其放到你的类中
阅读全文
摘要:匿名内部类: 匿名内部类与正规的继承相比有些受限,因为匿名内部类既可以扩展类,也可以实现接口,但不能两者兼备,而且如果实现接口,也只能实现一个接口 一.contents()方法将返回值的生成与表示这个返回值的类的定义结合在一起!另外,这个类是匿名的,它没有名字,更糟糕的是,看起来似乎是你要创建一个C
阅读全文
摘要:通常,如果所读写 的代码包含了内部类,那么它们都是"平凡的"内部类,简单并且容易理解,然而,内部类的语法覆盖了大量其它的更加难以理解的计数,例如可以在一个方法里或者在任意的作用域里定义内部类.这么做有两个理由 1)如前所述,你实现了某类型的接口,于是可以创建并返回对其的引用 2)你要创建一个复杂的问
阅读全文
摘要:当将内部类向上转型为其基类时,尤其是转型为一个接口的时候,内部类就有了用武之地,(从实现某个接口的对象,得到对接口的引用,与向上转型为这个对象的基类,实际上是一样的效果,),这是因为此内部类 某个接口的实现 能够完全不可见,并且不可用,所得到的只是指向基类或接口的引用,所以能够很方便地隐藏实现细节
阅读全文
摘要:如果需要生成对外部类对象的引用,可以使用外部类的名字后面紧跟圆点和this,这样产生的引用自动地具有正确的类型,这一点在编译器就被知晓并受到检查,因此并没有运行时开销 要去创建某个内部类的对象,必须字new表达式中提供其他外部类对象的引用,这就需要.new语法,必须使用外部类的对象来创建内部类
阅读全文
摘要:可以将一个类定义在另一个类的内部,这就是内部类 创建内部类的方式 把类的定义置于外部类的里面 典型的情况是,外部类将有一个方法,该方法返回一个指向内部类的引用,就像在to()和contents()方法中看到的一样, 如果想从外部类的非静态方法之外的任意位置创建某个内部类的对象,那么必须像main()
阅读全文
摘要:接口时实现多重继承的途径,而生产遵循某个接口的对象的典型方式就是工厂方法设计模式,这与直接调用构造器不同,我们在工厂对象上调用的是某种方法,而该工厂对象将生成接口的某个实现的对象,理论上通过这种方式,我们的代码将完全与接口的实现分离,这就使得我们可以透明地将某个实现替换为另一个实现 使用工厂模式一个
阅读全文
摘要:接口可以嵌套在其它类或接口中,可以拥有public和"包访问权限"两种可见性 作为一种新添加的方式,接口也可以实现为private 当实现某个接口时,并不需要实现嵌套在其内的任何接口,而去private接口不能在定义它的类之外被实现
阅读全文
摘要:通过implements(实现)Readbale interface(接口)的 read() method(方法) 实现自己添加字符到buffer里,然后读取 我们再次使用了适配器模式,但在本例中,被适配的类可以通过继承和实现Readable接口来创建,因此通过使用interface关键字提供的伪多
阅读全文
摘要:重载方法仅通过返回类型是区分不开的,在打算组合的不同接口中,尽量使用不同的方法名,否则可能导致混乱
阅读全文
摘要:接口不仅仅只是一种更纯粹形式的抽象类,它的目标比这更高,因为接口是根本没有任何具体实现的--也就是说,没有任何与接口相关的存储,因此也就无法阻止多个接口的组合, 在导出类中,不强制要求必须有一个抽象的或"具体的"(没有任何抽象方法的)基类,如果要从一个非接口的类继承,那么只能从一个类去继承,其余的元
阅读全文
摘要:Stringbuilder方法
阅读全文
摘要:只要有一个方法操作的是类而非接口,那么你就只能使用这个类及其子类,如果你想要将这个方法应用于不在此继承结构中的某个类,那么你就会触霉头,接口可以在很大程度上放宽这种限制,因此,我们可以编写可服用性更好的代码 适配器设计模式,设配器的代码将接受你所拥有的接口,并产生你所需要的接口
阅读全文
摘要:包含抽象方法的类叫抽象类,如果一个类中包含一个或多个抽象方法,该类必须被限定为抽象的,否则编译器会报错,抽象类不可创建对象,创建抽象类的对象编译器会报错 如果从一个抽象类继承,并想创建该新类的对象,那么必须为基类中的所有抽象方法提供方法定义,如果不这样做(可以选择不做),那么导出类便也是抽象类,且编
阅读全文
摘要:interface这个关键字产生一个完全抽象的类,它根本就没有提供任何具体的实现,它允许创建者确定方法名.参数列表和返回类型,但没有任何方法体,接口只提供了形式,而未提供任何具体实现 一个接口表示:"所有实现了该特定接口的类看起来都像这样".接口被用来建立类与类之间的协议(某些面向对象语言用关键字p
阅读全文
摘要:abstract是声明抽象类和抽象方法的关键字 包含抽象方法的类叫抽象类,如果一个类中包含一个或多个抽象方法,该类必须被限定为抽象的,否则编译器会报错,抽象类不可创建对象,创建抽象类的对象编译器会报错
阅读全文