3.JAVA-方法重载,类的封装,构造/析构方法
1.方法重载
和C++的函数重载一样,主要是实现多个相同的函数名,但是参数表不同.
参数表不同主要有以下几种
- 1) 参数个数不同
- 2) 参数类型不同
- 3) 参数顺序不同
2.类和对象
类class
用来描述一个对象的结构,但是类不能直接使用,必须生成对象后才能使用
对象
通过类来生成的一个对象, 根据类生成的对象都具备相同的行为(class成员函数),但是属性(class成员变量)不一定相同.
3.对象引用分析
示例如下:
class People
{
String name;
public void print(){
System.out.println("name:"+name);
}
} public class Test{
public static void main(String args[]){
People PeopleA = new People(); //在栈空间定义一个peopleA地址,然后通过new在堆空间创建一段内存,使PeopleA引用它 PeopleA.name ="小张"; People PeopleB = PeopleA; //在栈空间定义一个peopleB地址,然后使peopleB引用peopleA所指向的堆空间. PeopleB.print();
}
}
打印如下:

可以看到通过引用,可以让两个对象指向同一块堆空间
4.类的封装
成员变量访问权限有以下4种:

- 在JAVA中,成员变量权限默认是为default (和C++不同,C++默认为private).
- 上图的同一包,表示在同一个目录中的类成员访问权限
包的定义以及使用参考: 13.JAVA-包package、import使用
接下来我们来看看default区别
定义common.demo.Test类:
package common.demo ; //指定生成的class文件位于common/demo/目录下
public class Test
{
static int i=10; //默认为default权限
public static void main(String args[]){
System.out.println("Hello World");
}
}
定义common.demo.CallTest类,此类和common.demo.Test类位于同一包:
package common.demo ; //指定生成的class文件位于common/demo/目录下
import common.demo.*; //导入common.demo包里的所有类 public class CallTest
{
public static void main(String args[]){
System.out.println("i:"+Test.i); //打印静态属性i
}
}
运行打印:

然后我们屏蔽" package common.demo ;"后,则CallTest类不在common.demo包里了,所以访问Test.i将会报错,编译后如下图所示:

5.构造方法
- 构造方法的作用,用来类对象实例化的时候,初始化其属性(成员变量)所准备的
- 如果类中没有定义构造方法,编译器会默认提供一个无参数的构造方法。
- 构造方法可以带参数,但是不能有任何返回类型的声明
- 构造方法不能定义static类型,因为构造方法是在运行期间才会去生成对象
- 构造方法支持多个方法重载
示例:
class People
{
public People(String name){ //构造方法
this.name = name; //类中有个隐藏的this属性,它永远指向当前对象
}
public void print(){
System.out.println("name:"+name);
}
} public class Test{
public static void main(String args[]){
People PeopleA = new People("小张"); //调用 构造方法People(String name) 来初始化属性
PeopleA.print();
}
}
6.析构方法
- 在java中,也有析构方法,不过和C++中类前面加~号的不一样。
- 在java中,如果需要自己写析构方法,则在类中定义一个void finalize()方法.
- finalize必须是protected权限的,因为java中的类,默认都是继承于Object,所以重写析构方法时,需要和Object的一致
PS:一般用不到它,因为java有自动内存回收机制
计数当前共有多少个对象示例,代码如下:
class Counter
{
private static int cnt = 0;
public Counter()
{
cnt++;
}
public static void printCnt()
{
System.out.println("Cnt:"+cnt);
} protected void finalize()
{
cnt--;
}
} public class Test{
public static void main(String args[]){ Counter cnt1 = new Counter();
Counter.printCnt(); Counter cnt2 = new Counter();
Counter.printCnt(); cnt2 = null; //将cnt2置为null try
{
System.gc(); //告诉回收站,有垃圾,需要清理内存
Thread.currentThread().sleep(1000); //休眠1000毫秒,因为需要给finalize()方法提供执行时间
Counter.printCnt(); //释放掉cnt2后,则输出1(因为还有cnt1存在)
}
catch(InterruptedException e) //sleep休眠可能产生InterruptedException异常.所以需要用try捕捉
{
e.printStackTrace(); //打印回溯信息
}
}
}
运行打印:

下章学习:4.JAVA-数组、String详解
3.JAVA-方法重载,类的封装,构造/析构方法的更多相关文章
- Atitit.编程语言原理---方法重载的实现与设计 调用方法的原理
Atitit.编程语言原理---方法重载的实现与设计 调用方法的原理 1. 重载包括:普通方法的重载和构造方法的重载 1 1.1. 横向重载”和“纵向重载”1 1.2. 方法签名通过 方法名称,参数 ...
- php课程 12-38 php的类的构造方法和析构方法怎么写
php课程 12-38 php的类的构造方法和析构方法怎么写 一.总结 一句话总结:a.__construct(参数){},__destruct(){},b.如果类中的一个方法和类名相同,则该方法为构 ...
- 第8.18节 Python类中内置析构方法__del__
一. 引言 基本上所有支持OOP设计的语言都支持析构方法(也称析构函数),析构方法都是在对象生命周期结束时调用,一般用来实施实例相关生命周期内访问数据的扫尾工作,包括关闭文件.释放内存.输出日志.清理 ...
- Java面向对象(类、封装)
面向对象 今日内容介绍 u 面向对象 u 封装 第1章 面向对象 1.1 理解什么是面向过程.面向对象 面向过程与面向对象都是我们编程中,编写程序的一种思维方式. l 面向过程的程序设计方式,是遇到一 ...
- java基础(9):类、封装
1. 面向对象 1.1 理解什么是面向过程.面向对象 面向过程与面向对象都是我们编程中,编写程序的一种思维方式. 面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程. 例 ...
- java中关于类的封装与继承,this、super关键字的使用
原创作品,可以转载,但是请标注出处地址http://www.cnblogs.com/V1haoge/p/5454849.html. this关键字: this代表当前对象,它有以下几种用途: 1.本类 ...
- java.util.Stack类中 empty() 和 isEmpty() 方法的作用
最近在学习算法和数据结构,用到Java里的Stack类,但程序运行结果一直和我预料的不一样,网上也没查清楚,最后查了API,才搞明白. java.util.Stack继承类 java.util.Vec ...
- Python类总结-封装(私有属性,方法)
封装基础 广义上面向对象的封装:代码的保护,面向对象的思想本身就是一种封装 只让自己的对象能调用自己类中的方法 狭义上的封装-面向对象三大特性之一(私有变量,用公有的方法封装私有属性,方法叫封装) 把 ...
- Java中Object类常用的12个方法,你用过几个?
前言 Java 中的 Object 方法在面试中是一个非常高频的点,毕竟 Object 是所有类的“老祖宗”.Java 中所有的类都有一个共同的祖先 Object 类,子类都会继承所有 Object ...
随机推荐
- eclipse 安装svn和gradle
公司项目用的eclispe svn和gradle 所以需要配置 SVN教程:https://blog.csdn.net/jieshaowang1229/article/details/5159499 ...
- Flask构建微电影(一)
第一章.项目介绍 1.1.前言 本教程我将带领大家如何使用flask框架开发微电影网站.Flask是python中最受欢迎的轻量级web框架,flask扩展丰富,冗余度小,可自由选择组合各种插 ...
- DX11 Without DirectX SDK--02 渲染一个三角形
回到 DirectX11--使用Windows SDK来进行开发 目前暂时没有写HLSL具体教程的打算,而是着重于如何做到不用DirectX SDK来进行渲染.除此之外,这里也没有使用Effects框 ...
- mac的terminal快捷键
mac终端terminal快捷键: Command + K 清屏 Command + T 新建标签 Command +W 关闭当前标签页 Command + S 保存终端输出 Command + ...
- PAT1061:Dating
1061. Dating (20) 时间限制 150 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Sherlock Holme ...
- SSM-MyBatis-10:Mybatis中SqlSession的getMapper()和简单的工具类MyBatisUtils
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- getMapper的作用,获取到接口,直接通过点的方式调用方法,以免直接手打的方式写错方法名,(强类型的方式) ...
- 许式伟:我与Go语言的这十年[转]
2017-12-18 许式伟 Go中国 2007 年 9 月 20 日,关于设计一门全新语言的讨论正式开始,这门全新的语言,就是后来的 Go.时至今日,Go 语言已经发布到 1.9 版本,走过了整整十 ...
- BOM(浏览器对象模型)
.t1 { background-color: #ff8080; width: 1100px; height: 40px } 一.BOM(浏览器对象模型) 1.screen对象. console.lo ...
- 前端学习总结(一)——常见数据结构的javascript实现
1.列表类 // 列表类 function List() { this.listSize = 0; // 列表的元素个数 this.pos = 0; // 列表的当前位置 this.dataStore ...
- ASP.Net MVC 在控制器中获取View中的form表单值的方法
在网站开发中,我们常常需要用到表单提交的方式,那么在MVC中是如何获取到表单中的数据呢?下面我们来介绍以下几种方式 首先我们先看看View前台页面 添加一个控制器 我们再看看前台页面的代码 @{ La ...