1.方法重载
和C++的函数重载一样,主要是实现多个相同的函数名,但是参数表不同.
参数表不同主要有以下几种
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种:
包的定义以及使用参考: 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.构造方法
示例:
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.析构方法
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详解