看了老罗罗升阳的专訪,不由自主地佩服,非常年轻,我之前以为和罗永浩一个级别的年龄。也是见过的不是初高中编程的一位大牛之中的一个,专訪之后。发现老罗也是一步一个脚印的人。

别说什么难做,做不了。你根本就没去尝试。也没有去坚持。

If you can't fly then run,if you can't run then walk, if you can't walk then crawl,but

whatever you do,you have to keep moving forward——Martin Luther King.

复用类这标题刚開始非常难懂。后面专门去看了书的英文原版。事实上标题是reusing classes,又一次使用类,事实上复用就是“利用现成的东西”的意思。事实上实现的两种方法就是java中常常听到的——组合和继承。

(1)组合

has-a的作用。

  1. public class TV {
  2. Show show;
  3. public String toString(){
  4. return "showgirl";
  5. }
  6. }
  7.  
  8. class Show{
  9. }

提一下toString方法,当你须要String而你是一个对象的时候,编译器会调用对象的toString方法。

TV里有Show,如今的show没有初始化。为null,不能调用show的方法。

组合的作用强大,以面向对象看,假如你在造一个Car类,那么你能够用组合轻易的将Glass,Light,Engine等等的Car这些部件组合起来。

(2)继承

is-a

  1. package com.myown.iaiti;
  2.  
  3. public class Father {
  4. public int i;
  5.      void get(){
  6.          System.out.println("father");
  7.      }
  8. }
  9.  
  10. package son;
  11. import com.myown.iaiti.*;
  12.  
  13. public class Son extends Father{
  14.         Father f = new Father();
  15.         int j = f.i;
  16.         Son son = new Son();
  17.         son.get();
  18.     }
  19.     
  20.     public void get(){
  21.         super.get();
  22.         System.out.println("son");
  23. }
  24. }
  25.  

这里有个包訪问权限的问题,假如没有加public的时候。默认是包内成员訪问。不同包訪问,即Son中的Father成员訪问get方法是不可见的。而public的话是可见的,所以i訪问得到。

private部分是不能继承,属于父类私有,而public的部分。将继承,须要改动的方法,能够进行重写。要加入的属性能够单独加入。

并且继承的方法。假设原本的father的public方法重写之后没将public加上,会有Cannot reduce the visibility of the inherited method from Father,也就是不能降低父类中继承方法的可见性。

super指的是父类,即Father。

另一点是,事实上java中全部的类都隐式地继承了Object类。Object是父类,其它类是子类

老外喜欢讲为基类。子类也叫导出类或者派生类。

(3)代理

设计模式里面有个比較难懂的——代理模式,作者讲的非常有趣。代理是组合和继承的中庸之道。

  1. package son;
  2. class Father{
  3. public void get(){
  4. System.out.println("father");
  5. }
  6. }
  7. public class Son extends Father{
  8. public static void main(String[] args) {
  9. Father f = new Father();
  10. f.get();
  11. }
  12. }
  13.  
  14. class FatherProxy{
  15. private Father f = new Father();
  16. public void get(){
  17. f.get();
  18. }
  19. }

像直接把Father当做成员,那么father的方法就暴露给这个类了,那我们能够使用FatherProxy这种代理类。我自定义好get方法是怎么拿的,我自己知道是调用father的get方法。可是使用我这个代理的人不知道,我仅仅告诉他你要用就用代理的get的方法就能够了。封装性就体现出来了。上面仅仅是随便敲的一个简单样例。

(4)重写和重载

  1. class Father{
  2. public void get(String s){
  3. System.out.println("father");
  4. }
  5.  
  6. public void get(boolean b){
  7. System.out.println("boolean");
  8. }
  9. }
  10. public class Son extends Father{
  11. @Override
  12. public void get(String s){
  13. System.out.println("father");
  14. }
  15.  
  16. // @Override //会有错误提示 由于父类没有该方法,不是重写
  17. public void get(int i ){
  18. System.out.println("sonint");
  19. }
  20.  
  21. public static void main(String[] args) {
  22. Son s = new Son();
  23. s.get("d");
  24. s.get(false);
  25. s.get(1);
  26. }
  27. }

重写是又一次覆盖父类的方法,假设没有重写或者重载。那么子类调用一个子类没有的方法时,事实上是调用父类。

重载是相同的方法名,但參数名称不同,为了防止你错误的进行重载能够加上@Override标签,那样会提示你并没有重写方法。

(5)protected

Java编程思想(三) —— 訪问权限的控制

在前面一篇提前写了,由于之前没讲继承的东西。

能够简单将protected看成父类给儿子继承的遗产,其它非继承类不能訪问。

(6)finalkeyword

加上finalkeyword的基本类型,表示这个变量初始化后不会改变。类似c的define。你希望一个变量在这个程序里就是这个值不须要改变。就能够用final。

  1. public class Son{
  2. int age = 2;
  3. public static void main(String[] args) {
  4.  
  5. final int i = 1;
  6. // i = 2; 值不能再改变
  7. final Son son = new Son();
  8. // son = new Son();
  9. //The final local variable son cannot be assigned.
  10. //It must be blank and not using a compound assignment
  11. //final修饰的局部变量son不能被分配,必须为空或者不要再次分配
  12.  
  13. son.age = 4;
  14. //尽管引用恒定不变。可是,对象本身却能够改变。
  15. }
  16.  
  17. void change(final int c){
  18. // c= this.age; 无法赋予新值 由于值仅仅有在方法传參决定 对象引用和这个相似
  19. //age ++; 无法改变
  20. }
  21. }

static本来是静态初始化,和final一起用就是占领了一块不能改变的存储空间。

static final即编译期常量。常量名依照c的常量命名传统。所实用大写字母。单词之间用下划线分开。

  1. static final VALUE_ONE = 1

final修饰方法时

  1. public class Print {
  2. final void cannotprint(){
  3. System.out.println(1);
  4. }
  5. }
  6.  
  7. public class PrintSon extends Print{
  8. //void cannotprint(){}
  9. //无法重写 由于被final修饰了
  10.  
  11. public static void main(String[] args) {
  12. PrintSon ps = new PrintSon();
  13. ps.cannotprint();
  14. }
  15. }

能够看成父类要求子类必须继承的不可改动財产(祖传)。private隐式地指定为final。由于private根本就不给你继承。这比给你继承但不能改动还更私有。

顺便将权限理清。

public,公共財产,不止是子类,其它类也能够用。

final,祖传珍宝,留给子类,但不同意改动。

private,父类私有財产,不会给子类继承。

protected。父类专门留给子类的財产,其它人不能用它。

当final修饰的是类的时候。是为了让这个类不会被继承。

(7)继承和初始化

这里的顺序问题是一个非常有趣的问题。

看样例。

  1. class GrandFather{
  2. private static int i = print();
  3. private static int print(){
  4. System.out.println("g");
  5. return 1;
  6. }
  7. }
  8. class Father extends GrandFather{
  9. private static int i = print();
  10. private static int print(){
  11. System.out.println("f");
  12. return 1;
  13. }
  14. }
  15. public class Son extends Father{
  16. private static int i = print();
  17. private static int print(){
  18. System.out.println("s");
  19. return 1;
  20. }
  21. public static void main(String[] args) {
  22. System.out.println("first");
  23. }
  24. }

打印的结果是first吗?错了。

尽管运行的是main方法。可是看到son这个须要静态初始化的i没有,结果是s。first吗?

这还有初始化的问题,son是继承father。那么编译器会载入father。并初始化i。那father继承grandfather。那么编译器会去载入grandfather,类似递归。

那最后最先初始化的是grandfather的i。

所以最后的结果是:g,f,s,first。

至于这章提到的向上转型。是和多态联系着的,所以放到下一篇来讲。

面向对象的三大基本特性之中的一个 —— Java编程思想(五) —— 多态。

Java编程思想(四) —— 复用类的更多相关文章

  1. Java编程思想之七复用类

    复用代码是Java众多引人注目的功能之一.但要想成为极具革命性的语言,仅仅能够复制代码并对之加以改变是不够的,它还必须做更多的事情. 使用类而不破坏程序代码: 在新类中产生现有对象.由于新的类是由现有 ...

  2. Java编程思想学习笔记——类的访问权限

    类的访问权限 Java中,访问权限修饰词用于确定库中哪些类对于该库的使用者是可用的. public class Foo{ } 注意点: 每个文件(编译单元)只能有一个public类. public类的 ...

  3. Java编程思想:File类list()方法

    import java.util.regex.Pattern; import java.io.File; import java.io.FilenameFilter; public class Tes ...

  4. Java编程思想:File类其他方法

    import java.io.File; public class Test { public static void main(String[] args) { MakeDirectories.te ...

  5. Java编程思想:嵌套类

    public class Test { public static void main(String[] args) { // Parcell11.test(); // ClassInterface. ...

  6. Java编程思想:File类getCanonicalFile()方法,listFile()方法

    import java.io.IOException; import java.util.*; import java.util.regex.Pattern; import java.io.File; ...

  7. Java编程思想学习(一)----对象导论中多态的理解

    1.1抽象过程 1)万物皆对象. 2)程序是对象的集合,他们通过发送消息来告知彼此所要求做的. 3)每个对象都有自己的由其他对象所构成的存储. 4)每个对象都拥有其类型. 5)某一特定类型的所有对象都 ...

  8. java编程思想-复用类总结

    今天继续读<java 编程思想>,读到了复用类一章,看到总结写的很好,现贴上来,给大家分享. 继承和组合都能从现有类型生成新类型.组合一般是将现有类型作为新类型底层实现的一部分来加以复用, ...

  9. Java编程思想第四版勘误

    坊间传说这本书翻译得很烂,我倒觉得还好.虽然看原文更准确,但是如果在具备一定编程思维和基础.能够看出来疑问的情况下,还是看中文更快一些,而且这本书本身也不适合初学者看.当然,错误和不通顺还是有的,而且 ...

随机推荐

  1. rsync同步操作命令

    在本地磁盘同步数据 将/home做个备份 # rsync -a --delete /home /backups -a 归档模式,表示以递归方式传输文件, -delete 删除那些接收端还有而发送端已经 ...

  2. Golang 在 Mac、Linux、Windows 下交叉编译

    Golang 支持在一个平台下生成另一个平台可执行程序的交叉编译功能. Mac下编译Linux, Windows平台的64位可执行程序: CGO_ENABLED= GOOS=linux GOARCH= ...

  3. css五种定位方式介绍

    1.static定位(普通流定位) -------------- 默认定位 2.float定位(浮动定位) 例:float:left; 有两个取值:left(左浮动)和right(右浮动).浮动元素会 ...

  4. 5、Go if else 条件判断

    package main import "fmt" func main(){ //注:在Go里面没有三元表达式”?:”,所以你只能使用条件判断语句. //示例一 if 7%2==0 ...

  5. windows 实用DOS命令。

    1. findfind方法要比findstr要简单,参数要少.find /? 命令可以查看所有find命令的参数.find命令的基本格式是这样的:find "要查找的字符串" 要查 ...

  6. js实现观察者模式风格替换

    如下图,我们看到两种风格:在选择男士时,页面颜色为黑色:在选择女士时,页面颜色为粉红色. 主要可以分为两类: 下拉框 ---> 被观察者 div ---> 观察者 面向过程实现风格替换: ...

  7. php如何openssl_encrypt加密解密

    最近在对接客户的CRM系统,获取令牌时,要用DES方式加密解密,由于之前没有搞错这种加密方式,经过请教了"百度"和"谷歌"两个老师后,结合了多篇文档内容后,终于 ...

  8. 紫书 习题 10-10 UVa 1645(递推)

    除了根节点以外,有n-1个节点,然后就看n-1的因数有那些,所有因数加起来(递推)就好了. #include<cstdio> #define REP(i, a, b) for(int i ...

  9. 如何创建一个可以使用try.....catch.......捕获的异常

    代码很简单,大家一看基本上就能明白(有一定的java基础,熟悉try......catch.....finally的使用方法) package com.nokia.test1; public clas ...

  10. asp.net.core网站重启后登陆无效问题(部署在IIS)

    一.问题 在使用asp.net.core时,把网站发布到IIS后,在后续更新中需要停止网站,然后重启网站,发现已经登陆的用户会退出登陆.过程如下 1.登陆代码(测试) [AllowAnonymous] ...