之前学习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,这篇的类的基本知识就先总结到这里,下片着重整理下继承相关的问题!

  

java 类与对象基础整理的更多相关文章

  1. JAVA 类和对象基础知识详解

    /*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 1978702969@qq.com*/ 和C++一样,JAVA也是一门面向对象的语言,其基础和核心是类和对象.而面向对象的思想是来源与显示生 ...

  2. java类与对象基础篇

    java面向对象基础篇 面向对象程序设计(Object Oriented Proframming ,OOP) 面向对象的本质是:以类的方式组织代码,以对象的方式组织(封装)数据. 面向对象的核心思想是 ...

  3. java类与对象基础--抽象类和接口

    在java的类体系中,有两个比较特殊的抽象体--抽象类和接口.抽象体并不可以拥有具体的对象(而且接口甚至不是类),但是它们却是在java设计领域非常重要的两个概念,很多优秀的设计模式都是基于这两个概念 ...

  4. [Java初探08]__简单学习Java类和对象

    前言 在前面的学习中,我们对面向对象的编程思想有了一个基本的了解,并且简单的了解了类和对象的定义.那么类和对象在Java语言中是如何表现的,这次,就从实际出发,学习一下一下类和对象在Java语言中的使 ...

  5. Java类和对象初始化

    类的生命周期: Java类的初始化: 本阶段负责为类变量赋正确的初始值.(类变量即静态变量) Java编译器把所有的类变量初始化语句和静态初始化器通通收集到<clinit>方法中,该方法只 ...

  6. java类和对象之间的差

    java类和对象之间的差别是一个普遍的问题,刚开始学习java当它来到与类和对象接触.今天就来总结一下它们之间的差异. 先说说class和object差异.事实上,词:object是全部class的父 ...

  7. 危险代码:如何使用Unsafe操作内存中的Java类和对象

    危险代码:如何使用Unsafe操作内存中的Java类和对象—Part1 危险代码:如何使用Unsafe操作内存中的Java类和对象—Part2 危险代码:如何使用Unsafe操作内存中的Java类和对 ...

  8. java类和对象

    类是对象的抽象 对象是类的一个实例类 对象 = new 类();拿对象可以操作这个类里的方法 java类与对象的区别是个老生常谈的问题,刚开始学java的时候就开始接触类和对象,今天来总结一下他们之间 ...

  9. MOOC C++笔记(二):类和对象基础

    第二周:类和对象基础 面向对象程序设计的四个基本特点 抽象.封装.继承.多态. 面向对象程序设计的过程 1.从客观事物抽象出类 抽象出的事物带有成员函数与成员变量(类似于带函数的结构体) 成员变量和成 ...

随机推荐

  1. WEB新手之do u know caidao?

    继续写题. 进入该网站,可以看到显然题目给出了一个假的flag.再看第二句话,说题目里存在shell.于是用御剑扫描一下后台. 如上图所示,扫出了一个叫shell的包.于是常识性地在URL加上shel ...

  2. 洛谷P2495 [SDOI2011]消耗战(虚树)

    题面 传送门 题解 为啥一直莫名其妙\(90\)分啊--重构了一下代码才\(A\)掉-- 先考虑直接\(dp\)怎么做 树形\(dp\)的时候,记一下断开某个节点的最小值,就是从根节点到它的路径上最短 ...

  3. C#中简单操作Mysql数据库

    以C#访问MySQL数据库,执行简单的CRUD. MySql.Data.dll是C#操作MySQL的驱动文件,是C#连接MySQL必要插件,使C#语言更简洁的操作MySQL数据库.可以用NuGet命令 ...

  4. 前端统计图 echarts 实现简单柱状图

    前端统计图   echarts实现简单柱状图 1. 引入 ECharts <!DOCTYPE html> <html> <head> <meta charse ...

  5. Centos 7.6 安装selenium+firefox+google chrome(支持xshell运行)

    1. 查看Linux 版本 [root@penguin selenium]# cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) ...

  6. python高级(一)—— python数据模型(特殊方法)

    本文主要内容 collections.namedtuple __getitem__ 和 __len__ __repr__和__str__ __abs__.__add__和__mul__ __bool_ ...

  7. [Alpha]Scrum Meeting#3

    github 本次会议项目由PM召开,时间为4月3日晚上10点30分 时长15分钟 任务表格 人员 昨日工作 下一步工作 木鬼 撰写团队贡献分配计划(issue#39) 调整&分配工作 SiM ...

  8. redis的主从同步

    一.redis的主从操作流程 1. 准备三个redis配置文件 #进入redis的配置文件夹,准备好这几个文件,6379不用管,默认的,和这次操作无关 [root@qishi ~]# cd /etc/ ...

  9. archlinux安装tftp

    1. 安装  [guo@archlinux ~]$ sudo pacman -S tftp-hpa 2. 启用  [guo@archlinux ~]$ systemctl start tftpd.se ...

  10. archlinux安装串口终端ckermit

    1. 将usb转串口连接到PC上.通过dmesg命令可以查看USB转串口是否被PC识别.   显示 ……attachec to ttyUSB0即被识别.   linux系统一般有USB转串口驱动(PL ...