JAVA从零单排3-----面向对象(上)

相关介绍

    Java语言提供了定义类,定义属性,方法等最基本的功能。Java的世界是用类来建造的。用类来定义变量,所有使用类定义的变量都是引用变量,他们将会引用到类的对象,对象由类创建。类用于描述客观世界里某一类对象的共同特征,而对象则是类的具体存在,java程序使用类的构造器来创建该类的对象。

    Java面向对象有三大特征:继承、封装和多态。

    Java还提供private、protected和public来设置类的访问权限,提供了extends关键字让子类继承父类。

类和对象

    所有类是引用数据类型。类是一批对象的抽象;对象是一个具体存在的实体。一个类可以包括三种成员:构造器、属性和方法。成员之间的定义顺序没有任何影响,各成员之间可以相互调用,但是,static修饰的成员不能访问没有static修饰的成员。

    属性用于定义该类或该类的实例所包含的数据,方法则用于定义该类或该类的实例的行为特征或功能实现。构造器用于构造该类的实例,java语言通过new关键字来调用构造器,从而返回该类的实例。

    构造器就是我们所说的构造函数,如果你没有写构造函数的话,系统会提供一个默认的构造函数,如果程序员写了构造函数,则系统也就不提供默认的构造函数了。

    创建对象使用new关键字。如果访问权限允许,类中定义的属性和方法就可以通过类或对象来调用。类.属性/方法,或者对象.属性/方法。static修饰的方法和属性只能通过类来调用,也可以通过实例来调用;没有用static修饰的属性和方法只能通过实例来访问。

方法

    方法是类或对象的行为特征的抽象,方法是类或对象最重要的组成部分。Java中的方法必须放在类中定义。

    一旦将一个方法定义在某一个类中,如果这个方法使用了static修饰,则这个方法属于这个类,否则这个方法属于这个类的对象。

    因为java的方法不能独立存在(必须属于一个类或着一个对象),因此方法不能像函数那样独立执行,执行方法时必须使用类或者对象来作为调用者。类.方法或者对象.方法。同一个类中的方法调用另一个方法时,如果被调用方法是普通方法,则默认使用this作为调用,如果被调用方法是静态方法,则默认调用者是类。

静态方法与非静态方法

    使用static修饰的方法属于一个类,或者说属于该类的所有实例所共有,使用static修饰的方法既可以使用类作为调用者来调用,也可以使用该类的对象作为调用者来调用。不使用static修饰的方法属于该类的对象,不属于这个类。因此不实用static的方法只能用类的对象作为调用者调用。使用不同对象作为调用者调用同一个普通方法可能得到不同的结果。

参数传递机制

    如果声明方法时包含了形式参数,则调用此方法的时候必须给这些形参指定参数值,称为实参

    Java的实参是靠java的参数传递基质来传给被调用方法的,java语言的参数传递方式只有一种:值传递。值传递的意思就是,将实际参数的值的副本传入方法中,而原参数的值不受任何影响。

    看下面的例子:

Public class TestPriTransfer
{
      public static void swap(int a, int b);
      {
      int temp = a;
      a = b;
      b = temp;
      System.out.println(“swap方法中,a的值是”+ a + “; b的值是”+ b);
      }
      public static void main(String[] args)
      {
      int a = 1;
      int b = 3;
      swap(a,b);
      System.out.println(“交换后,实参a的值是”+ a + “; 实参b的值是”+b);
      }
}


    程序运行结果是:

swap方法中,a的值是3;b的值是1

交换后,实参a的值是1;实参b的值是3

递归方法

     Java中有一种特殊的方法调用---递归方法。一个方法调用它自己就是方法的递归。对于很多有数学规律的题目都可以采用递归方法得以解决。例如:1*2*3*4…*1000。

    递归是非常有用的,如果我们希望遍历某一个路径下的文件,但是这个路径的深度未知。那么就可以采用递归来解决。可以定义一个方法,该方法接受一个文件路径来遍历此路径下所有的文件和文件夹,在该方法中再次调用方法本身来处理此路径下的文件路径。

方法的重载

    Java中方法的重载是指一个类中可以包括多个重名的方法,但是形参必须不同。

    看下面的例子:

public class Overload
{
	public void test()
	{
		System.out.println("没有参数");
	}
	public void test(int a)
	{
		System.out.println("传递过来一个int型的值:" + a);
	}
	public void test(String str)
	{
		System.out.println("传递过来一个string型的值:" + str);
	}
	//
	public static void main(String[] args)
	{
		Overload o = new Overload();
		o.test();
		o.test("hello world!");
		o.test(123);
	}
}


运行的结果是:


成员变量和局部变量

    根据定义变量的位置不同,java将变量分为两类:成员变量和局部变量。他们都遵守相同的命名规范。

    成员变量指的是在类范围里定义的变量,也就是说前面所说的属性;而局部变量指的是在一个方法中的变量。

成员变量

    成员变量又分为类属性和实例属性。定义一个属性时不实用static修饰的是实例属性,使用static修饰的是类属性。类属性从这个类的准备阶段开始存在,直到系统完全销毁这个类,类属性的作用域和这个类的生存范围想通过;而实例属性则从这个类的实例被创建开始存在,直到系统完全销毁这个实例,实例属性的作用域和对应实例的生存范围相同。

    看下面的实例:

class Person
{
	public String name;
	public static int age;
}

public class TestPerson
{
	public static void main(String[] args)
	{
		System.out.println("Person的age类属性值:" + Person.age);
		Person p = new Person();
		System.out.println("p变量的name属性值是:" + p.name + "  p对象的age属性值是:" + p.age);
		//
		p.name="影魔";
		p.age = 22;
		System.out.println("p变量的name属性值是:" + p.name + "  p对象的age属性值是:" + p.age);
		System.out.println("Person的age类属性值:" + Person.age);
		//
		Person p2 = new Person();
		System.out.println("p2对象的age类属性值:" + Person.age);
		
	}
}


    运行结构如下:


局部变量

    局部变量分为三种:形参、方法局部变量和代码块局部变量。局部变量除了形参之外,都必须显式初始化。形参的作用域是整个方法体内有效,而且形参也不许显式初始化,形参的初始化在调用该方法时由系统完成。

    Java允许局部变量和成员变量同名,如果方法的局部变量和成员变量同名,局部变量会覆盖成员变量,如果需要在这个方法引用被覆盖的成员变量,则可以使用this或类名作为调用者来限定访问成员变量。

    看下面的例子:

public class TestVariableOverride
{
	private String name = "nihao";
	private static double price = 23.0;
	public static void main(String[] args)
	{
		int price = 12;
		System.out.println(price);
		System.out.println(TestVariableOverride.price);
		new TestVariableOverride().info();
	}

	public void info()
	{
		String name = "hello";
		System.out.println(name);
		System.out.println(this.name);
	}
}


    结果如下:


    写程序应尽量避免局部变量和成员变量同名的情况!

成员变量和局部变量的初始化和内存中的运行机制

    当系统加载类或创建该类的实例时,系统自动为成员变量分配内存空间,并在分配内存空间后自动为成员变量指定初始值。

    局部变量定义后,必须经过显式初始化后才能使用,系统不会为局部变量执行初始化。这就意味着,定义局部变量后,系统并未给这个变量分配内存空间,直到等到程序为这个变量赋初始值时,系统才会局部变量分配内存,并将初始值保存到这块内存中。

    与成员变量不同,局部变量不属于任何类或实例,因此它总是保存在其所在方法的栈内存中。如果局部变量是基本类型的变量,则直接把这个变量的值保存到该变量对应内存中;如果局部变量是一个引用类型的变量,则这个变量里存放的是地址,通过该地址引用到该变量实际引用的对象或数组。

    即使在程序中使用局部变量,也应该尽量缩小局部变量的使用范围,局部变量的范围越小,程序运行的性能越好。能用局部变量的地方就最好用局部变量。


    注:如有不对之处,请指出!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值