---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------
毕向东 Java基础视频教程09天01面向对象(内部类访问规则)
1. 内部类可以直接访问外部类中的成员均按,包括私有,因为默认有外部类名.this,这就是外部类的引用。
2. 外部类访问内部类,必须先在建立内部类按照通常方法建立对象。
3. 内部类可以被private修饰
4. 在外部类之外想直接访问内部类调用内部类成员,必须先建立内部类对象,只是建立内部类对象的方法不同于在外部类中建立内部类的方法。
5. 要建立内部类对象首先要建立外部类对象,因为内部类存在在外部类之中,想要建立内部类对象必须先建立外部类对象。
Out.Inner in=new Out().new Inner();但是当内部类被私有化之后就不能这么访问了。
6.当有外部变量,成员变量和局部变量时,先访问局部变量。
7.this指对象或者本类
毕向东 Java基础视频教程09天02面向对象(静态内部类)
1. 静态内部类只能访问静态成员
2. 怎样在外部其他类中直接访问静态内部类还是先建立内部类对象,通过对象调用,不过建立内部类方式如下
new Outer.Inner().funtion();
原因:随着外部类的加载内部类(静态)也跟着加载,既然内部类加载进来了就建立它的对象
如果连function()也是静态的话
Outer.Inner.function()
3. 规定:当内部类中定义了静态成员,该内部类必须是静态
4. 静态成员随时都可以调用,因为他已经被加载到内存中了,而非静态成员必须通过对象来调用。因为只有创建了象,子对象调用时该非静态方法才会被加载到能存中,才能使用。
5. 虚拟机是先把含有主程序的类加载到内存中,然后直接取运行其主函数,在运行主函数的过程中需要用到哪个类文件就将其加载进内存,这样动态加载以节省内存空间。
非静态方法是当创建对象调用方法时它才加载到方法区,其中包含this super
6. 引用变量的数据类型就是引用变量所引用的对象的数据类型.
7. 多态:同一个方法名,多个方法内容,具体体现在重载和复写的时候.虽然调用的是同一个方法名,但是根据传递的参数(重载)不同调用的是不同的方法内容,或者虽然调用的是同一方法名,但是因为引用变量引用的对象不同调用的方法内容也不同(复写).
8. Animal a=new Dog();
9. =左边做了两件事:1.为即将创建的对象的地址开辟一个存放空间,
10. 8.声明该引用变量a所引用的对象必须是Animal类型的,也就是说你右边创建的对象要么是Animal类型的,要么是我Animal的子类类型的。
11. 9.对于一般类:不管是在主程序里还是在其他类的方法中只要需要用到该类去创建对象时,都会把该类加载到内存中使用。
12. 而内部类由于已经作为了外部类的一个成员,该成员若是静态的就可以任意使用,而若是非静态的,作为一个外部类成员,必须通过外部类对象来调用,而只是调用一个类没有什么意义,所以调用类通常是用来创建内部类对象,通过内部类对象来调用方法。
13. 如果a instanceof Xiaomao 那么a instance of Animal就成立,也就是说如果a指向小猫的对象,a就必然指向动物的对象,因为小猫和动物之间是子类父类关系,小猫的对象,小狗的对象也好都属于父类animal的对象。也即子类的对象都属于父类的对象(java默认的通过实例可以验证),a指向子类对象就一定满足a指向父类对象。但是为了方便运用,一般都将a instanceof Xiaomao理解为a是小猫,或者要判断a是不是小猫是if(a instanceof Xiaomao)
14. 把内部类视为外部类中的一个成员,它不享有其他类的什么地方用到(无论在主程序还是其他类中)就什么时候加载的特权,要想调用它必须通过外部类对象调用非静态成员的方式。
15. 需要什么就设置什么类型的参数,然后接受什么就好了。
16. 现在只需要知道哪个被加载了就好,至于具体怎么加载的甭管。
17. this根本意:this引用指向调用对象,只不过有时候凭这个不够用,比如子类继承了父类之后,子类里有两个成员变量num,那么this/super引用指向调用对象中的本类/父类,调用对象一般忽略,编程this代表本类,super代表父类。内部类和外部类中,this引用还是指向调用对象,也即this引用指向本类对象,简称this代表为本类,外部类类名.this,表示this引用指向外部类对象,所以外部类名.this表示外部类。子类父类,内部类外部类中this的根本意一样,不过因为子类父类中只创建了一个对象,this表示的是对象的本类,而内部类外部类中内部类和外部类都有各自对象,所以this表示本类对象,see一个是对象的本类,一个是本类对象。为了方便去掉对象后都是本类。注意局部变量不光是参数变量还有在本方法内部定义的变量也是局部变量。
18. 静态随着类的加载而加载,但是内部类的静态方法不会随着静态类的加载而加载,必须用内部类名去调用该静态方法。
19. 只要是静态成员都要用类名去调用除非在本类中调用,不能因为它是静态在内存中已经存在了就不再用类名去调用了,因为不同的类中可以都有静态的同名方法,你就趴一下把方法明白出来谁知道是哪个类中的静态方法,所以必须每次调用静态成员时都要用类名去调用。有一种情况例外,就是在该类中去调用该类的静态成员,因为默认就是本类名去调用,所以不用加类名。
毕向东 Java基础视频教程09天03面向对象(内部类定义原则)
1. 就算内部类时private的,也可以在外部类的方法中去创建内部类对象。
2. 当A类需要直接访问到B类的成员时,就把A类写到B类里面去作为内部类,然后尽量private不对外暴露,但同时也对外提供方法来访问内部类。
毕向东 Java基础视频教程09天04面向对象(匿名内部类)
1. 局部内部类:内部类也可以放在局部的位置,也即外部类方法中,但是此时不能被static修饰,因为static是成员修饰符,而此时内部类已经不是成员了。
2. 局部内部类成员是不能被静态修饰的。
3. 局部内部类的可见范围只在该方法中,局部内部类他不是外部类的成员,要创建对象可以直接在该方法中创建。
4. 局部内部类只能访问局部中被final修饰的局部变量。
5. 局部变量不在堆内存的对象实体中,而在栈内存中。
6. 局部变量生命周期:随着其所在方法被调用而在栈内存中创建空间,当方法被调用被就释放。
7. 如果内部类是静态,在外部类的方法中就直接创建该内部类对象。
8. 只要是类中成员,默认都有一个this.
9. 当内部类是非静态时,在外部类方法中创建内部类对象时,可以在该方法中创建一个外部类对象调用内部类然后创建,也可以在主函数中创建外部类对象然后调用该方法,然后直接new内部类对象,就相当于外部类对象调用了内部类然后创建内部类对象,因为只要是成员默认都有this.,外部类方法中的内部类成员前默认也有this.this指向调用对象-外部类对象,也即this代表外部类对象,所以相当于外部类对象调用了内部类,然后在创建内部类对象。
10. 匿名内部类就是匿名子类对象,只不过有点胖,该匿名内部类需创建在外部类的方法之中,这样才能调用。因为已经匿名了,想创建对象怎么办,java想到了以父之名创建自己对象,就是怎么创建对象我自己说了算,我只是借你的名获得一个能够创建对象的权利。一共两步,以父之名创建对象,创建子类
11. 匿名内部类是为了简化代码,调用方法简便一些。注意当给匿名内部类起名字时,用该名字调用方法时,不能调用子类特有方法。
12. 因为子类对象属于父类对象,所以子类对象的类型既可以是子类类型,也可以是父类类型.
13. 类.方法1.非静态方法2 说明第一个方法是类中静态成员,调用完第一个方法后能够再调用第二个非静态方法,说明调用完第一个方法后返回了一个方法2所在的类/接口的对象(注意:为了提高程序的扩展性,这里的类和接口都指的是父类和接口,虽然接口无法创建对象,不过无所谓我们只是以父之名获得创建对象的权利并没有真正创建接口的对象). 若这个对象是个子类对象,那么返回值类型既可以是子类类型,也可以是父类类型.
14. 对象也是有类型的,它的类就是它的对象的类型.根据类Inner创建的所有对象在类型上都是统一的,都是Inner类型的,反过来, inner类型的对象,就是指根据inner创建的对象。关键一句话:由inner创建的对象就是inner类型的,inner类型的对象就是由inner创建的对象。也可以把有inner创建的对象,叫做类类型对象,表明该对象是由类创建的,由接口创建的对象叫做接口类型对象,当然这只是个说法。
15. 注意父类对象和接口对象的扩展性。
16. show(Inter in)
当把参数类型定义为接口时,就意味着可以接受所有子类对象
当参数类型定义为父类时,就意味着既可以接收父类对象,也可以接受子类对象
当你需要接收各种子类的对象时,你可以直接把参数类型设置为父类或接口。
bythe way:子类对象也有匿名子类对象=匿名内部类
17. 问:没有创建父类和接口的时候,还可以建立匿名内部类或者匿名子类对象。
可以:Class Object是所有类的直接父类和间接父类。一个无处不在的父类。
毕向东 Java基础视频教程09天05面向对象(异常概述)
1. 把问题封装成对象就是异常.
2. 严重的用class Error描述不可治愈 一般不编写针对性代码处理
不严重的用class Exception描述 可治愈使用针对性处理方式处理。
3. 类型转换异常,数组角标越界异常,空指针异常。
4. 1M=1024 K 1K=1024个字节
5. Throwable是java中所有错误或异常的超类。
毕向东 Java基础视频教程09天06面向对象(异常try-catch)
1.用异常对象调用getMessage 获取异常的信息(属于Throwable)
2.异常对象调用toString() 异常名称:异常信息(属于Throwable)
3.用异常对象调用printStackTrace() 没有返回值,不要放在输出语句,直接调用后它自动打印 异常名称,异常信息,异常出现的位置。
4.jvm默认的异常处理机制就是通过异常对象调用printStackTrace,打印异常在堆栈中的跟踪信息。
5.try //检测异常对象 然后抛给catch
{主函数中出现异常的代码}
catch(Exception e)
{处理方法}
finally
{一定会执行的语句}
毕向东 Java基础视频教程09天0708面向对象(异常声明throws 多异常)
1.jvm默认的异常处理机制就是调用printStackTrace(),打印异常在堆栈中的跟踪信息。
classDemo
{
int div(int x,int y)throws Exception
{
return x/y;
}
}
class ExceptionDemo1
{
public static void main(String[] args)
{ Demod=new Demo();
try
{
int x=d.div(4,0);
}
catch (Exception e)
{
System.out.println(e.toString());
}
System.out.println("over");
}
}
问题:为什么是抛出exception而不是arithmeticException
3. 只要申明抛出异常,要么throws,要么catch
4. 方法一旦产生异常,方法下面的就不再执行了.
5. 声明几个异常,就对应有几个catch块。
6. 父类异常catch块放在最下面
7. 真发生问题是不打印的,而是将异常信息记录在硬盘文件里,异常日志文件,有网站维护人员每天去看这个日志并处理。
毕向东 Java基础视频教程09天09面向对象(自定义异常)
1. 特有问题自定义封装异常
2. 自定义异常类,new对象,抛出
3. 函数内部throw 异常,要么内部trycatch,要么在函数上声明抛出异常。
4. private的成员在本类中可以访问和操作,被继承后就不可以了,子类构造函数里如果没有自己指定到父类构造函数初始化,系统会自动加上super(),到父类空参数构造函数进行初始化。
6. 不要犯低级错误,不是返回到主函数中什么,最终就会显示什么,你不打印就算返回给主函数东西它显示个毛啊.
7. 在本类之中不仅可以对private的属性进行赋值还可以return。还在子类之中不能对父类中私有的属性赋值,但是可以return私有属性。
8. 如何定义异常类和异常信息:只需要在自定义的异常类(extends Exception)中自定义构造函数,然后执行super(),因为父类已经将异常信息的操作都做好了,然后在构造异常对象时将异常信息作为参数传给构造函数就行了。
9. 也可以在自定义异常类中在自定义成员变量和特有方法。
10. 只有throwable体系中的类对象才具有可抛性。
毕向东 Java基础视频教程09天10,11面向对象(throw和throws的区别 runtime Exception)
1. 特殊的子类异常RuntimeException:如果在函数内抛出该异常,在函数上可以不声明,如果在函数上申明了,也可以不处理该异常,编译一样通过。
2. 抛出异常的方法如果没有调用,是不会出现编译和运行错误的.
3. runtimeexception之所以不声明,是因为不想被调用者处理,希望程序运行时停掉,对代码进行修正。
4. 常见runtimexception:nullPointerException IndexOutOfBoundsException
5. equals除了可以判断两个对象地址是否相同还可以判断两个字符串是否相同,也可以判断一个字符串和null进行比较,null表示没有具体地字符串值,他们之间可以比较。
如public voidcheckName(String name)
{
if(name.equals(“Lisi”))
System.out.println(“Yes”);
}
6. 类类型变量也即引用变量,String本身也是个类。
7. 当对象不存在时调用其方法就会产生空指针异常。
8. String s=null; s 不指向任何对象,在内存中没有开辟内存空间,字符串s没有具体的值,但是s的值是null,而空字符串是一个实实在在的字符串,就像数字0也是个实实在在的数字一样。
9. String s=”a” 和String s=newString(“a”) 两者本质不同,前者在栈内存中分配空间,后者在对内存中分配空间。不过都是用引用变量s去指向。
10. class Person
{
public void checkName(String name)
if(name.equals(“Lisi”))改为if(“Lisi”equals(name))或者if(name!=null&&name.equals(“Lisi”))
System.out.println(“Yes”);
else
System.out.println(“No”);
}
main()
{
Person p=new Person();
p.checkName(null)
}
这里name代表一个空对象,而空对象调用其方法会出现NullPointerException,为了避免传入值是null时出现NPE,对程序作如上红字修改,这样即便输入值是null,还是会显示No.
11. 自定义异常时,如果该异常发生时,无法继续进行运算,就得把程序停掉,所以需要将它extends RuntimeException 而非runtimeexception一抛出就必须要处理,处理完程序会继续运行,它不会完全影响运算。而runtimeexception一发生运算是无法进行下去的,必须让程序停下来。e instance of RuntimeException两种读法:e指向/是Runtimeexception对象
毕向东 Java基础视频教程09天12面向对象(异常练习)
1. 对于exception,出现之后进行处理,处理完还能够继续正常运行下去,而runtimeexception,一旦发生程序就不能正常运行下去了。
2. throw就是函数/方法的结束标示,类似于return,它一出现该方法就执行到此为止。
3. 主程序运行完一切就完了,就算我调用了某个对象的方法,方法没运行完也算了。
4. 在throw new 一个自定义异常时要传递参数
5. catch下面的东西是会继续执行的
6. 在自己类中调用自己方法和属性变量不需要写出对象,因为默认this.
---------------------- <a href="http://edu.csdn.net/heima" target="blank">android培训</a>、<a href="http://edu.csdn.net/heima" target="blank">java培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://edu.csdn.net/heima" target="blank">http://edu.csdn.net/heima</a>