之前学习javaSE的时候,没有针对性地对对类与对象的一些基础进行整理,下面这些内容是笔记内容整理后的,希望以后自己可以通过这些博客时常复习!
一、类and对象的基础
类似于类的生命啊,类与对象的关系这些东西感觉就没什么写的啦,下面的记录仅仅是我记录感觉自己还不太熟悉而且也比较常用的知识点。
1、对象的初始化方法
A、new 调用构造函数。常用的对象初始化方法其实也是new 关键字进行对象的构造,在new 对象过程中(其他构造方式构造函数也是类似),会调用对应的构造函数,对必要的变量进行初始化。
B、newInstance()方法。这个方法利用反射机制进行构造。一般是调用Class.forName()获取class对象之后,再调用class对象的newInstance方法进行初始化。在newInstance中,其实也是调用构造函数,只是只能调用无参否认构造函数进行对象的初始化。
C、序列化,这里不详细将,后面再总结啦。
D、clone方法;clone方法是实现了 cloneable的类所共有的方法,该方法可以对当前的对象进行数据拷贝操作。
2、类加载与初始化的具体过程。
java程序的具体执行过程大体如下:
java原始class文件-->类加载-->加载父类的static块-->加载子类的static快-->加载父类的非静态代码块-->加载父类的构造函数-->加载子类的非静态代码块-->子类的构造函数-->创建对象成功。(当然,非静态代码块只有在创建对象的时候才开始执行,而static块则是在类加载时就执行了);而初始化过程主要发生在构造函数运行期间。
二、类封装性
1、类的封装要完整,不可过多暴露变量(一般将变量设置为private,通过对于的方法入口访问私有变量才是最安全和推荐的做法),看一下例子代码:
class Person{ //定义一些变量 //public String name = null;//不推荐这样定义变量,破换封装性! private String name = null;//这里一般说,变量是设置为private,以保持类的良好封装性 private String sex = null; //通过对应的setter和getter方法进行访问私有变量。 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
通过统一的入口访问类所属的变量可以保持类的完好封装性。
2、类的访问入口(getter和setter)需要注意的地方(保持良好的封装性)。很多时候,我们会不自觉地做一些违反封装性的事情,请看下面的示意丑图:
上面示意图,其实我们可以总结到一个原则就是:尽量不要在方法中返回引用变量(当然,字符串等除外啦),因为这样会允许外部代码直接操作某个对象的引用变量对应的数据,这样破坏了封装性!
当然,这个原则在一般情况下我们是要遵守的,如果需要和对应引用指向的对象进行数据交互,应该考虑提供在原来的基础上提供一个入口进行数据交互(例如这里我要获取某个学生的所在学校的名字,这是,应该在学生类那里提供一个类似getStudentSchoolName的方法入口,而不是直接操作整个school类)
或者我们的确需要引用指向的对象数据时,可以调用clone方法返回(也就是说,类的封装严格地限制了外部方法对类的内部引用变量所指向的对象进行修改操作!)
三、方法调用与传参问题
1、方法调用:静态,直接类名+方法名(或者引用+方法名也行);非静态需要用引用调用;这个没什么好说的。
2、传参的注意事项:
传值or传引用?首先,要理解传值与传引用的概念(我想很多人没有学过c++只是学过java的人都会对什么是传引用有误解,当然也包括之前的我)
A、传引用:将一个指针(对应java中的引用)自身直接传给java方法
B、传值:将要传入的参数复制一份,将复制的副本传递给方法。
C、说明:java中所有的传参,都是传值!是的,你没听错,java没有传引用!
下面代码说明了这个例子:
//验证传值与传引用的方法 public void methodTest1(Person person){ person = new Person(); }
这里,传进来来的是person(指向某个对象的引用)的值的拷贝,这个方法的目的是将原来的person指向一个新的person对象,但是,其实这个传进来的person变量参数只是需要操作的那个person的一个引用值的拷贝罢了,它出了这个方法就会消失,所以这个方法,完全没有干任何的事情!
再看下面的例子,可能会更好理解传值和传引用
int test = 0; public void methodTest2(int test){ test = 9; }
这个方法估计大家都能理解:test的值并没有变为9,因为方法只是传值而已!
所以上面的例子也是一样道理:传进来的引用虽然是和要操作的person指向同一个对象(其实是可以通过该负责引用操作对象数据的),但是,它任然是值传递,methodTest1方法没有任何效果!
OK,这篇的类的基本知识就先总结到这里,下片着重整理下继承相关的问题!