java 内部类整理学习
2015-06-07 10:19
489 查看
内部类
内部类介绍:1、封装在内部,不允许同包中其他类访问该类,
2、内部类可以直接访问外部类的私有数据。
3、匿名内部类适合于创建那些仅需要一次使用的类。
内部类与外部类的区别:
1、内部类多了,private protect static 三个修饰符
2、非静态内部类不能有静态成员。
内部类的分类:
1、静态内部类
2、局部内部类
3、匿名内部类
4、非静态内部类(成员内部类):是一种与成员、方法、构造器和初始化块相似的类成员,局部内部类和匿名内部类不是类成员。
成员内部类两种:静态内部类和非静态内部类。
内部类的使用在方法中创建实例,并使用方法和属性
详细介绍:
非静态内部类:
可以直接访问外部类的私有成员,因为非静态内部类就和成员一样,都是在外部类的内部,所以可以访问私有变量。
实际上非静态内部类对象里,保存了一个他所寄生外部类的对象的引用。
外部类不能访问内部类的属性,但可以实例化内部类之后访问。,
不允许在外部类的静态成员中直接使用非静态内部类,就是实例化的对象可以访问类,但是类不可以访问实例化的对象成员
public class asd { public int a=12; private int b=2; private String ass="我是外部类的私有成员"; class as{ public void aaa(){ System.out.println(ass); } } // public static void runn(){ // as jjjj=new as();//静态成员内部不能有非静态内部类 // } public void run(){ as jj=new as(); jj.aaa(); } public static void main(String[] args) { // TODO Auto-generated method stub asd ppp=new asd(); ppp.run(); } }
境外内部类:
如果是静态内部类,则该内部类就属于外部类本身,而不属于外部类的某个对象。根据静态成员不能访问非静态成员的规则,静态内部类内部不能访问外部类的实例成员,只能访问外部类的类成员。
非静态内部类寄生在外部类的实例中,静态内部类寄生在外部类的本身中。
可以用静态内部类来定义外部类的所有方法、属性、初始化块,但是外部类依然不能直接访问内部类的成员。
接口内的内部类只能是静态内部类。
在外部类以外使用内部类,权限降低一级
Outerclass.interclass varname
在外部类以外的地方创建非静态内部类的实力方法
Outerclass.new Innerconstructor();
out.in in=new out().new IN();
在外部类以外的地方使用静态内部类
staticout.staticin in=new staticout.staticin();
public class asd {
public int a=12;
private int b=2;
private String ass="我是外部类的私有成员";
class as{
public as(){
System.out.println("非静态内部类的构造函数");
}
public void aaa(){
System.out.println(ass);
}
}
static class aas{
public aas(){
System.out.println("静态内部类的构造方法");
}
}
// public static void runn(){
// as jjjj=new as();//静态成员内部不能有非静态内部类
// }
public void run(){//在外部类内使用非静态内部类
as jj=new as();
aas jjj=new aas();//在外部类内使用静态内部类
jj.aaa();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
asd ppp=new asd();
ppp.run();
}
}
class call{
public call(){
System.out.println("构造函数");
}
asd.as l=new asd().new as();//调用非静态类
asd.aas lll= new asd.aas();//调用静态类
}
局部内部类:把一个类放在方法里定义,这个类就是一个局部内部类,局部内部类只在方法内有效,因其外部是方法,所以不能用static修饰。由于作用于太小,开发效率不高。
public static void main(String[] args) {
// TODO Auto-generated method stub
asd ppp=new asd();
ppp.run();
call ppp1=new call();
ppp1.goo();
}
}
class call{
public call(){
System.out.println("构造函数");
}
public void goo(){
class haha{
public int a=1;
}
haha kk=new haha();
int o=kk.a;
System.out.println(o);
}
asd.as l=new asd().new as();//调用非静态类
asd.aas lll= new asd.aas();//调用静态类
}
不过学过js的感觉挺顺的
匿名内部类:
匿名内部类只适合创建那种只需要使用一次的类,创建方法,创建匿名内部类时,会立即创建匿名内部类的实例。
创建格式:
new 实现接口()|父类构造器(参数){
//匿名内部类的类体部分
}
匿名内部类必须继承父类,或实现一个接口,最多只能一个。
匿名内部类不能是抽象类,没有构造函数(因为没有类名,但可以有初始化块);
局部变量被匿名内部类访问,即有final修饰(默认);
interface waiin{
public void onee();
public void oneee();
}
abstract class cc{
public int qwe=3333;
public cc(){
System.out.println("我是将被匿名内部类调用的抽象类");
}
}
public class asd {
public int a=12;
private int b=2;
private String ass="我是外部类的私有成员";
class as{
public as(){
System.out.println("非静态内部类的构造函数");
}
public void aaa(){
System.out.println(ass);
}
}
static class aas{
public aas(){
System.out.println("静态内部类的构造方法");
}
}
public void run(waiin o){//在外部类内使用非静态内部类
as jj=new as();
aas jjj=new aas();//在外部类内使用静态内部类
jj.aaa();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
asd ppp=new asd();
call ppp1=new call();
ppp1.goo();
ppp.run(new waiin(){//用匿名内部类返回值
@Override
public void onee() {
// TODO Auto-generated method stub
System.out.println("匿名内部类的抽象方法实现");
}
@Override
public void oneee() {
// TODO Auto-generated method stub
System.out.println("匿名内部类的抽象方法实现");
}
});
new cc(){
{
System.out.println("直接使用匿名内部类");
}
};
}
}
class call{
public call(){
System.out.println("构造函数");
}
public void goo(){
class haha{
public int a=1;
}
haha kk=new haha();
int o=kk.a;
System.out.println(o);
}
asd.as l=new asd().new as();//调用非静态类
asd.aas lll= new asd.aas();//调用静态类
}
相关文章推荐
- eclipse在使用git
- maven 在eclipse 中配置下载源代码
- 使用JDBC进行数据访问【spring framwork】
- Eclipse在SVN安装步骤(两种)和使用方法
- 想要成为java高手的25个学习目标
- Acegi Security -- Spring下最优秀的安全系统(zhuan)
- Spring包下载地址
- SpringMVC访问静态资源的三种方式
- javabean总结
- JAVA序列化机制的深入研究
- java获得平台相关的行分隔符和java路径分隔符的方法
- Java for LeetCode 198 House Robber
- java 抽象类与接口的异同
- Java多线程<1>
- JAVA开发读取文件的方法
- Java创建Servlet找不到javax.servlet.*解决方案解决创建servlet 找不到webservlet包
- java生成随机数的两种方式
- java生成随机数的两种方式
- java中单例设计模式的两种实现方式
- Java 对象序列化和操作文件 正则表达式