内部类,实际开发中的应用体现

定义:放在一个类的内部的类我们就叫内部类。

  在Java中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。内部类仍然是一个独立的类,在编译之后内部类会被编译成独立的.class文件,但是前面冠以外部类的类名和$符号。

  内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类。对于一个名为outer的外部类和其内部定义的名为inner的内部类。编译完成后出现outer.class和outer$inner.class两类。所以内部类的成员变量/方法名可以和外部类的相同。

  内部类可以是静态static的,也可用public,default,protected和private修饰。(而外部顶级类即类名和文件名相同的只能使用public和default

分类:1.成员内部类  2.静态内部类 3.匿名内部类 4.方法内部类(几乎不用)

作用:间接解决多重继承的问题(内部类继承一个类,外部类继承一个类,实现多继承。最重要的作用);

   内部类拥有外围类的所有元素的访问权限;


 

  成员内部类,顾名思义,就是在一个类的内部定义一个类,作为类的一个成员属性(成员字段),类的成员内部类可以访问该类的属性和方法,因为他也是该类的一个成员。

  要注意的是,成员内部类不能含有static的变量和方法。因为成员内部类需要先创建了外部类,才能创建它自己的,了解这一点,就可以明白更多事情,在此省略更多的细节了。

  上代码:

  

package 内部类.成员内部类;

public class Person {
	public void sayPerson(){
		System.out.println("hello Person");
	}
}

  

package 内部类.成员内部类;

public class Student extends Person {
	private int age;
	public int getAge(){
		return age;
	}
	public void say(){
		System.out.println("hello Student");
	}
	
	private Grade1 getGrade1() { 
        return new Grade1(); //建议用这种方式实例化
    } 
	
    private class Grade1{
		public void say(){
			Student.this.sayPerson();//内部类调用外部类的成员
			Student.this.say();
			System.out.println(Student.this.getAge());
			System.out.println("hello Grade1");
		}
	}
	public static void main(String[] args) {
		Student stu = new Student();
		Student.Grade1 grade1 = stu.getGrade1();
		//Student.Grade1 grade2 = stu.new Grade1();两种实例化内部类的方式
		grade1.say();
		
	}
}

 


静态内部类:顾名思义内部类是静态的,这样的好处是不用拿到外部类对象就可以实例化内部类了,但是这样的话,内部类就不能引用外部类的静态成员了(人无完人啊)

上代码 eg:HashMap 中的 Entry

package 内部类.静态内部类;

public class Test {  
    public int age=1;  
    public static String name="shaolin";  
    static class Baby{  //静态内部类
        public void say()  
        {  
        	//System.out.println(age);不能访问age属性,只能访问静态属性(很容易理解)
            System.out.println("hello "+name);  
        }  
    }  
  
    public static void main(String[] args) {      
    	Test.Baby temp=new Test.Baby();  //实例化静态内部类  
        temp.say();  
    }  
}  
 

  


 

匿名内部类,顾名思义就是没有名字的内部类

上代码

package 内部类.匿名内部类;

public class Test {  
    public static void main(String[] args) {      
        //相当继承Mother类并实现抽象方法  
    	Person person=new Person(){
			@Override
			public void say() {
				System.out.println("hello,匿名内部类");
			}  
        };  
        person.say();
    }  
}  
  
abstract class Person{  //也可以是一个interface的
    public abstract void say();  
}  

  

转载于:https://www.cnblogs.com/amazinglin/p/4517825.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值