java 类与对象基础整理
之前学习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 类与对象基础整理的更多相关文章
- JAVA 类和对象基础知识详解
/*文章中用到的代码只是一部分,需要源码的可通过邮箱联系我 1978702969@qq.com*/ 和C++一样,JAVA也是一门面向对象的语言,其基础和核心是类和对象.而面向对象的思想是来源与显示生 ...
- java类与对象基础篇
java面向对象基础篇 面向对象程序设计(Object Oriented Proframming ,OOP) 面向对象的本质是:以类的方式组织代码,以对象的方式组织(封装)数据. 面向对象的核心思想是 ...
- java类与对象基础--抽象类和接口
在java的类体系中,有两个比较特殊的抽象体--抽象类和接口.抽象体并不可以拥有具体的对象(而且接口甚至不是类),但是它们却是在java设计领域非常重要的两个概念,很多优秀的设计模式都是基于这两个概念 ...
- [Java初探08]__简单学习Java类和对象
前言 在前面的学习中,我们对面向对象的编程思想有了一个基本的了解,并且简单的了解了类和对象的定义.那么类和对象在Java语言中是如何表现的,这次,就从实际出发,学习一下一下类和对象在Java语言中的使 ...
- Java类和对象初始化
类的生命周期: Java类的初始化: 本阶段负责为类变量赋正确的初始值.(类变量即静态变量) Java编译器把所有的类变量初始化语句和静态初始化器通通收集到<clinit>方法中,该方法只 ...
- java类和对象之间的差
java类和对象之间的差别是一个普遍的问题,刚开始学习java当它来到与类和对象接触.今天就来总结一下它们之间的差异. 先说说class和object差异.事实上,词:object是全部class的父 ...
- 危险代码:如何使用Unsafe操作内存中的Java类和对象
危险代码:如何使用Unsafe操作内存中的Java类和对象—Part1 危险代码:如何使用Unsafe操作内存中的Java类和对象—Part2 危险代码:如何使用Unsafe操作内存中的Java类和对 ...
- java类和对象
类是对象的抽象 对象是类的一个实例类 对象 = new 类();拿对象可以操作这个类里的方法 java类与对象的区别是个老生常谈的问题,刚开始学java的时候就开始接触类和对象,今天来总结一下他们之间 ...
- MOOC C++笔记(二):类和对象基础
第二周:类和对象基础 面向对象程序设计的四个基本特点 抽象.封装.继承.多态. 面向对象程序设计的过程 1.从客观事物抽象出类 抽象出的事物带有成员函数与成员变量(类似于带函数的结构体) 成员变量和成 ...
随机推荐
- django中models联合唯一unique_together
例: 文章点赞 class ArticleUpDown(models.Model): """ 点赞表 """ nid = models.Au ...
- “全栈2019”Java第四十九章:重载与重写对比详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- tcp/ip学习笔记(1)-基本概念
为什么会有tcp/ip 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中上帝打乱了各地人的口音,让他们无法合作一样.计 ...
- 淘宝内部分享:MySQL & MariaDB性能优化 【转】
MySQL· 5.7优化·Metadata Lock子系统的优化 背景 引入MDL锁的目的,最初是为了解决著名的bug#989,在MySQL 5.1及之前的版本,事务执行过程中并不维护涉及到的所有表的 ...
- [Flex] 组件Tree系列 —— 运用LabelFunction hasChildren getChildren设置Tree包含节点个数
mxml: <?xml version="1.0" encoding="utf-8"?> <!--功能描述:运用LabelFunction h ...
- ios 相机 自定义 相片的截取
前段时间公司需要做一个身份识别的功能,而系统相机无法满足要求,so自己自定义了. 上代码: .h文件 #import <UIKit/UIKit.h> #import <AVFound ...
- jmxtrans 监控kafka
jmxtrans 的版本必须 是jmxtrans-268.rpm 以上 如果kafka 为kafka_2.11-0.10.1.0 ,则在 jdk 1.7上使用 kafka_2.12-0.11.0.0 ...
- java 上传文件大小转换为 GB/MB/KB/B
1.工具类 package cn.cmodes.common.utils; import java.io.File; import java.io.FileInputStream; import ja ...
- [HDU4089]Activation(概率DP)
HDU4089 题意:有n个人排队等着在官网上激活游戏.Tomato排在第m个. 对于队列中的第一个人.有一下情况: 1.激活失败,留在队列中等待下一次激活(概率为p1) 2.失去连接,出队列,然后排 ...
- Git服务器搭建笔记
前言:最近公司要使用git服务器对Android4.4的源码进行版本控制,所以花了些时间在Ubuntu14.04上搭建了git服务器,正好前段时间也学习了下git的使用哈哈 ------------- ...