12-11java面向对象之内部类操作

在本次博客之后,进行的就是面向对象的高级操作。何为高级呢?只是在基础之上的扩充,所以要把基础知识掌握牢固才有可能进一步提高。为了完成质疑任务,本周剩下的时间全部用来复习,温故而知新。

在开始主题内部类之前,先简单介绍一下代码块的基本概念。

1.代码块

在java中有的代码可以直接使用{}将代码括起来,主要包括一下几种:

1.普通代码块:直接在方法之中编写。

//代码块的测试
public class Test
{
	public static void main(String[] args)
	{
		{
			int x = 10;<span style="white-space:pre">			</span>
			System.out.println("x = " + x);
		}
		int x = 100;
		System.out.println("x = " + x);
	}
} 

解释:上述代码int实例化,首先对x赋予局部变量,在基本代码块之后,进入全局变量。

2.构造块:在类中定义的代码块。构造块优先于构造方法执行,每个对象实例化之后,都会重复执行构造块和构造方法。

//代码块的测试
class A
{
	{
		System.out.println("这是构造块");
	}
	public A()
	{
		System.out.println("hello world");
	}
}
public class Test
{
	public static void main(String[] args)
	{
		new A();
		new A();
		new A();
	}
} 

3.静态代码块。使用static定义的块,他优先于构造块执行,而且不管多少个实例化对象,他只执行一次。

//代码块的测试
class A
{
	static
	{
		System.out.println("这是静态块");
	}
	{
		System.out.println("这是构造块");
	}
	public A()
	{
		System.out.println("hello world");
	}
}
public class Test
{
	public static void main(String[] args)
	{
		new A();
		new A();
		new A();
	}
} 

在主类之中定义的静态块优先于主方法执行。\

//代码块的测试
class A
{
	static
	{
		System.out.println("这是静态块");
	}
	{
		System.out.println("这是构造块");
	}
	public A()
	{
		System.out.println("hello world");
	}
}
public class Test
{
	static
	{
		System.out.println("@@@@@@@@@@@");
	}
	public static void main(String[] args)
	{
		new A();
		new A();
		new A();
	}
} 

上面的这一程序提供了一个信息,可以不使用main()方法就能输出信息,通过代码块来实现。

2.内部类

使用情况:

1.最早使用在图形界面

2.开源框架

2.1概念

概念:在一个类的内部定义其他操作类

格式:

Class 外部类

{

属性方法

Class 内部类

属性方法

}

//内部类的测试
class Outer
{
	private String name1 = "hello";
	class Inner
	{
		private String name2 = "world";
		public void print()
		{
			System.out.println(name1);<span style="white-space:pre">	</span>//调用外部类属性<span style="white-space:pre">	</span>
             <span style="background-color: rgb(255, 255, 51);">//System.out.println(Outer.this.name1);</span>
		}
	}
	public void f()<span style="white-space:pre">		</span><span style="font-family: 宋体;">			</span><span style="font-family: 宋体;">//</span><span style="font-family: 宋体;">外部类的方法,进行实例内部类并调用内部类的方法</span><span style="white-space:pre">
</span>	{
		Inner in = new Inner();
		in.print();
		System.out.println(in.name2);<span style="white-space:pre">		</span>//外部类方法调用内部类
	}
}
public class Test
{
	public static void main(String[] args)
	{
		new Outer().f();
	}
} 

优点:内外部类的私有操作可以互相访问

缺点:破坏了类的结构

之前内部类的操作都是产生了外部类之后通过外部类提供的方法提供实例化内部类,才能进行内部类的方法的调用,能否在外部产生内部类的实例?

编译程序之后出现了   Outer$Inner.class

$在程序之中可以理解为”.”,即内部类的名称为: “外部类.内部类”。

由于内部类的访问需要操作外部类的资源和属性,所以要想在外部实例化内部类的对象,格式:

外部类.内部类   内部类对象名= new 外部类().new内部类()

//内部类的测试
class Outer
{
	private String name1 = "hello";
	class Inner
	{
		//内部类的方法
		public void print()
		{
			System.out.println(Outer.this.name1);
		}
	}
}
public class Test
{
	public static void main(String[] args)
	{
		//外部类.内部类   内部类对象名= new 外部类().new内部类()
		Outer.Inner  in = new Outer().new Inner();
		in.print();
	}
} 

2.2 static声明内部类

可以使用static声明内部类,但是不能声明外部类

例如  static A{  } 错误的提示: 错误: 此处不允许使用修饰符static

如果一个内部类用static声明 则成为了外部类

声明格式:

外部类.内部类   内部类对象名= new 外部类.内部类()

//内部类的测试
class Outer
{
	private static String name1 = "hello";		//内部类变成static 只能访问static资源
	static class Inner
	{
		//内部类的方法
		public void print()
		{
			System.out.println(name1);
		}
	}
}

public class Test
{
	public static void main(String[] args)
	{
		//static内部类则他又变成了外部类
		Outer.Inner  in = new Outer.Inner();
		in.print();
	}
} 

2.3在方法中定义内部类

理论上内部类可以在任何地方定义,大多数在方法之中。在方法中定义内部类,可以直接访问外部类的属性

//内部类的测试
class Outer
{
	private static String name1 = "hello";		//内部类变成static 只能访问static资源
	//外部类的方法
	public void fun()
	{
		//在方法中定义内部类
		class Inner
		{
			//内部类的方法
			public void print()
			{
				System.out.println(Outer.this.name1);
			}
		}
		Inner in = new Inner();
		in.print();
	}
}
public class Test
{
	public static void main(String[] args)
	{
		new Outer().fun();
	}
} 

注意:在方法中定义内部类时,也紧跟着实例化内部类方法。低版本的JDK中,内部类如果要调用方法的参数和变量时,需要final声明,但是高版本不需要了

//内部类的测试
class Outer
{
	private static String name1 = "hello";		//内部类变成static 只能访问static资源
	//外部类的方法
	public void fun(final int x)
	{
		final String name2 = "world";
		//在方法中定义内部类
		class Inner
		{
			//内部类的方法
			public void print()
			{
				System.out.println(Outer.this.name1);
				System.out.println(x);
				System.out.println(name2);
			}
		}
		Inner in = new Inner();
		in.print();
	}
}
public class Test
{
	public static void main(String[] args)
	{
		new Outer().fun(1);
	}
} 

今天到此结束,祝大家健健康康,快快乐乐。

时间: 2024-12-16 01:22:50

12-11java面向对象之内部类操作的相关文章

JavaSE入门学习14:Java面向对象之内部类

一内部类概述 内部类(Inner Class)就是定义在另外一个类里面的类.与之对应,包含内部类的类被称为外部类. 内部类的主要作用如下: A内部类提供了更好的封装,可以把内部类隐藏在外部类之内,不允许同一个包中的其他类访问该类. B内部类的方法可以直接访问外部类的所有数据,包括私有的数据. C内部类所实现的功能使用外部类同样可以实现,只是有时使用内部类更方便. 内部类可分为以下几种: A成员内部类 B静态内部类 C方法内部类 D匿名内部类 二成员内部类 内部类中最常见的就是成员内部类,也称为普

Java学习系列(二十三)Java面向对象之内部类详解

一.前言 内部类也称寄生类,就是把一个类放在类里面(即内部类的上一级程序单元是类)定义,将其作为外部类的成员.内部类主要用几种定义形式:静态(static)内部类,非静态内部类,匿名内部类(也就是没有名字的寄生类).内部类的好处就是内部类可以直接外部类的(包括私有)成员,反之不能.下面我们通过一些实例来详细讲解一下Java中内部类的使用及几种定义形式的相互调用. 二.实例说明 (1)匿名内部类:当程序创建匿名内部类时,会立即创建匿名内部类(实现类)的实例. interface IBreathe

(十七)面向对象之内部类

1.成员内部类 使用: 内部类的同名变量访问: 2.局部内部类: 局部内部类的final问题: 匿名内部类: 类作为成员变量类型: 接口作为成员变量类型: 实现方法1: 实现方法2: 接口作为参数或返回值: 原文地址:https://www.cnblogs.com/huoyunxieshen/p/11154162.html

java基础之内部类

java内部类,本是非常基础的,在分析一些开源框架源码时候或者看jdk源码的时候,就会发现用到大量的内部类.但是在实际工作中,尤其对于新手来说,根本不知道内部类有什么用处.说白了还是对内部类的基本原理不够清晰,没有掌握好这个基础,所以才不知道内部类有什么用处. 本人也是一边总结基础一边学习一边成长中. 关于内部类: java有四种内部类: ①静态内部类(static inner class) ②成员内部类(member inner class) ③局部内部类(local inner class)

java之内部类

1 public class RedCowForm { 2 static String formName ; 3 RedCow cow ; //内部类声明对象 4 RedCowForm(){} 5 RedCowForm(String s) 6 { 7 cow =new RedCow(150,112,5000); 8 formName= s; 9 } 10 public void showCowMess() 11 { 12 cow.speak(); 13 } 14 class RedCow //内

第12天 面向对象

第12天面向对象 今日内容介绍 构造方法 this super 构造方法 我们对封装已经有了基本的了解,接下来我们来看一个新的问题,依然以Person为例,由于Person中的属性都被private了,外界无法直接访问属性,必须对外提供相应的set和get方法.当创建人对象的时候,人对象一创建就要明确其姓名和年龄,那该怎么做呢? 构造方法介绍 在开发中经常需要在创建对象的同时明确对象的属性值,比如员工入职公司就要明确他的姓名.年龄等属性信息. 那么,创建对象就要明确属性值,那怎么解决呢?也就是在

Web 在线文件管理器学习笔记与总结(11)获取文件夹信息 (12)返回上一级操作

(11)获取文件夹信息 文件夹没有修改操作. index.php: <?php require 'dir.func.php'; require 'file.func.php'; require 'common.func.php'; $path = 'file'; $path = @$_REQUEST['path'][email protected]$_REQUEST['path']:$path; $info = readDirectory($path); if($info == NULL){ e

Hibernate (面向对象的数据库操作)

JPA,java persistance api,java持久层接口,即与数据库打交道的一些接口.实现交给各个厂商去实现. ORM,Object/Relation Mapping,对象/关系数据库映射.面向对象的数据库操作,底层仍是sql语句. 获得 hibernate的maven依赖. <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactI

第12周——教师干部类

#include <iostream> using namespace std; class Teacher { public: Teacher(string nam,int ag,string add,string tel,string se,string ti): name(nam),age(ag),addr(add),telnum(tel),sex(se),title(ti){} protected: int age; string addr,sex,title,name,telnum;