A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wdd   /  2015-6-18 21:11  /  13556 人查看  /  49 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

内部娄可以直接调用外部娄的成员变量和成员方法;外部娄(包含内部娄的娄)调用内部娄则需要创建内部娄对象。格式和平时一样
回复 使用道具 举报
内部类

内部类可以访问外部类相应作用域内的所有数据,包括private;对同一个包内的其他类是隐藏的。

只有内部类内可以声明为private,但在JVM中不存在私有类,内部类在JVM中和普通类没有区别。

内部类在编译的时候,编译器会为内部类创建一个默认的,增加参数为外部类引用的构造方法,通过这个应用,可以访问外部类的数据和方法。

内部类在访问外部类的私有数据时,编译器会为外部类创建一个返回该private数据的方法。可以通过某些方法获得这个方法,造成安全隐患。

内部类访问局部变量时,需要将局部变量声明为final。
回复 使用道具 举报
当内部类中定义了静态方法法,该类也必须是静态的
当外部类的静态方法访问内部类时,内部类也必须是静态的

定义匿名内部类的前提是:内部类必须继承一个类或者实现一个接口
回复 使用道具 举报
    内部类有四种,除了局部内部类有一些特点需要了解。总体上你只需要将内部类当做外部内的成员【包含属性与方法】。局部内部类,只能操作局部终态变量,这类嵌套的限制。  至于用法,内部类主要是为了简便,封装,所以,一般功能单一。
回复 使用道具 举报
内部类你看可不可这么理解:

你平时定义类的时候有时候会有一个私有成员为String类型的,你现在在外部类Outer里面定义一个内部类Inner,你可以把它对比为String来看待,只不过将Inner类的实现代码在Outer类里给你看到了是怎么实现的。

内部类简单的看作是一个类对象成员就行。

回复 使用道具 举报
内部类和外部类联系:内部类可以访问外部类所有的方法和属性,如果内部类和外部类有相同的成员方法和成员属性,内部类的成员方法调用要优先于外部类即内部类的优先级比较高(只限于类内部,在主方法内,内部类对象不能访问外部类的成员方法和成员属性),外部类只能访问内部类的静态常量或者通过创建内部类来访问内部类的成员属性和方法
内部类定义的静态常量可以全局访问
回复 使用道具 举报
wdd 发表于 2015-6-20 15:32
额。。。我还没有去黑马呢

同在中腾
回复 使用道具 举报
妹子加油啊
回复 使用道具 举报
wdd 中级黑马 2015-6-25 19:14:48
29#

会的,一起加油吧!:loveliness:
回复 使用道具 举报
外部类访问内部类,先new一个外部类对象,然后再通过外部类对象new一个内部类:new OuterClass().new InnerClass();外部类访问内部类的成员或方法:new OuterClass().new InnerClass().innerFeild;或者new OuterClass().new InnerClass().innerMethod();内部类访问外部类的成员变量或方法通过内部类对象直接访问:new InnerClass().outerFeild;或者new InnerClass().outerMethod();
回复 使用道具 举报
内部类    在类里又定义了一个类
1 内部类可以直接访问外部类中的成员,包括私有,之所以可以是因为内部类中持有了外部类的引用,格式 外部类名.this.参数名默认省略的;
2 外部类要访问内部类 ,必须建立内部类对象
注意:当内部类中定义了静态成员,该内部类也必须是静态的
当外部类中的静态成员访问内部类时,内部类也必须是静态的

class  Outer{
private int x=3;
class Inter
{
void function(){
Ststem.out.println("inner"+Outer.this.x);
}
}//外部类访问内部类
void method(){

Inter in =new Inter();
in.function();}
}
classInterclass{
public static void mian(String[]args){
Outer.Inter.in=new Outer().new Inter();
in.function();//直接访问内部类成员
}

}
内部类定义在局部时 不可以被成员修饰符修饰 可以直接访问 外部类中的成员,因为还持有外部类中的医用 但是不能访问它所在局部中的变量。只能访问被final修饰的局部变量。
class Outer{

int x=3;
void method(final int a){
final int y=4;
class Innter{
void function(){

System.out.println(a)
}
}
new Innter().functon();
}

}
class Innterclass{


public  static void mian(String[] args){
Outer out=new Outer();
out.method(7);
out.method(8);}
}
0112
//因为所有的类都是object的子类所以下面的写法是可行的
class InnerTest{
public static void main(String[] args){
new object(){
public void function(){
System.out.println("nihao ");}

}.function;

}

}
回复 使用道具 举报
看我的帖子,我写了一些总结
回复 使用道具 举报
内部类作用主要实现功能的隐藏、减少内存开销,提高程序的运行速度

内部类和外部类联系:内部类可以访问外部类所有的方法和属性,如果内部类和外部类有相同的成员方法和成员属性,内部类的成员方法调用要优先于外部类即内部类的优先级比较高(只限于类内部,在主方法内,内部类对象不能访问外部类的成员方法和成员属性),外部类只能访问内部类的静态常量或者通过创建内部类来访问内部类的成员属性和方法
内部类定义的静态常量可以全局访问

创建内部类
第一种方式
假设A是外部类,B是内部类
A a=new A();
A.B b=a.new B();

或者用A类的匿名对象来访问

A.B b=new A().new B();

普通类权限
public和default

而内部类具有四种权限

A.this.name(反射机制创建当前对象)
类优先于字节码文件执行,编译完类才生成字节码文件

字节码文件可以通过反射机制来改变

类中的私有属性可以通过发射机制在类外访问,通过反射机制改变字节码文件中的东西

编译时和运行时

反射机制工作在运行时
静态内部类.
public class StaticInner {
//{
/*static class hello
{
普通代码块内不能定义静态内部类
}*
/
}*/
static
{
class hello
{
//静态代码块内可以定义静态内部类
public void test()
{
System.out.println("it's a inner class");
}
public void practice()//静态代码块内不能定义静态方法
{
System.out.println("it's a demo");
//System.out.println(a);
//method();这两句编译报错,可看出静态内部类不能访问外部类的普通成员和方法
System.out.println(a1);
test1();
//从这两句可以看出,静态内部类只能访问外部类的静态成员和静态方法
}
//从上看出静态内部类可以定义普通方法和静态方法


}
}
private int a;
private void method()
{
System.out.println("hello");
}
private static String a1;
private static void  test1()
{
System.out.println("you can access this method,because it is static");
}
//静态内部类
static class Inner{
public void test()
{
System.out.println("it's a inner class");
}
public static void practice()
{
System.out.println("it's a demo");
//System.out.println(a);
//method();这两句编译报错,可看出静态内部类不能访问外部类的普通成员和方法
System.out.println(a1);
test1();
//从这两句可以看出,静态内部类只能访问外部类的静态成员和静态方法
}
//从上看出静态内部类可以定义普通方法和静态方法

}

}
静态内部类创建对象

StaticInner.Inner inn=new StaticInner.Inner();
这里可以把内部类当做外部类的一个静态成员
局部内部类
定义在方法体内
定义在普通代码块内
实例如下
public class Outer {
private int a;
private void practice()
{
System.out.println("This is a outer class method");
}
public void method()
{
int a1;
final int a2=0;
class inner
{
public void test()
{
//能访问外部类任何属性和方法
System.out.println(a);
practice();
//
// System.out.println(a1);//这句话出现编译错误--报错--不能访问外部类方法中定义的变量
System.out.println(a2);//把变量声明为final常量,final的另一用法
//final 提高局部变量的可见性   声明时需要同时赋值并初始化
}
}
//类的作用范围为这个方法体内,所以对象的创建在这个类声明以后
inner in=new inner();
{
class a{}//代码块中的内部类
}

}
//inner in=new inner();//因为在方法体之外所以报错
//总结:局部内部类具有普通类的功能
//内部类如果访问它所在方法中的局部变量是无法获取的
//解决办法加上final关键字,提高变量的可见性
//局部内部类的对象只能在该方法体的局部创建只能在局部类定义的后面创建对象
}

匿名内部类
出现背景
经常出现在使用其他技术时,出现接口类的情况,此时无法创建接口类型的实现
实例如下
public interface Fruit {
void seed();
void grow();
}
public class Worker {


public void getFruit(Fruit fruit)
{
System.out.println("this is a no name class");
fruit.grow();
fruit.seed();
}
}
public class Test1 {
public static void main(String[] args) {
Worker w=new Worker();
w.getFruit(new Fruit(){


@Override
public void seed() {
// TODO Auto-generated method stub
System.out.println("the seed is planted");

}


@Override
public void grow() {
// TODO Auto-generated method stub
System.out.println("it's growing");

}});
//1.匿名类没有名字
//2.匿名类是一个子类
//3.匿名类用它父类(接口,抽象)当名字,父接口的名字
//4.执行效率奇高
//多用在android开发中
//匿名类实现父类(接口,抽象)中的方法
}

}
//总结在代码中写了,有错请批评指出,谢谢哈
回复 使用道具 举报
当内部类定义在在外部类类成员位置上,非私有,可以在外部其他类中直接访问可以被成员修饰符修饰
当内部类定义在局部位置时不可以被成员修饰符修饰,访问他的局部变量时只能访问被final修饰的局部变量
外部类名.内部类名.变量名=外部类对象.内部类对象
Other.Inner in=new Other().new Inner();
在外部类中直接调用非静态方法
new Other.Inner().function()
在外部类中直接调用静态方法
Other.Inner.function()
回复 使用道具 举报
内部类可以直接访问外部类中的所有成员,包括私有的。
而外部类要想访问内部类中的成员,必须创建内部类的对象
回复 使用道具 举报
1.内部类可以直接访问外部类中的成员,包括私有
  之所以可以直接访问外部类中的成员,是因为内部类中持有了一个外部类的引用,格式:外部类名。this
2.外部类要访问内部类,必须建立内部类对象

访问格式:
1.当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。
可以直接建立内部类对象
格式:
  外部类名.内部类名 变量名= 外部类对象.内部类对象;
   Outer.Inner in = new Outer().new Inner();
2.当内部类在成员位置上,就可以被成员修饰符所修饰
   比如,private 将内部类在外部类中进行封装
        static 内部类就具备了static的特性
        当内部类被static修饰后,只能直接访问外部类的static成员,出现了访问局限
       
        在外部其他类中,如何直接访问static内部类的非静态成员呢?
        new Outer.Inner().function();

        在外部其他类中,如何直接访问static内部类的静态成员呢?
        outer.Inner.function();

   注意:当内部类中定义了静态成员,该内部类必须是static的
        当外部类中的静态方法访问内部类时,内部类也必须是静态方法
回复 使用道具 举报
果断来学习,不解释
回复 使用道具 举报
内部类可以使用外部类的所有方法与变量,外部类方法通过new 内部类对象来使用内部类的方法。
回复 使用道具 举报
1、内部类可以直接访问外部类成员,包括私有。
2、外部类访问内部类,必须建立内部类对象(内部类非私有)。
     直接访问内部类成员 例:Outer.Inner in = new Outer().newInner();
3、内部类在成员位置上可以被private、static修饰。
4、静态内部类只能访问外部类中被static修饰的成员。
5、直接访问static内部非静态成员:--------- = new Outer.Inner().function();
     直接访问static内部静态成员:Outer.Inner.function
6、内部类定义了静态成员,该内部类必须是静态的,内部类的静态方法访问内部类中的成员也必须是静态的。
7、匿名内部类的前提是,内部类必须继承一个类或实现接口。
     匿名内部类格式:new 父类或者接口(){定义子类的内容};

回复 使用道具 举报
llo 中级黑马 2015-7-9 20:46:13
40#
给你找个内部类怎么调用外部类的方法  你看看吧  网上这个例子看着比较简单


public class B {
int i = 0;
public void e(){
System.out.println("我是外部内的方法");
}
class C{
public void d(){
e();
}
}
public static void main(String[] args) {
new B().new C().d();
}
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马