百木园-与人分享,
就是让自己快乐。

一、对象与类

已经工作几年了,java,vue,python,C++各种项目都随叫随到,但除了C++其他都没有系统的学习过。这里仅记录下从头学习java基础的过程,和我认为值得记录的一些点,权当做一个备份和文档。

学习参考书:java核心技术 卷1 第九版。家里正好有这本书很多年了,也就看这个了,不是很推荐,原因:1,太厚,内容虽然详细但也很臃肿。2. 翻译,有些翻译不是很好理解。比如类中的数据,C++叫成员变量,这里翻译成域。

1  类的三种关系:use, has, is

2  封装:数据域私有,即隐藏数据的实现方式,只提供方法去操作。所有的使用者调用即可而不需要关心实现方法的都可以称为封装。

3  java的所有变量都是引用。这里的引用更类似于C++的指针,即每个java变量都是指向了一个内存中的对象(不深究的话可以简单的认为就是堆)。这里引申出来就很好理解java参数传递。java所有的参数都是变量的拷贝,而变量本身并不是对象而是对象的引用。举栗:

  class A{

    private int b=0;

    pubic void setB(int b){ this.b = b;}     

 }

  A isA = new A();

   无论是isA,或是传递给fun(A paramA)后的paramA,只要明白改变的是isA,paramA,还是真正的实例E,这个问题就很简单了。(这编辑器图片怎么才能浮动???)

  当我们调用isA.setB(1) 或者paramA.setB(2)时,我们调用的都是对象提供的修改器方法,改变了对象内部的属性,而两个变量仍然指向E。这时很明显我们修改的是对象。而当我们使用isA = new A(); 或其他返回A类型的方法时,这时我们改变的是isA,即让isA指向了其他对象。

  (鉴于有人说看不懂😅,补充下,果然表达是比较难的,我觉得写的很清楚明白,但从其他角度看可能很垃圾💔)

  

  所谓的java传参时可变类型/不可变类型,不过是实例对象没有修改方法,他也改不了,给变量付了另一个值罢了。这种说法很容易给人误导,也很难理解和记忆。

  例如 String str = \"hello world\" , str指向一个字符串实例对象。这个对象没有提供修改方法,那想要改变字符串的内容只能让str指向另一个地方,即重新赋值: str = \"beautiful world\"。

  所有的类型,包括不可变类型都可以按照上例A去理解。只不过是实例有没有提供修改方法罢了。

  总之,变量是对象的引用,区分好变量与对象实例的关系,弄明白修改的是变量还是实例,这些问题都迎刃而解。

4 public:所有类可见,private:本类可见,protected:本包可见。本类可见和本包可见并不是指对象,同一类的两个对象A和B,A的方法中是可以访问B的private 数据的。

  例如:

  class A{

    private int b=0;

    pubic void setB(int b){ this.b = b;}  

    public boolean equals(A other){ return this.b ==other.b}                 //可以直接访问同类型other的数据

 }

  同样的包可见也可以,而且protected是默认的,只要在同一个包下就可以直接访问所有为protected的数据。

5  当类的数据包含可变对象时,最好不要编写可以直接返回该对象引用的方法,这会破环封装,可以使用clone()方法。原因跟上面一样。

6  static 修饰变量->类变量,修饰函数->类函数。static修饰的都属于类本身,而不是类实例。

7  方法的名称和参数构成了方法的签名。我们起名叫重载指的是同名不同参数的方法。但其实对于编译器来说它们就是两个不同的函数。方法名和参数类型构成了方法的唯一标识,跟返回值无关哦。

8  仅当没有提供任何构造器时,编译器才会提供默认的构造器。

9  初始化,在固定逻辑的数据进行初始化时,我们可以默认初始化,例如上面的 private int b=0; 同时也可调用静态方法初始化,例如 private int id = assignId(); private static int assignId(){//操作};

  构造函数可以在第一句时使用 this(参数)的方式调用该类的另一个构造函数。 

  初始化块 :

  class A{

  private b = 1;

  {b = 100;}

  }

  在构造对象的时候会按照在类声明中出现的顺序,依次执行所有初始化语句和初始化块。其实在这之前会赋值默认值,即上面的b会在初始化A类对象时,先b=0,再b=1,再b=100;

  静态初始化块:

  同样可以用以下块来初始化类型:

  class A{

    static{//这会在类加载时 执行,可用于初始化类变量等}

  }

10   类路径,在配置java环境时可配置CLASSPATH,也可在运行时用 -classpath 参数指明。运行java程序时,虚拟机会首先查找jre/lib, jre/lib/ext 下的文件和rt.jar等运行时文件,之后查找类路径。如果没有设置类路径,类路径默认包含当前目录,如果设置了类路径却没有包含\".\", \".\"代表当前目录,则不会查找当前目录。

 


来源:https://www.cnblogs.com/lostO/p/16620624.html
本站部分图文来源于网络,如有侵权请联系删除。

未经允许不得转载:百木园 » 一、对象与类

相关推荐

  • 暂无文章