什么是java外部类?java什么是外部类
大家好,什么是java外部类相信很多的网友都不是很明白,包括java什么是外部类也是一样,不过没有关系,接下来就来为大家分享关于什么是java外部类和java什么是外部类的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!
java里面的内部类和外部类是什么_
外部类:
最普通的,我们平时见到的那种类,就是在一个后缀为.java的文件中,直接定义的类
内部类:
内部类,顾名思义,就是包含在外部类中的类,就叫做内部类。内部类有两种,一种是静态内部类,一种是非静态内部类。
静态内部类和非静态内部类之间的区别主要如下:
1、内部原理的区别:
静态内部类是属于外部类的类成员,是一种静态的成员,是属于类的,就有点类似于private static Singleton instance= null;非静态内部类,是属于外部类的实例对象的一个实例成员,静态类则是属于所有外部共有的,也就是说,每个非静态内部类,不是属于外部类的,是属于外部类的每一个实例的,创建非静态内部类的实例以后,非静态内部类实例,是必须跟一个外部类的实例进行关联和有寄存关系的。
2、创建方式的区别:
创建静态内部类的实例的时候,只要直接使用“外部类.内部类()”的方式,就可以,比如School.Teacher();创建非静态内部类的实例的时候,必须要先创建一个外部类的实例,然后通过外部类的实例,再来创建内部类的实例,new School().Teacher()
通常来说,我们一般都会为了方便,会选择使用静态内部类。
java什么是外部类
外部类,内部类,匿名类,外部类就是两个类并列的class
A
{}
class
B
{},内部类:class
A
{
class
B
{}},B可以直接使用包涵它的类的成员变量,内部类不能被除包涵类以外的类调用;还有就是匿名类,也是内部类
classA{new
{}}省略定义类名直接定义方法和使用,这个适用于代码比较简单且这个类不需要被其他类调用
Java里什么叫内部类什么叫外部类
对普通类(没有内部类的类)来说,内部类和外部类都与他无关;对有内部类的类来说,它们就是其内部类的外部类,外部类是个相对的说法,其实就是有内部类的类。
所以,要回答这个问题,只需要讲解内部类是什么:
Java中的内部类共分为四种:
静态内部类static inner class(also called nested class)
成员内部类member inner class
局部内部类local inner class
匿名内部类anonymous inner class
静态内部类Static Inner Class
最简单的内部类形式。
类定义时加上static关键字。
不能和外部类有相同的名字。
被编译成一个完全独立的.class文件,名称为OuterClass$InnerClass.class的形式。
只可以访问外部类的静态成员和静态方法,包括了私有的静态成员和方法。
生成静态内部类对象的方式为:
OuterClass.InnerClass inner= new OuterClass.InnerClass();
示例代码:
package com.learnjava.innerclass;
class StaticInner
{
private static int a= 4;
//静态内部类
public static class Inner
{
public void test()
{
//静态内部类可以访问外部类的静态成员
//并且它只能访问静态的
System.out.println(a);
}
}
}
public class StaticInnerClassTest
{
public static void main(String[] args)
{
StaticInner.Inner inner= new StaticInner.Inner();
inner.test();
}
}
成员内部类Member Inner Class
成员内部类也是定义在另一个类中,但是定义时不用static修饰。
成员内部类和静态内部类可以类比为非静态的成员变量和静态的成员变量。
成员内部类就像一个实例变量。
它可以访问它的外部类的所有成员变量和方法,不管是静态的还是非静态的都可以。
在外部类里面创建成员内部类的实例:
this.new Innerclass();
在外部类之外创建内部类的实例:
(new Outerclass()).new Innerclass();
在内部类里访问外部类的成员:
Outerclass.this.member
示例代码:
package com.learnjava.innerclass;
class MemberInner
{
private int d= 1;
private int a= 2;
//定义一个成员内部类
public class Inner2
{
private int a= 8;
public void doSomething()
{
//直接访问外部类对象
System.out.println(d);
System.out.println(a);//直接访问a,则访问的是内部类里的a
//如何访问到外部类里的a呢?
System.out.println(MemberInner.this.a);
}
}
}
public class MemberInnerClassTest
{
public static void main(String[] args)
{
//创建成员内部类的对象
//需要先创建外部类的实例
MemberInner.Inner2 inner= new MemberInner().new Inner2();
inner.doSomething();
}
}
局部内部类Local Inner Class
局部内部类定义在方法中,比方法的范围还小。是内部类中最少用到的一种类型。
像局部变量一样,不能被public, protected, private和static修饰。
只能访问方法中定义的final类型的局部变量。
局部内部类在方法中定义,所以只能在方法中使用,即只能在方法当中生成局部内部类的实例并且调用其方法。
示例代码:
package com.learnjava.innerclass;
class LocalInner
{
int a= 1;
public void doSomething()
{
int b= 2;
final int c= 3;
//定义一个局部内部类
class Inner3
{
public void test()
{
System.out.println("Hello World");
System.out.println(a);
//不可以访问非final的局部变量
// error: Cannot refer to a non-final variable b inside an inner
// class defined in a different method
// System.out.println(b);
//可以访问final变量
System.out.println(c);
}
}
//创建局部内部类的实例并调用方法
new Inner3().test();
}
}
public class LocalInnerClassTest
{
public static void main(String[] args)
{
//创建外部类对象
LocalInner inner= new LocalInner();
//调用外部类的方法
inner.doSomething();
}
}
匿名内部类Anonymous Inner Class
匿名内部类就是没有名字的局部内部类,不使用关键字class, extends, implements,没有构造方法。
匿名内部类隐式地继承了一个父类或者实现了一个接口。
匿名内部类使用得比较多,通常是作为一个方法参数。
生成的.class文件中,匿名类会生成OuterClass$1.class文件,数字根据是第几个匿名类而类推。
示例代码:
package com.learnjava.innerclass;
import java.util.Date;
public class AnonymouseInnerClass
{
@SuppressWarnings("deprecation")
public String getDate(Date date)
{
return date.toLocaleString();
}
public static void main(String[] args)
{
AnonymouseInnerClass test= new AnonymouseInnerClass();
//打印日期:
String str= test.getDate(new Date());
System.out.println(str);
System.out.println("----------------");
//使用匿名内部类
String str2= test.getDate(new Date()
{
});//使用了花括号,但是不填入内容,执行结果和上面的完全一致
//生成了一个继承了Date类的子类的对象
System.out.println(str2);
System.out.println("----------------");
//使用匿名内部类,并且重写父类中的方法
String str3= test.getDate(new Date()
{
//重写父类中的方法
@Override
@Deprecated
public String toLocaleString()
{
return"Hello:"+ super.toLocaleString();
}
});
System.out.println(str3);
}
}
什么是java外部类的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java什么是外部类、什么是java外部类的信息别忘了在本站进行查找哦。