zoukankan      html  css  js  c++  java
  • think in java 手记(一)

    工作之余,不知道要做些什么。该做的事情都完成的差不多了,想看一下spring的东西,毕竟这些东西用的多。但是又想看一下关于javaee的东西,这个里面的设计模式多。想了一会儿,觉得这些无非都是工具,java才是基础。突然想起了大学时候,老师推荐的《think in java》,之前看了一遍,懵懵懂懂,现在再看看,结合工作学习中的经验,或许能收获一些不同的东西。

    (一)关于类和成员的访问权限

    开篇写到了java类和成员的范围和访问权限,public, private ,protected, friendly。

    前不久,在工作中,编写一个工具类,其中用到某个model的时候,无论如何,都会报错,提示此类不存在,建议建立一个新的类。当初以为编辑器除了问题,后来查看model类,才发现,原来类是这么定义的:

    class mymodel{
    ....
    }

    这是个默认friendly的类,和我的工具类不在一个包下,所以访问不到这个类的,由此报错。

    (二)关于继承

    我们费尽心思做出一种数据类型后,假如不得不又新建一种类型,令其实现大致相同的功能,那会是一件非常令人灰心的事情。但若能利用现成的数据类型,对其进行“克隆”,再根据情况进行添加和修改,情况就显得理想多了。“继承”正是针对这个目标而设计的。但继承并不完全等价于克隆。

    有两种做法可将新得的衍生类与原来的基础类区分开。第一种做法十分简单:为衍生类添加新函数(功能)。尽管extends关键字暗示着我们要为接口“扩展”新功能,但实情并非肯定如此。为区分我们的新类,第二个办法是改变基础类一个现有函数的行为。我们将其称作“改善”那个函数。

    (三)向上转型()

    这个东西,曾经困惑了很久,主要是因为这个东西用的实在是太少了。

    结合书中的代码,我这里也写了一段,关于形状(Shape)和圆形的(Circle)。

    package com.thinkinjava.unit1;
    
    public class Shape {
        public void move(Shape shape){
            System.out.println(shape.getClass().getName()+", move ...");
        }
        public void draw(Shape shape){
            System.out.println(shape.getClass().getName()+", draw ....");
        }
        
        public void doStuff(Shape shape){
            shape.move(shape);
            shape.draw(shape);
        }
        
    }

    这里规定了,通用的形状所具有的方法。

    写一个Circle继承我们刚刚写的Shape:

    package com.thinkinjava.unit1;
    
    public class Circle extends Shape {
        
    }

    什么都没做,就是衍生了一个基础类(Shape)。

    然后写一个main方法:

    package com.thinkinjava.unit1;
    
    public class Main {
        public static void main(String[] args) {
            Circle circle=new Circle();
            circle.doStuff(circle);
        }
    }

    这样,实现上转型,即是书中说的 “上溯造型”。

    这里的Circle circle=new Circle()可以写成Shape circle=new Circle(),一样的。但是后者很容易让人迷糊。

    运行结果为:

    com.thinkinjava.unit1.Circle, move ...
    com.thinkinjava.unit1.Circle, draw ....

    这个结构很鲜明,就是在方法中传递基础类类型,放入的参数类型,必须是继承自该基础类的。

    说实话,这个技术的应用场景,至今也没有接触过。书中所说的,传递该基础类作为参数类型,是为了防止传入具体子类,要重新写更多的子类代码。

    具体更加形象的应用场景,希望有明白的,能指教一下。

  • 相关阅读:
    Html.ActionLink 几种重载方式说明及例子
    2 python 文本特征提取 CountVectorizer, TfidfVectorizer
    模型调参---GridSearchCV
    1 NLP学习大纲
    pandas.dropna/isnull/fillna/astype的用法
    激活函数总结
    LeetCode--53 最大连续子序列(总结)
    LeetCode--44 通配符匹配
    LeetCode--Two_Sum
    css 背景图片自适应元素大小
  • 原文地址:https://www.cnblogs.com/juepei/p/3873596.html
Copyright © 2011-2022 走看看