面向对象基础——构造方法私有化、对象数组、内部类

构造方法私有化

类的封装性不光体如今对属性的封装上。实际上方法也是能够被封装的,当然,在方法封装上也包括了对构造方法的封装。比如例如以下代码就是对构造方法封装。

class Singleton{
	private Singleton(){		// 将构造方法进行了封装,私有化
	}
	public void print(){
		System.out.println("Hello World!!!") ;
	}
};

使用

class Singleton{
	private Singleton(){		// 将构造方法进行了封装,私有化
	}
	public void print(){
		System.out.println("Hello World!!!") ;
	}
};
public class SingletonDemo02{
	public static void main(String args[]){
		Singleton s1 = null ;	// 声明对象
		s1 = new Singleton() ;	// 错误,无法实例化对象
	}
};

此时。被私有化构造方法的Singleton类,不能在外部实例化。可是能够在内部实例化,例如以下所看到的:

class Singleton{
	Singleton instance = new Singleton() ;	// 在内部产生本类的实例化对象
	private Singleton(){		// 将构造方法进行了封装。私有化
	}
	public void print(){
		System.out.println("Hello World!!!") ;
	}
};
public class SingletonDemo03{
	public static void main(String args[]){
		Singleton s1 = null ;	// 声明对象
	}
};

一个类的构造方法被私有化之后,则仅仅能从其类的内部取得实例化对象,那么此时考虑的问题就是怎样把内部生成的instance对象拿到外部类,这样外部就能够直接通过此对象进行实例化。

正常情况下,instance属性仅仅能通过Singleton类的实例化对象才干够进行调用。假设在没有实例化对象的时候依旧能够取得instance对象,则就须要将instance声明成static訪问类型,由于使用static声明的变量。能够直接使用类名进行訪问。

例如以下所看到的:

class Singleton{
	static Singleton instance = new Singleton() ;	// 在内部产生本类的实例化对象
	private Singleton(){		// 将构造方法进行了封装。私有化
	}
	public void print(){
		System.out.println("Hello World!!!") ;
	}
};
public class SingletonDemo04{
	public static void main(String args[]){
		Singleton s1 = null ;	// 声明对象
		s1 = Singleton.instance ;	// 取得实例化对象
		s1.print() ;		// 调用方法
	}
};

正常情况下,这些属性应该封装起来。所以以上代码最好改动为下面形式:

class Singleton{
	private static Singleton instance = new Singleton() ;	// 在内部产生本类的实例化对象
	public static Singleton getInstance(){		// 通过静态方法取得instance对象
		return instance ;
	}
	private Singleton(){		// 将构造方法进行了封装,私有化
	}
	public void print(){
		System.out.println("Hello World!!!") ;
	}
};
public class SingletonDemo05{
	public static void main(String args[]){
		Singleton s1 = null ;	// 声明对象
		s1 = Singleton.getInstance() ;	// 取得实例化对象
		s1.print() ;		// 调用方法
	}
};

构造方法私有化之后,就能够通过以上的形式取得实例化对象。

程序的意义在于:将构造方法私有化防止外部生成对象,仅仅能通过静态方法获得第一次初始化且是唯一的单例对象。

对象数组

所谓的对象数组。就是指包括了一组相关的对象。可是在对象数组的使用中一定要注意:数组一定要先开辟空间,可是由于其是引用数据类型。所以数组里的每个对象都是null值,则在使用的时候数组中的每个对象必须分别进行实例化操作。

对象数组的声明

类 对象数组名称[] = new 类[数组长度];

class Person{
	private String name ;		// 姓名属性
	public Person(String name){	// 通过构造方法设置内容
		this.name = name ;		// 为姓名赋值
	}
	public String getName(){
		return this.name ;		// 取得姓名
	}
};
public class ObjectArrayDemo01{
	public static void main(String args[]){
		// 类名称 数组名称[] = new 类名称[长度]
		Person per[] = new Person[3] ;	// 开辟了三个空间大小的数组
		System.out.println("============== 数组声明 =================") ;
		// 对象数组初始化之前,每个元素都是默认值
		for(int x=0;x<per.length;x++){	// 循环输出
			System.out.print(per[x] + "、") ;	// 由于仅仅是开辟好了空间,所以都是默认值
		}
		// 分别为数组中的每个元素初始化。每个都是对象,都须要单独实例化
		per[0] = new Person("张三") ;	// 实例化第一个元素
		per[1] = new Person("李四") ;	// 实例化第二个元素
		per[2] = new Person("王五") ;	// 实例化第三个元素
		System.out.println("\n============== 对象实例化 =================") ;
		for(int x=0;x<per.length;x++){	// 循环输出
			System.out.print(per[x].getName() + "、") ;	// 此时,已经实例化完毕了,所以会直接打印出姓名
		}
	}
};

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

数组在使用的时候也分为静态初始化和动态初始化。

例如以下所看到的:

class Person{
	private String name ;		// 姓名属性
	public Person(String name){	// 通过构造方法设置内容
		this.name = name ;		// 为姓名赋值
	}
	public String getName(){
		return this.name ;		// 取得姓名
	}
};
public class ObjectArrayDemo02{
	public static void main(String args[]){
		// 声明一个对象数组。里面有三个对象,使用静态初始化方式完毕
		Person per[] = {new Person("张三"),new Person("李四"),new Person("王五")} ;
		System.out.println("\n============== 数组输出 =================") ;
		for(int x=0;x<per.length;x++){	// 循环输出
			System.out.print(per[x].getName() + "、") ;	// 此时,已经实例化完毕了,所以会直接打印出姓名
		}
	}
};

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

注意:对象数组中的每一个元素都必须单独实例化,否则内容就为null。

内部类

在一个类的内部还存在另外一个类。则称为内部类。

在类内部也能够定义另外一个类。

假设在类Outer的内部再定义一个类Inner。此时Inner就称为内部类。而类Outer则称为外部类。

内部类可声明成public或private。

当内部类声明成public或private时。对其訪问的限制与成员变量和成员方法全然同样。

内部类的定义格式例如以下:

class Outer{		// 定义外部类
	private String info = "hello world" ;	// 定义外部类的私有属性
	class Inner{	// 定义内部类
		public void print(){				// 定义内部类的方法
			System.out.println(info) ;		// 直接訪问外部类的私有属性
		}
	};
	public void fun(){						// 定义外部类的方法
		new Inner().print() ;				// 通过内部类的实例化对象调用方法
	}
};
public class InnerClassDemo01{
	public static void main(String args[]){
		new Outer().fun() ;					// 调用外部类的fun()方法
	}
};

以上程序中。Inner类作为Outer类的内部类存在,而且在外部类fun()方法之中直接实例化内部类的对象并调用print()方法。

内部类存在的特点:

缺点:正常一个类操作时,在类中最好仅仅定义属性和方法。假设再定义一个类的话,则肯定破坏了类的结构。

长处:能够实现两个类之间的数据訪问,内部类能够訪问外部类的属性。拆分类验证例如以下:

class Outer{		// 定义外部类
	private String info = "hello world" ;	// 定义外部类的私有属性
	public void fun(){						// 定义外部类的方法
		new Inner(this).print() ;				// 通过内部类的实例化对象调用方法
	}
	public String getInfo(){				// 添加了一个getter方法取得info内容
		return this.info ;
	}
};
class Inner{	// 定义内部类
	private Outer out = null ;				// 声明Outer对象
	public Inner(Outer out){
		this.out = out ;
	}
	public void print(){				// 定义内部类的方法
		System.out.println(this.out.getInfo()) ;		// 直接訪问外部类的私有属性
	}
};
public class InnerClassDemo02{
	public static void main(String args[]){
		new Outer().fun() ;					// 调用外部类的fun()方法
	}
};

假设将内部类拿到外部之后,会发现代码添加了,并且复杂度添加了。使用内部类的最大长处。能够方便的訪问外部类中的私有属性。可是,以上的内部类。是无法在外部直接调用的。是无法依照外部类的形式使用的。

使用static声明内部类

假设一个内部类使用statickeyword声明。则此内部类就称为外部类。能够直接通过外部类.内部类进行訪问。

class Outer{		// 定义外部类
	private static String info = "hello world" ;	// 定义外部类的私有属性
	static class Inner{	// 使用static定义内部类为外部类
		public void print(){				// 定义内部类的方法
			System.out.println(info) ;		// 直接訪问外部类的私有属性
		}
	};
	public void fun(){						// 定义外部类的方法
		new Inner().print() ;				// 通过内部类的实例化对象调用方法
	}
};
public class InnerClassDemo03{
	public static void main(String args[]){
		new Outer.Inner().print() ;					// 调用外部类的fun()方法
	}
};

使用static能够声明一个内部类,声明的内部类就称为外部类,能够在类的外部调用,可是假设想訪问外部类的属性,则此属性必须是static訪问权限的。

在外部类訪问内部类:

一个内部类除了能够通过外部类訪问,也能够直接在其它类中调用,可是调用的格式必须是:

外部类.内部类 内部类对象 = 外部类实例.new 内部类();

class Outer{		// 定义外部类
	private String info = "hello world" ;	// 定义外部类的私有属性
	class Inner{	// 定义内部类
		public void print(){				// 定义内部类的方法
			System.out.println(info) ;		// 直接訪问外部类的私有属性
		}
	};
	public void fun(){						// 定义外部类的方法
		new Inner().print() ;				// 通过内部类的实例化对象调用方法
	}
};
public class InnerClassDemo04{
	public static void main(String args[]){
		Outer out = new Outer()	;			// 外部类实例化对象
		Outer.Inner in = out.new Inner() ;	// 实例化内部类对象
		in.print() ;						// 调用内部类的方法
	}
};

还能够在方法中定义内部类

一个类能够在任何位置上定义,例如以下所看到的  能够在方法内定义内部类。

可是内部类所在方法的參数必须定义成final类型。

class Outer{		// 定义外部类
	private String info = "hello world" ;	// 定义外部类的私有属性
	public void fun(final int temp){		// 定义外部类的方法
		class Inner{						// 在方法中定义的内部类
			public void print(){				// 定义内部类的方法
				System.out.println("类中的属性:" + info) ;		// 直接訪问外部类的私有属性
				System.out.println("方法中的參数:" + temp) ;
			}
		};
		new Inner().print() ;				// 通过内部类的实例化对象调用方法
	}
};
public class InnerClassDemo05{
	public static void main(String args[]){
		new Outer().fun(30) ;	// 调用外部类的方法
	}
};

总结:内部类在实际的开发中很实用。假设使用static声明内部类的情况下。切记,使用static声明的内部类是外部类,操作的时候要使用 “外部类.内部类”的形式訪问。

时间: 2024-09-30 23:28:02

面向对象基础——构造方法私有化、对象数组、内部类的相关文章

面向对象基础——构造方法与匿名对象

什么是构造方法? 只要有一个对象实例化则就会调用构造方法. 在构造方法中要注意以下几点: -构造方法的名称必须与类名一致 -构造方法的声明处不能有任何返回值类型的声明 -不能在构造方法中使用return返回一个值. class Person{ public Person(){ // 声明构造方法 System.out.println("一个新的Person对象产生.") ; } }; public class ConsDemo01{ public static void main(St

C#面向对象基础--类与对象

1.类与对象 类是面向对象编程的基本单元:类造出来的变量叫对象. 一个类包含俩种成员:字段与方法. 字段即变量,方法即函数. 面向对象思想:教给我们如何合理的运用类的规则去编写代码. 2.类的字段 字段代表了类中的数据.在变量之前可以加上public.private和protected表示字段的访问权限. 3.类的方法 (1).函数的概念 表达式: 返回值类型  方法名(参数列表) { 语句1: 语句2: ..... return 表达式: } 函数需要向外界返回一个值,由return语句实现.

面向对象基础——类和对象

Java是面向对象的编程语言,类和对象是面向对象编程的重要概念.从今日起陆续把过去落下的知识一点点补回来,且把这当作一种笔记吧. 1. 类的声明.属性的使用.对象的声明和使用(无参构造方法): 1 class Person 2 { 3 String name;//声明属性,即成员变量,Field又称为字段或域 4 int age; 5 public void talk()//公有方法method 6 { 7 System.out.println("我是"+name+",今年&

面向对象基础——类与对象的定义

面向对象的概念 封装性:对外部不可见.可以保护程序中的某些内容. 继承性:扩展功能的. 类与对象的关系: 定义类和对象的方法? 类图的画法:Person类图 分为三层: 第一层表示类的名称,类的名称与之前一样要求开头首字母大写. 第二层表示属性的定义,按照" 访问权限 属性名称:属性类型 " 的格式定义: 第三层表示类中方法的定义,按照"  访问权限 方法名称():方法返回值类型  " 的格式定义.如下图所示: 类与对象的进一步研究 掌握Java中的内存划分,jav

Objective-C 面向对象基础-构造方法

OC中的类使用的是两段的构造方法,这与通常的C++和Java不同,如果想通过构造的方式传递参数,可以重载一个init方法,下面贴代码. // // Goods.h // 04_Description // // Created by apple on 14-11-9. // Copyright (c) 2014年 cc. All rights reserved. // #import <Foundation/Foundation.h> @interface Goods : NSObject

附录A培训实习生-面向对象基础(2):构造方法和带参数的构造方法

构造方法,又叫构造函数,其实就是对类进行实例化.构造方法与类同名,无返回值,也不需要void,在new时候调用.也就是说,就是调用构造方法的时候. 所有类都有构造方法,如果你不编码则系统默认生成空的的构造方法,如你有定义构造方法,那么默认的构造方法就会失效. 有参数的构造方法:比如我们希望每个小猫一诞生都有姓名,那么就应该写一个有参数的构造方法. 这是一个有参数的构造方法,可以看下: 1 using System; 2 using System.Collections.Generic; 3 us

面向对象、类与对象、成员与局部变量、封装、private、构造函数、this、static、extends、super、final、abstract、interface、多态、内部类、异常【5】

  本文原创作者:pipi-changing本文原创出处:http://www.cnblogs.com/pipi-changing/ 本文版权归作者和博客园共有,未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接 ,否则保留追究法律责任的权利. 面向对象概念 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程 •强调的是功能行为 面向对象 •将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向过程   在一个结构体中定义窗口的大小

sdut 面向对象程序设计上机练习八(对象数组)

面向对象程序设计上机练习八(对象数组) Time Limit: 1000MS Memory limit: 65536K 题目描述 利用类对象数组完成N个学生数据(学号是字符串类型.成绩是整型)的输入.输出. 输入 输入有N+1行: 第一行的整数N表示学生数目: 以下N行是N个学生的数据,每行中第一个是表示学号的字符串,第二个是表示学生成绩的整数. 输出 输出N个学生数据.每个学生的数据占一行. 示例输入 5 01 89 02 78 03 56 04 92 05 76 示例输出 01 89 02

Java面向对象_对象数组

今天学习了对象数组,写点东西总结一下.废话不多说,啥是对象数组呢? 对象数组的概念是这么讲的,对象数组就是数组里的每个元素都是类的对象,赋值时先定义对象,然后将对象直接赋给数组. 举个例子,使用对象数组实现多个Hero的管理 1 import java.util.Arrays; 2 import java.util.Scanner; 3 4 public class Test4 { 5 6 /** 7 * @param args 8 */ 9 public static void main(St