Java学习5——书本自学

第七章        Java语言类的特性

7.1 类的私有成员与公共成员

7.1.1 私有成员

如果没有一个机制限制对类中成员的访问,则很可能会造成错误的输入。为了防止这类情况的发生,Java语言提供了访问控制符private。

加上私有访问控制符之后,就无法从类的外部访问该类内部成员。达到对成员数据的最高级别的保护的目的。

7.1.2 公共成员

Java提供了公共访问控制符public。如果在类的成员声明的前面加上修饰符public,则表示该成员可以被所有其他的类所访问。由于public修饰符会造成安全性和数据封装性的下降,所以一般应减少公共成员的使用。

7.1.3缺省访问控制符

若在类成员的前面不加任何访问控制符,则该成员具有缺省的访问控制符特性,这种缺省的访问控制权,表示这个成员只能被同一个包(类库)中的类所访问和调用。如果一个子类与其父类在不同 包中,子类也不能访问父类中的缺省访问控制成员,也就是说其他任何包中的任何类都不能访问缺省访问控制成员。

同理,对于类来说,如果一个类没有访问控制符,则说明它具有缺省访问控制的特性,这种缺省的访问控制权规定只能被同一包中的类访问和引用,而不可以被其他包的类所使用。

7.2 方法的重载

方法的重载是实现“多态"的一种方法。在面向对象的程序设计语言中,有一些方法的含义相同,但带有不同的参数,这些方法使用相同的名字,这就叫方法的重载。

也就是说,重载就是指在同一个类内具有相同名称的多个方法,这些同名方法如果参数个数不同,或者参数个数相同,但类型不同,则这些同名方法就具有不同的功能。

//filename:App7_3.java

class Cylinder
{
	private double radius;
	private int height;
	private double pi=3.14;
	private String color;
	public double setCylinder(double r, int h)
	{
		radius=r;
		height=h;
		return r+h;
	}
	public void setCylinder(String str)
	{
		color=str;
	}
	public void show()
	{
		System.out.println("the color of cylinder is :"+color);
	}
	double area()
	{
		return pi*radius*radius;
	}
	double volume()
	{
		return area()*height;
	}
}
public class App7_3
{
public static void main(String[] args)
{
	double r_h;
	
	Cylinder volu=new Cylinder();
	r_h=volu.setCylinder(2.5, 5);
	volu.setCylinder("red");
	System.out.println("the sum of cylinder's radius and height is:"+r_h);
	System.out.println("the volume of cylinder is:"+volu.volume());
	volu.show();
}
}

说明:java语言中不允许参数个数或参数类型完全相同,而只有返回值类型不同的重载。

7.3 构造方法

Java语言在类中提供了一个特殊的成员方法——构造方法。

7.3.1 构造方法的作用与定义

构造方法(constructor)是一种特殊的方法,它是在对象被创建时初始化对象的成员的方法。

构造方法方法的名称必须与它所在类 的名称完全相同。构造方法没有返回值,但在定义构造方法时,构造方法名前不能用修饰符void来修饰,这是因为一个类的构造方法的返回值类型就是该类本身。构造方法定义后,创建对象时就会自动调用它,因此构造方法不需要在程序中直接调用,而是在对象产生时自动执行。

这一点不同于一般方法,一般分方法是在需要用时才调用。

//filename App7_4.java
class Cylinder
{
	private double radius;
	private int height;
	private double pi=3.14;
	public Cylinder(double r, int h)
	{
		radius=r;
		height=h;
	}
	double area()
	{
		return pi*radius*radius;
	}
	double volume()
	{
		return area()*height;
	}
	
}
public class App7_4
{
	public static void main(String[] args)
	{
		Cylinder volu=new Cylinder(3.5,8);
		System.out.println("the area of cylinder is:"+volu.area());
		System.out.println("the volume of cylinder is:"+volu.volume());
	}
}

注意:若是在构造方法的时候加了void,则它将变为普通方法。

7.3.2 默认的构造方法

在代码中没有定义构造方法,却依然可以创建新的对象,并正确执行程序。这是因为如果省略构造方法,Java编译器会自动为该类生成一个默认的构造方法。这个方法体中没有任何代码。

如果class前面有public修饰符,那么默认的构造方法也是public的。

一旦用户使用为该类定义了构造方法,系统就不再提供默认的构造方法,这是Java覆盖所致。

7.3.3 构造方法的重载

一般情况下,类都有一个或多个构造方法。但是由于构造方法与类同名,所以当一个类有多个构造方法时,则这多个构造方法可以重载。只要方法与方法之间的参数个数不同,或是参数的类型不同,就可以构造出多种名称相同的方法。

7.3.4 从一个构造方法定义另一个构造方法

为了某些特定的运算,Java语言允许在类内从某一构造方法内调用另一个构造方法。利用这个方法,可以缩短程序代码,减少开发程序时间。从某一个狗杂方法内调用另一构造方法,是使用this()语句来调用的。

7.3.5 公共构造方法与私有构造方法

构造方法一般都是公有(public)的,这是因为它们在创建对象时,是在类的外部被系统自动调用的。如果构造方法被声明为private,则无法在该构造方法所在的类以外的地方被调用,但在该类的内部还是可以被调用的。

//filename: App7_7.java
class Cylinder
{
	private double radius;
	private int height;
	private double pi=3.14;
	String color;
	private Cylinder()
	{
		System.out.println("THe no-argument constructor is called.");
		
	}
	public Cylinder(double r,int h,String str)
	{
		this();
		radius=r;
		height=h;
		color=str;
	}
	public void show()
	{
		System.out.println("the vase radius of the cylinder is:"+radius);
		System.out.println("the height of the cylinder is:"+height);
		System.out.println("the color of cylinder is :"+color);
		
	}
	double area()
	{
		return pi*radius*radius;
	}
	double volume()
	{
		return area()*height;
	}
	
}
public class App7_7
{
	public static void main(String[] args)
	{
		Cylinder volu=new Cylinder(2.5,5,"blue");
		System.out.println("the area of cylinder is:"+volu.area());
		System.out.println("the volume of cylinder is:"+volu.volume());
		volu.show();
		
	}
}

注:this()只是参与构造方法之间的相互调用,因此比较清晰。

7.4 静态成员

static称为静态修饰符,它可以修饰类中的成员。被static修饰的成员被称为静态成员,也称为类成员。而不用static修饰的成员称为实例成员。

7.4.1 实例成员

在类定义总如果成员变量或则成员方法没有用static来修饰,则该成员就是实例成员。由此又引出了实例变量,实例方法等。

7.4.2 静态变量

用static修饰的变量称为静态变量,静态变量也称为类变量。静态变量是隶属于类的变量,而不是属于任何一个类的具体对象。也就是说,对于该类的任何一个具体对象而言,静态变量是一个公共的存储单元,不是保存至在某个对象实例的内存空间中,而是保存在类的内存的公共储存空间中。

静态变量有固定的存储空间,在某些程度上与其他语言的全局变量相似。如果不是私有的直接可以在外部访问,无需创建类的实例对象。只需要类名就可以引用。换句话说,静态变量不需要实例化就可以引用。

静态变量的使用方式有以下两种:

类名.静态变量名;

对象名.静态变量名;

类中若有静态变量,则静态变量必须独立于方法之外,就像其他高级语言在声明全局便来个时必须在函数外声明一样。

注:对于静态静态变量的使用,建议采用“类名.静态变量名”的形式来访问

7.4.3 静态方法

用static修饰符修饰的方法称为类的静态方法,又称为类方法。静态方法实质上是属于整个类的方法,而不加static的方法,是属于某个具体对象的方法。将一个对象声明static有以下几个含义:

1)非Static的方法是某个对象的方法,在这个对象创建时,对象的方法在内存中有属于自己的代码段。而static方法是属于整个类的,它在内存中的代码段将被所有对象共用,而不被任何一个对象专用;

2)由于static方法是属于整个类的,所以它不能操纵和处理属于某个对象的成员,而只能处理属于整个类的成员,即static方法只能访问static成员变量或调用static成员方法,或说在静态方法中不能访问实例变量与实例方法。

3)在静态方法中不饿能使用this或suer。因为this代表调用该方法的对象,但现在“静态方法”既然不需要对象来调用,this也自然不应存在于“i昂太方法”内部。

4)调用静态方法时,可以使用类名直接调用,也可以用某一个具体的对象名来调用。格式如下:

类名.静态方法名();

对象名.静态方法名();

静态方法可以在不产生对象的情况下直接以类名来调用。

注:对于静态方法的使用,建议采用“类名.静态方法名()”的形式来访问。

如果一个类被java虚拟机解释器装载运行时,由于Java虚拟机是从main()开始运行的,所以,这个类必须有main()方法。由于Java虚拟机需要在类外调用main()方法,所以该方法的访问权限必须是public。而Java虚拟机运行时系统在开始执行一个程序之前,并没有创建main()方法所咋的类的一个实例对象,所以它只能通过类名来调用main()方法作为程序的入口,即调用main()方法的是类,而非由类所创建的对象,因而该方法必须是static的。

7.4.4 静态初始化器

静态初始化器是由关键字static修饰的一对大括号{}括起来的语句组。它的作用与类的构造方法有些相似,都是用来初始化工作的,但静态初始化器与构造方法有几点根本的不同。

1)构造方法是对每个创建的初始化,而静态初始化器是对类自身的的初始化;

2)构造方法是用new运算符在创建新对象时由系统自动执行,而静态初始化器一般不能由程序来调用,它是所在所属的类被加载入内存时由系统调用执行的。

3)用new运算符创建多少个新对象,构造方法就被调用多少次,但静态初始化器则在被加载入内存时只执行一次,与创建多少个对象无关。

4)不同于构造方法,静态初始化器不是方法,因而没有方法名、返回值和参数。

注:如果有多个静态初始化器,它在系统向内存加载时自动完成。

7.5 对象的应用

变量可分为”基本类型变量“和”非基本类型变量“两种。在声明基本类型的变量的时采用的格式是:”数据类型 变量名“ 如 int a、double b等。而声明一个对象的格式与其相似,即”类名 对象名“,因此可以将对象称为”类类型的变量",它属于非基本类型的变量。实际上对象是一种引用型变量,而引用型变量实际上保存的是对象在内存中的首地址(也称为对象 的句柄),所以就对象的功能而言,对象是”指向对象的对象“,但就其类型而言它是属于”类类型的变量“,因此在某些场合,可以像使用基本类型那样使用对象。

7.5.1  对象的赋值与比较

在使用对象时,一般是先用new运算符创建对象,然后再对其进行操作处理。但有时没有使用new运算符创建新对象,仍然可以对其进行赋值。

7.5.2 引用变量作为方法的返回值

引用变量不仅可以作为参数传递,而且也可以作为方法的返回值。若要方法返回类类型的变量,只须在方法声明前加上要返回的类即可。

7.5.3  类类型的数组

数组元素可以是存放各种类型的数据,当然数组也可以用来存放对象。用数组来存放对象,一般愮经过如下两个步骤:

1)声明类型的数组变量,并用new运算符分配内存空间给数组;

2)用new创建数组类型对象,分配内存空间给它,并让数组元素指向它。

//filename: App7_13.java
class Person
{
	private String name;
	private int age;
	public Person(String name, int age)
	{
		this.name=name;
		this.age=age;
	}
	public void show()
	{
		System.out.println("name:"+name+"    age:"+age);
		
	}
}
public class App7_13
{
public static void main(String[] args)
{
	Person[] per;
	per=new Person[3];
	per[0]=new Person("zhangsan",19);
	per[1]=new Person("lisi",20);
	per[2]=new Person("wangwu",40);
	per[2].show();
	per[0].show();
}

 7.5.4 以对象数组为参数进行方法调用

数组也可以用来存放对象。因此可将对象数组作为参数传递到方法中。

//filename: App7_14.java
class Person
{
	private int age;
	private String name;
	public Person(String name, int age)
	{
		this.name=name;
		this.age=age;
	}
	public static int minAge(Person[] p)
	{
		int min=Integer.MAX_VALUE;
		for(int i=0;i<p.length;i++)
			if(p[i].age<min)
				min=p[i].age;
		return min;
	}
}
public class App7_14
{
	public static void main(String[] args)
	{
		Person[] per= new Person[3];
		per[0]=new Person("zhagnsan",20);
		per[1]=new Person("lisi",21);
		per[2]=new Person("wqangwu",19);
		System.out.println("the minimum age is: "+Person.minAge(per));
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王辞夜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值