|
|
<!DOCTYPE html> |
|
|
<html lang="zh"> |
|
|
<head> |
|
|
<!-- 元数据 --> |
|
|
<meta charset="utf-8"> |
|
|
<link rel="icon" href="/images/favicon.ico"> |
|
|
<title>面向对象 | YongKJ</title> |
|
|
<meta name="author" content="yongkj" /> |
|
|
<meta http-equiv="Cache-Control" content="no-transform" /> |
|
|
<meta http-equiv="Cache-Control" content="no-siteapp" /> |
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
|
|
<meta name="robots" content="index,follow" /> |
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" /> |
|
|
<meta name="format-detection" content="telphone=no, email=no" /> |
|
|
|
|
|
|
|
|
<meta name="description" itemprop="description" content="A pure heart and few desires." /> |
|
|
|
|
|
|
|
|
<meta name="description" content="面向对象的特征 java面向对象的三大特征是什么?封装、继承、多态。 封装把属性和方法隐藏起来,只保留一些对外的接口和外部进行交互。 继承子类继承父类的特征和行为,使得子类具有父类的非private属性和方法。 多态多态就是同一个接口,使用不同的实现,而执行不同的操作。 抽象将一类对象的共同特征总结出来构造类的过程,数据抽象指的是属性,行为抽象指的是方法。 抽象类与接口 抽象类 "> |
|
|
<meta property="og:type" content="article"> |
|
|
<meta property="og:title" content="面向对象"> |
|
|
<meta property="og:url" content="https://blog.yongkj.cn/2021/02/03/java-object-oriented/index.html"> |
|
|
<meta property="og:site_name" content="YongKJ"> |
|
|
<meta property="og:description" content="面向对象的特征 java面向对象的三大特征是什么?封装、继承、多态。 封装把属性和方法隐藏起来,只保留一些对外的接口和外部进行交互。 继承子类继承父类的特征和行为,使得子类具有父类的非private属性和方法。 多态多态就是同一个接口,使用不同的实现,而执行不同的操作。 抽象将一类对象的共同特征总结出来构造类的过程,数据抽象指的是属性,行为抽象指的是方法。 抽象类与接口 抽象类 "> |
|
|
<meta property="og:locale" content="zh_CN"> |
|
|
<meta property="og:image" content="https://blog.yongkj.cn/2021/02/03/java-object-oriented/2_jamespoulsom-beachmorningriviera.jpg"> |
|
|
<meta property="article:published_time" content="2021-02-03T10:30:52.000Z"> |
|
|
<meta property="article:modified_time" content="2023-05-30T04:26:16.707Z"> |
|
|
<meta property="article:author" content="yongkj"> |
|
|
<meta property="article:tag" content="继承"> |
|
|
<meta property="article:tag" content="实例"> |
|
|
<meta property="article:tag" content="抽象"> |
|
|
<meta property="article:tag" content="接口"> |
|
|
<meta name="twitter:card" content="summary"> |
|
|
<meta name="twitter:image" content="https://blog.yongkj.cn/2021/02/03/java-object-oriented/2_jamespoulsom-beachmorningriviera.jpg"> |
|
|
<meta name="twitter:site" content="@Candiinya"> |
|
|
<link rel="alternate" href="atom.xml" type="application/atom+xml"> |
|
|
<!-- 站点验证相关 --> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- 样式表文件 --> |
|
|
<link rel="stylesheet" id="kratos-css" href="/css/kratosr.min.css" type="text/css" media="all"> |
|
|
<link rel="stylesheet" id="highlight-css" href="/css/highlight.min.css" type="text/css" media="all"> |
|
|
<link rel="stylesheet" id="fontawe-css" href="https://cdn.jsdelivr.net/npm/font-awesome@4.7.0/css/font-awesome.min.css" type="text/css" media="all"> |
|
|
<link rel="stylesheet" id="nprogress-css" href="https://cdn.jsdelivr.net/npm/nprogress@0.2.0/nprogress.min.css" type="text/css" media="all"> |
|
|
|
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css"> |
|
|
|
|
|
|
|
|
<link rel="stylesheet" id="darkmode-css" href="/css/kr-dark.min.css" type="text/css" media="all"> |
|
|
|
|
|
<!-- 不得不预先加载的一些JS文件 --> |
|
|
<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js"></script> |
|
|
|
|
|
<script src="https://cdn.jsdelivr.net/npm/qrcode_js@1.0.0/qrcode.min.js"></script> |
|
|
|
|
|
|
|
|
<meta name="generator" content="Hexo 5.2.0"></head> |
|
|
|
|
|
|
|
|
<body class="custom-background"> |
|
|
<div id="kratos-wrapper"> |
|
|
<div id="kratos-page"> |
|
|
<div id="kratos-header"> |
|
|
<div class="nav-toggle"><a class="kratos-nav-toggle js-kratos-nav-toggle"><i></i></a></div> |
|
|
<header id="kratos-header-section"> |
|
|
<div class="container"> |
|
|
<div class="nav-header"> |
|
|
<div class="color-logo"><a href="/">YongKJ</a></div> |
|
|
<nav id="kratos-menu-wrap"> |
|
|
<ul id="kratos-primary-menu" class="sf-menu"> |
|
|
|
|
|
|
|
|
<li><a href="/"><i class="fa fa-home"></i>首页</a></li> |
|
|
|
|
|
|
|
|
|
|
|
<li><a href="/archives/"><i class="fa fa-file"></i>档案馆</a></li> |
|
|
|
|
|
|
|
|
|
|
|
<li> |
|
|
<a><i class="fa fa-link"></i>链接</a> |
|
|
<ul class="sub-menu"> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li><a target="_blank" rel="noopener" href="http://software.yongkj.cn/software/">软件俱乐部</a></li> |
|
|
|
|
|
|
|
|
|
|
|
<li><a target="_blank" rel="noopener" href="http://pocketyun.yongkj.cn/pocketyun/">袖珍网盘吧</a></li> |
|
|
|
|
|
|
|
|
|
|
|
<li><a target="_blank" rel="noopener" href="http://study.yongkj.cn/">英语随身学</a></li> |
|
|
|
|
|
|
|
|
</ul> |
|
|
</li> |
|
|
|
|
|
|
|
|
|
|
|
<li><a href="/atom.xml"><i class="fa fa-rss"></i>RSS 订阅</a></li> |
|
|
|
|
|
|
|
|
|
|
|
<li><a href="/about/"><i class="fa fa-paper-plane"></i>关于我</a></li> |
|
|
|
|
|
|
|
|
</ul> |
|
|
</nav> |
|
|
</div> |
|
|
</div> |
|
|
</header> |
|
|
</div> |
|
|
<div class="kratos-start kratos-hero-2"> |
|
|
<!-- <div class="kratos-overlay"></div> --> |
|
|
<div class="kratos-cover kratos-cover-2 text-center"> |
|
|
<div class="desc desc2 animate-box"> |
|
|
<a href="/"><h2>YongKJ</h2><br><span>勇往直前,永不言弃</span></a> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<div id="kratos-blog-post"> |
|
|
<div class="container"> |
|
|
<div class="row"> |
|
|
|
|
|
<div id="main"> |
|
|
<section class="col-md-8"> |
|
|
<article> |
|
|
<div class="kratos-hentry kratos-post-inner clearfix"> |
|
|
<header class="kratos-entry-header"> |
|
|
<h1 class="kratos-entry-title text-center">面向对象</h1> |
|
|
|
|
|
<div class="kratos-post-meta text-center"> |
|
|
<span> |
|
|
<i class="fa fa-calendar"></i> 2021-02-03 |
|
|
<i class="fa fa-folder"></i> 分类于 <a class="label-link" href="/categories/Java%E5%AD%A6%E4%B9%A0/">Java学习</a> |
|
|
<i class="fa fa-user"></i> 作者 yongkj |
|
|
<i class="fa fa-edit"></i> |
|
|
|
|
|
|
|
|
~4.53K |
|
|
|
|
|
字 |
|
|
|
|
|
</span> |
|
|
</div> |
|
|
</header> |
|
|
<div class="kratos-post-content"> |
|
|
|
|
|
<div class="kratos-post-inner-toc"> |
|
|
<ol class="toc"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%9A%84%E7%89%B9%E5%BE%81"><span class="toc-number">1.</span> <span class="toc-text">面向对象的特征</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%8A%BD%E8%B1%A1%E7%B1%BB%E4%B8%8E%E6%8E%A5%E5%8F%A3"><span class="toc-number">2.</span> <span class="toc-text">抽象类与接口</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%86%85%E9%83%A8%E7%B1%BB"><span class="toc-number">3.</span> <span class="toc-text">内部类</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E9%87%8D%E8%BD%BD%E4%B8%8E%E9%87%8D%E5%86%99"><span class="toc-number">4.</span> <span class="toc-text">重载与重写</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#hashCode-%E5%92%8Cequals-%E6%96%B9%E6%B3%95%E7%9A%84%E8%81%94%E7%B3%BB"><span class="toc-number">5.</span> <span class="toc-text">hashCode()和equals()方法的联系</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#final-finally-finalize%E7%9A%84%E5%8C%BA%E5%88%AB"><span class="toc-number">6.</span> <span class="toc-text">final, finally, finalize的区别</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Comparable%E5%92%8CComparator%E6%8E%A5%E5%8F%A3%E7%9A%84%E4%BD%9C%E7%94%A8%E4%BB%A5%E5%8F%8A%E5%8C%BA%E5%88%AB"><span class="toc-number">7.</span> <span class="toc-text">Comparable和Comparator接口的作用以及区别</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Java%E6%98%AF%E5%90%A6%E6%94%AF%E6%8C%81%E5%A4%9A%E7%BB%A7%E6%89%BF"><span class="toc-number">8.</span> <span class="toc-text">Java是否支持多继承</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#extends-%E5%92%8Csuper-%E6%B3%9B%E5%9E%8B%E9%99%90%E5%AE%9A%E7%AC%A6"><span class="toc-number">9.</span> <span class="toc-text">extends 和super 泛型限定符</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E4%BB%80%E4%B9%88%E6%98%AF%E6%B3%9B%E5%9E%8B"><span class="toc-number">10.</span> <span class="toc-text">什么是泛型</span></a></li></ol> |
|
|
</div> |
|
|
|
|
|
<hr /> |
|
|
<h3 id="面向对象的特征"><a href="#面向对象的特征" class="headerlink" title="面向对象的特征"></a>面向对象的特征</h3><ol> |
|
|
<li>java面向对象的三大特征是什么?<br>封装、继承、多态。</li> |
|
|
<li>封装<br>把属性和方法隐藏起来,只保留一些对外的接口和外部进行交互。</li> |
|
|
<li>继承<br>子类继承父类的特征和行为,使得子类具有父类的非private属性和方法。</li> |
|
|
<li>多态<br>多态就是同一个接口,使用不同的实现,而执行不同的操作。</li> |
|
|
<li>抽象<br>将一类对象的共同特征总结出来构造类的过程,数据抽象指的是属性,行为抽象指的是方法。</li> |
|
|
</ol> |
|
|
<h3 id="抽象类与接口"><a href="#抽象类与接口" class="headerlink" title="抽象类与接口"></a>抽象类与接口</h3><ol> |
|
|
<li>抽象类</li> |
|
|
</ol> |
|
|
<p> 1)抽象类是用来捕捉子类的通用特性的</p> |
|
|
<p> 2)它不能被实例化,只能被用作子类的超类</p> |
|
|
<p> 3)抽象类是被用来创建继承层级里子类的模板</p> |
|
|
<ol start="2"> |
|
|
<li>接口</li> |
|
|
</ol> |
|
|
<p> 1)接口是抽象方法的集合</p> |
|
|
<p> 2)如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法</p> |
|
|
<p> 3)如果实现了这个接口,那么就必须确保使用这些方法</p> |
|
|
<p> 4)接口只是一种形式,接口自身不能做任何事情</p> |
|
|
<ol start="3"> |
|
|
<li>抽象类和接口的对比</li> |
|
|
</ol> |
|
|
<table> |
|
|
<thead> |
|
|
<tr> |
|
|
<th align="left">参数</th> |
|
|
<th align="left">抽象类</th> |
|
|
<th>接口</th> |
|
|
</tr> |
|
|
</thead> |
|
|
<tbody><tr> |
|
|
<td align="left">默认的方法实现</td> |
|
|
<td align="left">它可以有默认的方法实现</td> |
|
|
<td>接口完全是抽象的。它根本不存在方法的实现</td> |
|
|
</tr> |
|
|
<tr> |
|
|
<td align="left">实现</td> |
|
|
<td align="left">子类使用<strong>extends</strong>关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。</td> |
|
|
<td>子类使用关键字<strong>implements</strong>来实现接口。它需要提供接口中所有声明的方法的实现</td> |
|
|
</tr> |
|
|
<tr> |
|
|
<td align="left">构造器</td> |
|
|
<td align="left">抽象类可以有构造器</td> |
|
|
<td>接口不能有构造器</td> |
|
|
</tr> |
|
|
<tr> |
|
|
<td align="left">与正常Java类的区别</td> |
|
|
<td align="left">除了你不能实例化抽象类之外,它和普通Java类没有任何区别</td> |
|
|
<td>接口是完全不同的类型</td> |
|
|
</tr> |
|
|
<tr> |
|
|
<td align="left">访问修饰符</td> |
|
|
<td align="left">抽象方法可以有<strong>public</strong>、<strong>protected</strong>和<strong>default</strong>这些修饰符</td> |
|
|
<td>接口方法默认修饰符是<strong>public</strong>。你不可以使用其它修饰符。</td> |
|
|
</tr> |
|
|
<tr> |
|
|
<td align="left">main方法</td> |
|
|
<td align="left">抽象方法可以有main方法并且我们<strong>可以运行</strong>它</td> |
|
|
<td>接口没有main方法,因此我们<strong>不能运行它</strong>。</td> |
|
|
</tr> |
|
|
<tr> |
|
|
<td align="left">多继承</td> |
|
|
<td align="left">抽象方法可以继承一个类和实现多个接口</td> |
|
|
<td>接口只可以继承一个或多个其它接口</td> |
|
|
</tr> |
|
|
<tr> |
|
|
<td align="left">速度</td> |
|
|
<td align="left">它比接口速度要快</td> |
|
|
<td>接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法。</td> |
|
|
</tr> |
|
|
<tr> |
|
|
<td align="left">添加新方法</td> |
|
|
<td align="left">如果你往抽象类中添加新的方法,你可以给它提供默认的实现。因此你不需要改变你现在的代码。</td> |
|
|
<td>如果你往接口中添加方法,那么你必须改变实现该接口的类。</td> |
|
|
</tr> |
|
|
</tbody></table> |
|
|
<h3 id="内部类"><a href="#内部类" class="headerlink" title="内部类"></a>内部类</h3><ol> |
|
|
<li>概述</li> |
|
|
</ol> |
|
|
<p> 1)把类定义在另一个类的内部,该类就被称为内部类</p> |
|
|
<p> 2)把类Inner定义在类Outer中,类Inner就被称为内部类</p> |
|
|
<ol start="2"> |
|
|
<li>访问规则</li> |
|
|
</ol> |
|
|
<p> 1)可以直接访问外部类的成员,包括私有</p> |
|
|
<p> 2)外部类要想访问内部类成员,必须创建对象</p> |
|
|
<ol start="3"> |
|
|
<li>分类</li> |
|
|
</ol> |
|
|
<p> 1)<strong>成员内部类</strong>:位于外部类成员位置的类,可以使用外部类中所有的成员变量和成员方法(包括private的)</p> |
|
|
<p> 2)<strong>局部内部类</strong>:定义在一个方法或者一个作用域里面的类,主要是作用域发生了变化,只能在自身所在方法和属性中被使用</p> |
|
|
<p> 3)<strong>静态内部类</strong>:用static修饰的内部类,不能使用外部类的非static成员变量和成员方法</p> |
|
|
<p> 4)<strong>匿名内部类</strong>:一个没有名字的类,是内部类的简化写法,其实是继承该类或者实现接口的子类匿名对象</p> |
|
|
<h3 id="重载与重写"><a href="#重载与重写" class="headerlink" title="重载与重写"></a>重载与重写</h3><ol> |
|
|
<li>方法重载</li> |
|
|
</ol> |
|
|
<p> 1)同一个类中的多个方法具有相同的名字,这些方法具有不同的参数列表</p> |
|
|
<p> 2)参数类型和个数不一样,返回值类型可以相同也可以不相同</p> |
|
|
<p> 3)无法以返回型别作为重载函数的区分标准</p> |
|
|
<p> 4)重载Overloading是一个类中多态性的一种表现。</p> |
|
|
<ol start="2"> |
|
|
<li>方法重写</li> |
|
|
</ol> |
|
|
<p> 1)子类定义的方法与父类中的方法具有相同的方法名字,相同的参数表和相同的返回类型</p> |
|
|
<p> 2)子类中不能重写父类中的final方法</p> |
|
|
<p> 3)子类中必须重写父类中的abstract方法</p> |
|
|
<h3 id="hashCode-和equals-方法的联系"><a href="#hashCode-和equals-方法的联系" class="headerlink" title="hashCode()和equals()方法的联系"></a>hashCode()和equals()方法的联系</h3><ol> |
|
|
<li><p>相等(相同)的对象必须具有相等的哈希码(或者散列码)。</p> |
|
|
</li> |
|
|
<li><p>如果两个对象的hashCode相同,它们并不一定相同。</p> |
|
|
</li> |
|
|
</ol> |
|
|
<h3 id="final-finally-finalize的区别"><a href="#final-finally-finalize的区别" class="headerlink" title="final, finally, finalize的区别"></a>final, finally, finalize的区别</h3><ol> |
|
|
<li>final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。</li> |
|
|
<li>finally是异常处理语句结构的一部分,表示总是执行。</li> |
|
|
<li>finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。</li> |
|
|
</ol> |
|
|
<h3 id="Comparable和Comparator接口的作用以及区别"><a href="#Comparable和Comparator接口的作用以及区别" class="headerlink" title="Comparable和Comparator接口的作用以及区别"></a>Comparable和Comparator接口的作用以及区别</h3><ol> |
|
|
<li>Comparable接口包含compareTo()方法。这个方法可以个给两个对象排序。</li> |
|
|
<li>Comparator接口包含compare()和equals()方法。</li> |
|
|
<li>compare()方法用来给两个输入参数排序,返回负数,0,正数表明第一个参数是小于,等于,大于第二个参数。</li> |
|
|
<li>equals()方法需要一个对象作为参数,它用来决定输入参数是否和comparator相等。</li> |
|
|
<li>只有当输入参数也是一个comparator并且输入参数和当前comparator的排序结果是相同的时候,这个方法才返回true。</li> |
|
|
</ol> |
|
|
<h3 id="Java是否支持多继承"><a href="#Java是否支持多继承" class="headerlink" title="Java是否支持多继承"></a>Java是否支持多继承</h3><ol> |
|
|
<li>Java中类不支持多继承,只支持单继承(即一个类只有一个父类)。 </li> |
|
|
<li>但是java中的接口支持多继承,,即一个子接口可以有多个父接口。</li> |
|
|
<li>接口的作用是用来扩展对象的功能,一个子接口继承多个父接口,说明子接口扩展了多个功能。</li> |
|
|
<li>当类实现接口时,类就扩展了相应的功能。</li> |
|
|
</ol> |
|
|
<h3 id="extends-和super-泛型限定符"><a href="#extends-和super-泛型限定符" class="headerlink" title="extends 和super 泛型限定符"></a>extends 和super 泛型限定符</h3><ol> |
|
|
<li>泛型中上界和下界的定义</li> |
|
|
</ol> |
|
|
<p> 1)上界<? extend Fruit></p> |
|
|
<p> 2)下界<? super Apple></p> |
|
|
<ol start="2"> |
|
|
<li>上界和下界的特点</li> |
|
|
</ol> |
|
|
<p> 1)上界的list只能get,不能add(确切地说不能add出除null之外的对象,包括Object)</p> |
|
|
<p> 3)下界的list只能add,不能get</p> |
|
|
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"> </span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Fruit</span> </span>{}</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Apple</span> <span class="keyword">extends</span> <span class="title">Fruit</span> </span>{}</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Jonathan</span> <span class="keyword">extends</span> <span class="title">Apple</span> </span>{}</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Orange</span> <span class="keyword">extends</span> <span class="title">Fruit</span> </span>{}</span><br><span class="line"> </span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">CovariantArrays</span> </span>{</span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"> <span class="comment">//上界</span></span><br><span class="line"> List<? extends Fruit> flistTop = <span class="keyword">new</span> ArrayList<Apple>();</span><br><span class="line"> flistTop.add(<span class="keyword">null</span>);</span><br><span class="line"> <span class="comment">//add Fruit对象会报错</span></span><br><span class="line"> <span class="comment">//flist.add(new Fruit());</span></span><br><span class="line"> Fruit fruit1 = flistTop.get(<span class="number">0</span>);</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//下界</span></span><br><span class="line"> List<? <span class="keyword">super</span> Apple> flistBottem = <span class="keyword">new</span> ArrayList<Apple>();</span><br><span class="line"> flistBottem.add(<span class="keyword">new</span> Apple());</span><br><span class="line"> flistBottem.add(<span class="keyword">new</span> Jonathan());</span><br><span class="line"> <span class="comment">//get Apple对象会报错</span></span><br><span class="line"> <span class="comment">//Apple apple = flistBottem.get(0);</span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure> |
|
|
|
|
|
<ol start="3"> |
|
|
<li>上界<? extend Fruit> ,表示所有继承Fruit的子类,但是具体是哪个子类,无法确定,所以调用add的时候,要add什么类型,谁也不知道。但是get的时候,不管是什么子类,不管追溯多少辈,肯定有个父类是Fruit,所以,我都可以用最大的父类Fruit接着,也就是把所有的子类向上转型为Fruit。</li> |
|
|
<li>下界<? super Apple>,表示Apple的所有父类,包括Fruit,一直可以追溯到老祖宗Object 。那么当我add的时候,我不能add Apple的父类,因为不能确定List里面存放的到底是哪个父类。但是我可以add Apple及其子类。因为不管我的子类是什么类型,它都可以向上转型为Apple及其所有的父类甚至转型为Object 。但是当我get的时候,Apple的父类这么多,我用什么接着呢,除了Object,其他的都接不住。</li> |
|
|
</ol> |
|
|
<h3 id="什么是泛型"><a href="#什么是泛型" class="headerlink" title="什么是泛型"></a>什么是泛型</h3><ol> |
|
|
<li>泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。那么参数化类型怎么理解呢?</li> |
|
|
<li>顾名思义,就是将类型由原来的具体的类型参数化,类似于方法中的变量参数,此时类型也定义成参数形式(可以称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。</li> |
|
|
</ol> |
|
|
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">GenericTest</span> </span>{</span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</span><br><span class="line"> <span class="comment">/*</span></span><br><span class="line"><span class="comment"> List list = new ArrayList();</span></span><br><span class="line"><span class="comment"> list.add("qqyumidi");</span></span><br><span class="line"><span class="comment"> list.add("corn");</span></span><br><span class="line"><span class="comment"> list.add(100);</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line"> List<String> list = <span class="keyword">new</span> ArrayList<String>();</span><br><span class="line"> list.add(<span class="string">"qqyumidi"</span>);</span><br><span class="line"> list.add(<span class="string">"corn"</span>);</span><br><span class="line"> <span class="comment">//list.add(100); // 1 提示编译错误</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < list.size(); i++) {</span><br><span class="line"> String name = list.get(i); <span class="comment">// 2</span></span><br><span class="line"> System.out.println(<span class="string">"name:"</span> + name);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure> |
|
|
|
|
|
<ol start="3"> |
|
|
<li>采用泛型写法后,在//1处想加入一个Integer类型的对象时会出现编译错误,通过List<String>,直接限定了list集合中只能含有String类型的元素,从而在//2处无须进行强制类型转换,因为此时,集合能够记住元素的类型信息,编译器已经能够确认它是String类型了。</li> |
|
|
</ol> |
|
|
|
|
|
</div> |
|
|
|
|
|
<div class="kratos-copyright text-center clearfix"> |
|
|
<h5>本作品采用 <a rel="license nofollow" target="_blank" href="http://creativecommons.org/licenses/by-sa/4.0/">知识共享署名-相同方式共享 4.0 国际许可协议</a> 进行许可</h5> |
|
|
</div> |
|
|
|
|
|
<footer class="kratos-entry-footer clearfix"> |
|
|
|
|
|
<div class="post-like-donate text-center clearfix" id="post-like-donate"> |
|
|
|
|
|
|
|
|
<a class="share" href="javascript:;"><i class="fa fa-share-alt"></i> 分享</a> |
|
|
<div class="share-wrap" style="display: none;"> |
|
|
<div class="share-group"> |
|
|
<a href="javascript:;" class="share-plain qq" onclick="share('qq');" rel="nofollow"> |
|
|
<div class="icon-wrap"> |
|
|
<i class="fa fa-qq"></i> |
|
|
</div> |
|
|
</a> |
|
|
<a href="javascript:;" class="share-plain qzone" onclick="share('qzone');" rel="nofollow"> |
|
|
<div class="icon-wrap"> |
|
|
<i class="fa fa-star"></i> |
|
|
</div> |
|
|
</a> |
|
|
<a href="javascript:;" class="share-plain weixin pop style-plain" rel="nofollow"> |
|
|
<div class="icon-wrap"> |
|
|
<i class="fa fa-weixin"></i> |
|
|
</div> |
|
|
<div class="share-int"> |
|
|
<div class="qrcode" id="wechat-qr"></div> |
|
|
<p>打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮</p> |
|
|
</div> |
|
|
</a> |
|
|
<a href="javascript:;" class="share-plain weibo" onclick="share('weibo');" rel="nofollow"> |
|
|
<div class="icon-wrap"> |
|
|
<i class="fa fa-weibo"></i> |
|
|
</div> |
|
|
</a> |
|
|
<a href="javascript:;" class="share-plain facebook style-plain" onclick="share('facebook');" rel="nofollow"> |
|
|
<div class="icon-wrap"> |
|
|
<i class="fa fa-facebook"></i> |
|
|
</div> |
|
|
</a> |
|
|
<a href="javascript:;" class="share-plain twitter style-plain" onclick="share('twitter');" rel="nofollow"> |
|
|
<div class="icon-wrap"> |
|
|
<i class="fa fa-twitter"></i> |
|
|
</div> |
|
|
</a> |
|
|
</div> |
|
|
<script type="text/javascript"> |
|
|
$(()=>{ |
|
|
new QRCode("wechat-qr", { |
|
|
text: "https://blog.yongkj.cn/2021/02/03/java-object-oriented/", |
|
|
width: 150, |
|
|
height: 150, |
|
|
correctLevel : QRCode.CorrectLevel.H |
|
|
}); |
|
|
}); |
|
|
function share(dest) { |
|
|
const qqBase = "https://connect.qq.com/widget/shareqq/index.html?"; |
|
|
const weiboBase = "https://service.weibo.com/share/share.php?"; |
|
|
const qzoneBase = "https://sns.qzone.qq.com/cgi-bin/qzshare/cgi_qzshare_onekey?"; |
|
|
const facebookBase = "https://www.facebook.com/sharer/sharer.php?"; |
|
|
const twitterBase = "https://twitter.com/intent/tweet?"; |
|
|
const hostUrl = "https://blog.yongkj.cn/2021/02/03/java-object-oriented/"; |
|
|
const title = "「面向对象」"; |
|
|
const excerpt = `面向对象的特征 |
|
|
java面向对象的三大特征是什么?封装、继承、多态。 |
|
|
封装把属性和方法隐藏起来,只保留一些对外的接口和外部进行交互。 |
|
|
继承子类继承父类的特征和行为,使得子类具有父类的非private属性和方法。 |
|
|
多态多态就是同一个接口...`; |
|
|
let _URL; |
|
|
switch (dest) { |
|
|
case "qq" : _URL = qqBase+"url="+hostUrl+"&title="+title+"&desc=&summary="+excerpt+"&site=cxpy"; break; |
|
|
case "weibo" : _URL = weiboBase+"url="+hostUrl+"&title="+title+excerpt; break; |
|
|
case "qzone" : _URL = qzoneBase+"url="+hostUrl+"&title="+title+"&desc=&summary="+excerpt+"&site=cxpy"; break; |
|
|
case "facebook" : _URL = facebookBase+"u="+hostUrl; break; |
|
|
case "twitter" : _URL = twitterBase+"text="+title+excerpt+"&url="+hostUrl; break; |
|
|
} |
|
|
window.open(_URL); |
|
|
}; |
|
|
</script> |
|
|
</div> |
|
|
|
|
|
</div> |
|
|
|
|
|
<div class="footer-tag clearfix"> |
|
|
<div class="pull-left"> |
|
|
<i class="fa fa-tags"></i> |
|
|
<a class="tag-none-link" href="/tags/%E5%AE%9E%E4%BE%8B/" rel="tag">实例</a>, <a class="tag-none-link" href="/tags/%E6%8A%BD%E8%B1%A1/" rel="tag">抽象</a>, <a class="tag-none-link" href="/tags/%E6%8E%A5%E5%8F%A3/" rel="tag">接口</a>, <a class="tag-none-link" href="/tags/%E7%BB%A7%E6%89%BF/" rel="tag">继承</a> |
|
|
</div> |
|
|
<div class="pull-date"> |
|
|
<span>最后编辑:2023-05-30</span> |
|
|
</div> |
|
|
</div> |
|
|
</footer> |
|
|
</div> |
|
|
|
|
|
<nav class="navigation post-navigation clearfix" role="navigation"> |
|
|
|
|
|
<div class="nav-previous clearfix"> |
|
|
<a title=" 设计模式" href="/2021/02/02/java-design-mode/">< 上一篇</a> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="nav-next clearfix"> |
|
|
<a title=" 基础知识" href="/2021/02/04/java-basic-knowledge/">下一篇 ></a> |
|
|
</div> |
|
|
|
|
|
</nav> |
|
|
|
|
|
|
|
|
</article> |
|
|
</section> |
|
|
</div> |
|
|
|
|
|
<section id="kratos-widget-area" class="col-md-4 hidden-xs hidden-sm"> |
|
|
|
|
|
<aside id="krw-about" class="widget widget-kratos-about clearfix"> |
|
|
|
|
|
<div class="photo-background"></div> |
|
|
<div class="photo-wrapper clearfix"> |
|
|
<div class="photo-wrapper-tip text-center"> |
|
|
<img class="about-photo" src="/images/avatar.webp" /> |
|
|
</div> |
|
|
</div> |
|
|
<div class="textwidget"> |
|
|
|
|
|
<ol class="toc"><li class="toc-item toc-level-3"><a class="toc-link" href="#%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E7%9A%84%E7%89%B9%E5%BE%81"><span class="toc-number">1.</span> <span class="toc-text">面向对象的特征</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E6%8A%BD%E8%B1%A1%E7%B1%BB%E4%B8%8E%E6%8E%A5%E5%8F%A3"><span class="toc-number">2.</span> <span class="toc-text">抽象类与接口</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E5%86%85%E9%83%A8%E7%B1%BB"><span class="toc-number">3.</span> <span class="toc-text">内部类</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E9%87%8D%E8%BD%BD%E4%B8%8E%E9%87%8D%E5%86%99"><span class="toc-number">4.</span> <span class="toc-text">重载与重写</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#hashCode-%E5%92%8Cequals-%E6%96%B9%E6%B3%95%E7%9A%84%E8%81%94%E7%B3%BB"><span class="toc-number">5.</span> <span class="toc-text">hashCode()和equals()方法的联系</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#final-finally-finalize%E7%9A%84%E5%8C%BA%E5%88%AB"><span class="toc-number">6.</span> <span class="toc-text">final, finally, finalize的区别</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Comparable%E5%92%8CComparator%E6%8E%A5%E5%8F%A3%E7%9A%84%E4%BD%9C%E7%94%A8%E4%BB%A5%E5%8F%8A%E5%8C%BA%E5%88%AB"><span class="toc-number">7.</span> <span class="toc-text">Comparable和Comparator接口的作用以及区别</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#Java%E6%98%AF%E5%90%A6%E6%94%AF%E6%8C%81%E5%A4%9A%E7%BB%A7%E6%89%BF"><span class="toc-number">8.</span> <span class="toc-text">Java是否支持多继承</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#extends-%E5%92%8Csuper-%E6%B3%9B%E5%9E%8B%E9%99%90%E5%AE%9A%E7%AC%A6"><span class="toc-number">9.</span> <span class="toc-text">extends 和super 泛型限定符</span></a></li><li class="toc-item toc-level-3"><a class="toc-link" href="#%E4%BB%80%E4%B9%88%E6%98%AF%E6%B3%9B%E5%9E%8B"><span class="toc-number">10.</span> <span class="toc-text">什么是泛型</span></a></li></ol> |
|
|
|
|
|
</div> |
|
|
</aside> |
|
|
|
|
|
<!-- Moved to about.ejs --> |
|
|
|
|
|
|
|
|
<aside id="krw-categories" class="widget widget-categories clearfix"> |
|
|
<h4 class="widget-title"><i class="fa fa-folder"></i>分类目录</h4> |
|
|
<ul class="category-list"><li class="category-list-item"><a class="category-list-link" href="/categories/Java%E5%AD%A6%E4%B9%A0/">Java学习</a><span class="category-list-count">12</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E7%AC%AC%E4%B8%80%E6%AC%A1/">第一次</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E8%8B%B1%E8%AF%AD%E5%AD%A6%E4%B9%A0/">英语学习</a><span class="category-list-count">8</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E9%9D%A2%E8%AF%95%E7%A7%AF%E7%B4%AF/">面试积累</a><span class="category-list-count">1</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E9%9F%B3%E4%B9%90%E7%A9%BA%E9%97%B4/">音乐空间</a><span class="category-list-count">3</span></li><li class="category-list-item"><a class="category-list-link" href="/categories/%E9%A1%B9%E7%9B%AE%E7%BB%8F%E5%8E%86/">项目经历</a><span class="category-list-count">3</span></li></ul> |
|
|
</aside> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<aside id="krw-tags" class="widget widget-kratos-tags clearfix"> |
|
|
<h4 class="widget-title"><i class="fa fa-tags"></i>标签聚合</h4> |
|
|
<div class="tag-clouds"> |
|
|
<a href="/tags/MySQL/" style="font-size: 0.6em;">MySQL</a> <a href="/tags/apility/" style="font-size: 0.6em;">apility</a> <a href="/tags/bus/" style="font-size: 0.6em;">bus</a> <a href="/tags/city/" style="font-size: 0.6em;">city</a> <a href="/tags/comfort/" style="font-size: 0.6em;">comfort</a> <a href="/tags/communication/" style="font-size: 0.6em;">communication</a> <a href="/tags/contribute/" style="font-size: 0.6em;">contribute</a> <a href="/tags/convenient/" style="font-size: 0.6em;">convenient</a> <a href="/tags/develop/" style="font-size: 0.6em;">develop</a> <a href="/tags/education/" style="font-size: 0.6em;">education</a> <a href="/tags/enhance/" style="font-size: 0.6em;">enhance</a> <a href="/tags/facility/" style="font-size: 0.6em;">facility</a> <a href="/tags/flight/" style="font-size: 0.6em;">flight</a> <a href="/tags/foreign/" style="font-size: 0.6em;">foreign</a> <a href="/tags/free/" style="font-size: 0.6em;">free</a> <a href="/tags/hello/" style="font-size: 0.6em;">hello</a> <a href="/tags/improve/" style="font-size: 0.8em;">improve</a> <a href="/tags/information/" style="font-size: 0.6em;">information</a> |
|
|
</div> |
|
|
</aside> |
|
|
|
|
|
|
|
|
|
|
|
<aside id="krw-posts" class="widget widget-kratos-poststab"> |
|
|
<h4 class="widget-title"><i class="fa fa-file"></i>最新文章</h4> |
|
|
<div class="tab-content"> |
|
|
<ul class="list-group"> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a class="list-group-item" href="/2023/06/04/mysql-interview-questions/"><i class="fa fa-book"></i> MySQL 面试题</a> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a class="list-group-item" href="/2021/02/09/java-io-stream/"><i class="fa fa-book"></i> 输入输出流</a> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a class="list-group-item" href="/2021/02/08/java-class-loading/"><i class="fa fa-book"></i> 类加载</a> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a class="list-group-item" href="/2021/02/07/java-annotation/"><i class="fa fa-book"></i> 注解</a> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a class="list-group-item" href="/2021/02/06/java-reflect/"><i class="fa fa-book"></i> 反射</a> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</ul> |
|
|
</div> |
|
|
</aside> |
|
|
|
|
|
|
|
|
</section> |
|
|
|
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
<footer> |
|
|
<div id="footer"> |
|
|
<div class="kr-tool text-center"> |
|
|
<div class="tool"> |
|
|
|
|
|
<div class="box search-box"> |
|
|
<a href="/search/"> |
|
|
<span class="fa fa-search"></span> |
|
|
</a> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="box theme-box" id="darkmode-switch"> |
|
|
<span class="fa fa-adjust"></span> |
|
|
</div> |
|
|
|
|
|
|
|
|
</div> |
|
|
<div class="box gotop-box"> |
|
|
<span class="fa fa-chevron-up"></span> |
|
|
</div> |
|
|
</div> |
|
|
<div class="container"> |
|
|
<div class="row"> |
|
|
<div class="col-md-6 col-md-offset-3 footer-list text-center"> |
|
|
<ul class="kratos-social-icons"> |
|
|
|
|
|
|
|
|
<li><a target="_blank" rel="nofollow" href="https://t.me/CandyUnion"><i class="fa fa-telegram"></i></a></li> |
|
|
<li><a target="_blank" rel="nofollow" href="https://twitter.com/Candiinya"><i class="fa fa-twitter"></i></a></li> |
|
|
|
|
|
|
|
|
|
|
|
<li><a target="_blank" rel="nofollow" href="https://github.com/yongkj"><i class="fa fa-github"></i></a></li> |
|
|
<li><a target="_blank" rel="nofollow" href="/atom.xml"><i class="fa fa-rss"></i></a></li> |
|
|
</ul> |
|
|
<ul class="kratos-copyright"> |
|
|
<div> |
|
|
<li>© 2023 yongkj 版权所有.</li> |
|
|
<li>本站已运行<span id="span_dt">Loading...</span></li> |
|
|
</div> |
|
|
<div> |
|
|
<li>Theme <a href="https://github.com/Candinya/Kratos-Rebirth" target="_blank">Kratos:Rebirth</a></li> |
|
|
<li>Made with <i class="fa fa-heart throb" style="color:#d43f57"></i> by <a href="https://candinya.com" target="_blank" rel="nofollow">Candinya</a>.</li> |
|
|
</div> |
|
|
<div> |
|
|
<li>Powered by <a href="https://hexo.io" target="_blank" rel="nofollow">Hexo</a></li> |
|
|
<li>Hosted on <a href="https://www.yongkj.cn" target="_blank">勇往直前</a></li> |
|
|
</div> |
|
|
<div> |
|
|
|
|
|
|
|
|
</div> |
|
|
</ul> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</footer> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<script defer src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.4/dist/js/bootstrap.min.js"></script> |
|
|
<script defer src="https://cdn.jsdelivr.net/npm/nprogress@0.2.0/nprogress.js"></script> |
|
|
<script>const notMobile = (!(navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i)));</script> |
|
|
|
|
|
<div> |
|
|
<canvas id="snow"></canvas> |
|
|
<script async type="text/javascript" src="/js/snow.min.js"></script> |
|
|
</div> |
|
|
|
|
|
<script async src="/js/candy.min.js"></script> |
|
|
|
|
|
|
|
|
<script defer src="https://cdn.jsdelivr.net/gh/fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js"></script> |
|
|
|
|
|
<script defer src="https://cdn.jsdelivr.net/npm/clipboard@2.0.6/dist/clipboard.min.js"></script> |
|
|
<script defer src="/js/kratosr.min.js"></script> |
|
|
<script defer src="/js/pjax.min.js"></script> |
|
|
|
|
|
|
|
|
<script defer src="/js/kr-dark.min.js"></script> |
|
|
|
|
|
|
|
|
|
|
|
</body> |
|
|
</html> |