Java类和对象

不羁岁月 提交于 2019-12-27 05:43:23

1、Java中的权限修饰符

       注:当声明类时不使用public、protected和private修饰符设置类的权限,则这个类预设为包存取范围,即只有一个包中的类可以调用这个类的成员变量或成员方法。同时Java规定,类的权限设定会约束类成员的权限设定,如果类中的成员变量或成员方法没有指定修饰符,则按类的修饰符来做限制。

 

2、类

(1)this

        如果在类中定义的构造方法都不是无参的构造方法,那么编译器也不会为类设置一个默认的无参构造方法,当试图调用无参构造方法实例化一个对象时,编译器会报错。所以只有在类中没有定义任何构造方法时,编译器才会在该类中自动创建一个不带参数的构造方法。

       Java中this代表本类对象的引用,this关键字被隐式地用于引用对象的成员变量和方法。this和对象都可调用成员变量和成员方法,实际上this引用的就是本类的一个对象。

(a)this可作为方法的返回值。

public Book getBook(){
    return tihs;	// 返回Book类引用
}

(b)this可调用类中的构造方法

public class AnyThing{
	public static void main(String[] args) {
		AnyThing any = new AnyThing();
	}
	
	public AnyThing() {
		this("this 调用有参构造函数");
		System.out.println("无参构造函数");	
	}
	
	public AnyThing (String name){
		System.out.println("有参构造函数");	
		System.out.println(name);
	}
}

输出:

(2)局部变量

       局部变量在使用时必须进行赋值操作或被初始化,否则会出现编译错误。

例:

public String getName() {
    int id = 0;				// 如果没有初始值则出错
    String name = "Java";
    return id + name;
}

(3)静态变量

       由static修饰的变量、常量和方法被称作静态变量、静态常量和静态方法,静态数据和静态方法的作用通常是为了提供共享数据和方法。可使用类名和“.”调用静态成员,即“类名.静态类成员”。

注:

  • (a)虽然静态成员也可以使用“对象.静态成员”的形式进行调用,但通常不建议用这样的形式,因为这样容易混淆静态成员和非静态成员;
  • (b)在静态方法中不能使用this关键字;
  • (c)在静态方法中不能直接使用非静态方法。

例:

public class StaticTest{
	static double PI = 3.14;
	static int id;
	public static void method1() {
		System.out.println("this is method1");
                //static int i = 0;	// 不能将方法内的局部变量声明为static
	}
	public void method2() {
		System.out.println(StaticTest.PI);
		System.out.println(StaticTest.id);
		StaticTest.method1();
	}
	
	/*public static StaticTest method3() {
		method2();		// 错误,在静态方法中不能直接使用非静态方法
		return this;	// 错误不能,不能在静态方法中不能使用this关键字
	}*/
}

技巧:

       如果在执行类时,希望先执行类的初始化动作,可使用static定义一个静态区域。

例:

public static example{
    static{
        // some
    }
}

(4)类的主方法

       主方法是类的入口点,它定义了程序从何处开始。

主方法特性:

  • 主方法是静态的,所以如要直接在主方法中调用其他方法,则该方法必须也是静态的。
  • 主方法没有返回值。
  • 主方法的形参为数组。其中args[0]~args[n]分别代表程序的第一-个参数到第n个参数,可以使用args.length获取参数的个数。

eclipse中设置程序参数:
       项目名右键==》运行方式==》运行配置==》自变量==》程序自变量

 

3、对象

(1)对象的创建

Test test = new Test();

       test对象被创建出来时,就是一个对象的引用,这个引用在内存中为对象分配了存储空间当创建对象时,自动调用构造函数,可在构造函数中初始化成员变量。

       每个对象都是相互独立的,在内存中占据独立的内存地址,并且每个对象都具有自己的生命周期,当一个对象的生命周期结束时,对象就变成垃圾,由Java虚拟机自带的垃圾回收机制处理,不能再被使用。

       注:在Java中对象和实例时可以通用的。

例:

public class CreateObject{
	public static void main(String[] args) {
		//new CreateObject();	// 直接实例化
		CreateObject obj = new CreateObject();
        obj.i = 666;		// 类的成员变量没指定权限修饰符则以类的权限修饰符为准
	}
	public CreateObject() {
		System.out.println("创建对象");
	}
        int i = 0;
}

       注:静态成员变量只初始化一次,每次的初值都是上一次的最后一次为其赋值的值,即使有两个对象对其操作也是改变的是同一个变量,因为在内存中两个对象同时指向同一块内存区域。

例:

public class AccessProperty {
	static int i = 47; // 定义静态成员变量
	
	public void call() {
		System.out.print("调用call()方法:");
		for (i = 0; i < 3; i++) {		// i重新从0开始
			System.out.print(i + " ");	// 只打印o~2,但实际上最后i=3后才跳出
			if (i == 2) {
				System.out.println("\n");
			}
		}
	}
	
	public AccessProperty() {
	}
	
	public static void main(String[] args) { 
		AccessProperty t1 = new AccessProperty(); 
		AccessProperty t2 = new AccessProperty(); 
		
		t2.i = 60; // 将类成员变量赋值为60

		System.out.println("第一个实例对象调用变量i的结果:" + t1.i++);	// 此处先输出i,再对i进加1,所有输出为60
		
		t1.call();		

		System.out.println("第二个实例对象调用变量i的结果:" + t2.i);
		t2.call();
	}
}

输出:

(2)对象的引用

       在Java语言中尽管一切都可以看作对象,但真正的操作标识符实质上是一个引用,引用在Java中的语法:

       类名 对象引用名称

       如一个Book类的引用:

Book book;

       通常一个引用不一定要有一个对象相关联。引用于对象相关联的语法如下:

Book book = new Book();

       注:引用只是存放一个对象的内存地址,并非存放一个对象。严格地说,引用和对象是不同的,但是可以将这种区别忽略,如可以简单地说book是Book类的一个对象,而事实上应该是book包含Book对象的一个引用。

(3)对象的比较

       Java中比较对象的方式有两种,分别别为“==”和equal()方法,这两种方式却不一样。

例:

public class Compare {
	public static void main(String[] args) {
		String c1 = new String("abc"); // 创建两个String型对象引用
		String c2 = new String("abc");
		String c3 = c1; // 将c1对象引用赋予c3,c1和c3
		// 使用“==”运算符比较c2与c3
		System.out.println("c2==c3的运算结果为:" + (c2 == c3));
		// 使用equals()方法比较c2与c3
		System.out.println("c2.equals(c3)的运算结果为:" + (c2.equals(c3)));
		System.out.println("c1==c3的运算结果为:" + (c1 == c3));
	}
}

输出:

       从上述运行结果中可以看出,“==” 运算符和equals()方法比较的内容是不相同的,equals()方法是String类中的方法,它用于比较两个对象引用所指的内容是否相等而“==”运算符比较的是两个对象引用的地址是否相等。由于c1与c2是两个不同的对象引用,两者在内存中的位置不同,而“Stringc3=c1;"语句将c1的引用赋给c3,所以c1与c3这两个对象引用是相等的,也就是打印c1= =c3这样的语句将返回true值。

(4)对象的销毁

       每个对象都有生命周期,当对象的生命周期结束时,分配给该对象的内存地址将会被回收。在其他语言中需要手动回收废弃的对象,但是Java拥有-套完整的垃圾回收机制,用户不必担心废弃的对象占用内存,垃圾回收器将回收无用的但占用内存的资源。

       在谈到垃圾回收机制之前,首先需要了解何种对象会被Java虚拟机视为垃圾。主要包括以下两种情况:

  • 对象引用超过其作用范围,这个对象将被视为垃圾;
  • 将对象赋值为null。

       虽然垃圾回收机制已经很完善了,但垃圾回收器只能回收那些由new操作符创建的对象。某些对象不是通过new操作符在内存中获取存储空间的,这种对象无法被垃圾回收机制所识别。在Java中提供了一个finalize()方法,这个方法是Object类的方法,它被声明为protected,用户可以在自己的类中定义这个方法。如果用户定了finalize()方法,在垃圾回收时会首先调用该方法,在下一次垃圾回收动作发送时,才真正回收被对象占用的内存。

       注:垃圾回收或finalize()方法不一定会发送。如果Java虚拟机内存损耗殆尽,它将不会执行垃圾回收机制。

       由于垃圾回收不受人为控制,具体执行时间也不确定,所有finalize()方法也就无法执行。为此Java提供了System.gc()方法来强制启动垃圾回收器。

 

 

 

 

 

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!