-
Title:
Inheriting Behavior
-
Description:
-
让我们先回到 Just Java 应用
-
看一下 MainActivity 类下的 displayMessage 方法
-
从这里开始更好理解了
-
我们认识到我们已经创建了一个叫做 orderSummaryTextView 的变量
-
变量的数据类型是 TextView
-
但我们到现在还不理解这一部分
-
在下一行 在我们在这个 TextView 对象上调用方法
-
我们使用在上面声明的相同的变量名
-
调用 orderSummaryTextView.setText 方法
-
然后我们传入一个字符串作为这个方法的输入
-
这个字符串类型的 message 其实是 displayMessage
-
方法的输入参数
-
现在我们深入了解一下这部分我们不理解的代码
-
虽然 findViewById 像是一个方法调用
-
因为它在看起来像输入参数的括号前面
-
但是 令人感到奇怪的是这个方法没有在类中任何地方定义
-
如果我在名字上双击并且按住 Cmd+F 或者
-
如果你是 Windows 按住 Ctrl+F 然后我们就能尝试在这个文件中搜索
-
我只看到两个 findViewById
-
并且它们使用的方式相同
-
但是我没有看到叫做 findViewById的方法
-
说到这 早先在 MainActivity 类中
-
我们调用了 setContentView 方法 但是你在文件中搜索的话
-
MainActivity 中也没有定义
-
那么这些方法在哪里定义的呢?
-
MainActivity 实际上是一个相当短的文件
-
它只有 90 行代码
-
但这个类比我们看到的拥有更多的内容
-
代码显示 extends AppCompatActivity
-
这意味着 MainActivity 类是
-
AppCompatActivity 类的功能上的一个扩展
-
在你的电脑上 如果你看到 ActionBarActive 没关系
-
那是一个旧版本
-
你应该使用的最新版本是 AppCompatActivity
-
而且 AppCompatActivity 是在旧 Android 设备上是
-
支持向下兼容的
-
AppCompatActivity 是 Android Support Library 的一部分
-
它允许我们在旧 Android 设备上
-
使用 Android最新的 UI 特征
-
通过继承 AppCompatActivity 类
-
MainActivity 免费获得了这里的所有
-
的函数 属性和方法
-
我们不需要从这里复制粘贴代码
-
我们只需要简单的继承这个类就可以
-
如果你感兴趣
-
你可以通过 Google 搜索更多关于 AppCompatActivity 的信息
-
这里是 AppCompatActivity 类的参考文档
-
因为我安装了 Chrome 扩展
-
所以我可以查看代码
-
这就是 AppCompatActivity 类定义的地方
-
你可以看到这里有很多的函数
-
但是你不需要理解它们是怎样实现的
-
你需要知道的是当你继承 AppCompatActivity 时
-
你就免费获得了这些函数
-
在更高层次中 你可以这样简化
-
这是 MainActivity 类的定义
-
在这里你定义了一些方法
-
当你继承 AppCompatActivity 后 我们能够从
-
AppCompatActivity 中获得属性和方法
-
现在它们并没有真正地添加到 MainActivity 类中
-
但是你可以想象它们在这
-
因为你也可以引用这些属性和方法
-
这就是为什么我们的代码能够引用 setContentView或
-
findViewById 方法的原因
-
因为我们继承了这些方法 所以我们没有在 MainActivity 中定义它们
-
MainActivity 是在设备上作为屏幕显示用的
-
但是我们没有在 MainActivity 中写这部分代码 这也是继承来的
-
在类中 我们没有直接拥有 AppCompatActivity 类的属性和方法
-
现在我们知道 它们一直在那 我们可以引用它们
-
说到继承 有好也有坏
-
有时我们想要继承行为 但是
-
有时我们只是想稍作修改
-
如果你想从继承的类中改变一些行为
-
你可以重载这个方法
-
你可以在方法上面加上 @override 这样的话电脑
-
就知道你不想要从 AppCompatActivity 继承来的方法
-
而是想要你自己定义的方法
-
这是一个棘手的问题 它需要很多练习
-
我们看一个 关于 AppCompatActivity 类的
-
重载方法的例子
-
这个方法是 onCreate 方法
-
通过在 MainActivity 类中重载 oncreate 方法 我们指定
-
当这个类调用时 使用的是我们自己的实现
-
如果你不理解 不要担心
-
我正要给你一个关于面向对象编程概念
-
的简短介绍
-
你绝对还有一些其他问题
-
而且需要阅读很多关于这个的话题 才能充分
-
理解它们
-
另一个简化 MainActivity 类和 AppCompatActivity 类之间的
-
关系的方法是画一个类层次图
-
这与视图层次图是不一样的 因为
-
视层次图显示的是视图树 就像之前屏幕上显示的那样
-
类层次图显示的是不同
-
Java 类之间的关系
-
我们有作为父类的 AppCompatActivity 类
-
因为 MainActivity 继承 AppCompatActivity
-
它被称为子类
-
所以当你看到此种类型定义时 不管继承什么
-
它都被称作父类
-
这个被称作子类
-
如果你创建另一个叫做 DetailActivity 的 activity
-
它继承 AppCompatActivity 那么它就是子类
-
这个是父类
-
这是另一个 Java 继承的例子
-
如果你想一下 会发现 TextView ImageView 和
-
按钮有一些共同之处
-
这些 View 在屏幕上都有宽度和高度
-
虽然我们还没学到 但它们都有一个可见属性
-
所以它们可以设置成可见或不可见
-
还有一些其他的属性 它们是相同的
-
除了把这些属性代码写到 TextView 类中
-
然后复制到 ImageView 类和按钮类中
-
我们有更聪明的做法
-
我们可以创建一个 View 类
-
提取这些 View 的相同属性 然后把它们放到
-
View 类中 那样的话代码就可以只写一次
-
但是我们怎样把 TextView 类和 view 类
-
联系起来呢?
-
如果你想到继承 那就对了
-
在 TextView.java 文件中 我们将要定义 TextView 类
-
然后从 View 类中继承所有的数据和方法
-
在 TextView 类中 我们不会有太多的代码
-
因为 一部分功能已经在 View 类中实现了
-
同样可以应用到 ImageView 类和按钮类
-
我们不需要写太多代码
-
在这些文件中 我们只需要写 ImageView 与 View
-
不同的代码即可
-
我认为这里要指明区别 所以 ImageView 类必须指明
-
ImageView 与 View 类的不同之处
-
如果我们不想从 View 类中继承某个行为
-
我们只需要在 ImageView 类中指定更新的方法就可以
-
或者其他任何类中
-
提醒一下在这个例子中的术语
-
TextView 是子类 View 是父类
-
如果我们回到关于 TextView 类的文档说明
-
我们实际上已经明白了这部分
-
TextView 继承 View
-
现在我们明白它意味着 我们从 View 类
-
继承了所有属性和方法
-
下面是类层次图
-
它表明 TextView 类继承 View 类
-
依次向上 View 类继承 Object 类
-
如果你浏览周围 你会发现其他类
-
EditText 类实质上继承 TextView 类
-
所以它从 TextView 类获得行为
-
然后添加了一些自己的功能
-
所以 EditText 继承 TextView
-
TextView 继承 View View 继承 Object
-
这是类继承图
-
这样的例子还有很多 你可以浏览好几个小时
-
但是我在 TextView 文档页面只给你看一项
-
我只给你演示一下设置可见性的方法
-
这是 TextView 类中设置可见性的方法
-
它决定 View 是可见还是不可见
-
如果我点击这个方法 它实际上把我带到了 View 类
-
这里描述了这个方法是做什么的
-
你可以看到 TextView 对象有一个设置可见性的方法
-
它是继承自 View 类
-
所以我们从 View 类免费获得这些功能
-
我们刚刚讲了很多新概念
-
正常情况下 它会贯穿计算机科学课程的整个学期
-
我们将要做一些练习
-
希望它能贯穿这些知识点
-
但是你要花费很多的时间和练习才能
-
掌握这些概念
-
第一个练习 我想让你创建一个新的 Android 应用
-
因为我们不想弄乱 Just Java 应用
-
如果你创建了这个工程 然后运行应用
-
如果你创建了你自己的应用 你会看见一个 MainActivity 文件
-
MainActivity 文件继承自 AppCompatActivity
-
在你的 Android Studio 版本中 如果你的 MainActivity
-
继承自 ActionBarActivity 也是可以的
-
那只是 ActionBarActivity 的一个旧版本
-
通过删除这个方法的重载 我们会使用
-
AppCompatActivity 类中出现的 onCreate 方法
-
这个方法的出现表明我们想要在 MainActivity 中
-
使 onCreate 有不同的行为
-
所以删除它就会回到 AppCompatActivity 类
-
中的原始方法
-
当你运行应用的时候
-
你注意到它与你第一次运行的时候不一样了吗?
-
在这个文本框中写下你的答案