java个人学习笔记13(Object+内部类+局部内部类+匿名内部类)

来源:互联网 发布:自定义端口范围 编辑:程序博客网 时间:2024/05/22 17:22

1.查看源代码:java->jdk->src.zip

2.Object

/**Object:java中最终的父类,即根类public boolean equals(Object obj)该类中定义了一些成员方法,包括equals,现重写equals方法*/class Person /*extends Object*/{private String name;private int age;Person(String name,int age){this.name = name;this.age = age;}//构造函数public boolean equals(Object obj){if(!(obj instanceof Person))//对obj的类型进行判断throw new ClassCastException("类型错误");if(this == obj)return true;//提高效率,不用后续的判断Person obj1 = (Person) obj;//向下转型,方能调用子类特有的属性return (this.name.equals(obj1.name)) && (this.age == obj1.age);//String是一个类,其中定义了equals方法,用于字符串的比较,就不要使用“==”}}class PersonDemo{public static void main(String[] args) {Person p1 = new Person("xiao ming",20);Person p2 = new Person("xiao ming",20);System.out.println(p1.equals(p2));//判断对象的内容是否相同System.out.println(p1==p2);//判断对象的引用是否相同,即是否是指向同一个对象}}

3.内部类

/**内部类:将类定义到了另一个类的内部即:A类要直接访问B类中的成员时,可以将A类定义到B类中,作为B类的内部类存在访问规则:内部类可以直接访问外部类的成员外部类只能通过创建内部类的对象进行访问,一旦内部类私有化后,外部类无法访问内部类了*/class Outer{//外部类private int num = 1;private static int num1 = 2;//静态类访问静态变量class Inner{//非静态、非私有内部类static final int CONS = 0;//非静态类中只能定义静态常量,不能定义其他静态成员void show(){System.out.println(num);}}static class Inner1{//静态、非私有内部类void show(){//非静态成员方法System.out.println(num1);}static void show1(){//静态成员方法System.out.println(num1);}}public void visitInner(){new Inner().show();}//创建内部类的对象进行访问内部类成员}class ClassDemo{public static void main(String[] args) {/***********非静态、非私有的内部类访问1************************************************Outer o = new Outer();o.visitInner();************非静态、非私有的内部类访问2************************************************Outer.Inner in = new Outer().new Inner();//类型为Outer.Inner内部类类型,创建外部类对象.创建内部类对象in.show();************静态、非私有的内部类访问非静态成员******************************************Outer.Inner1 in = new Outer.Inner1();//没有创建外部类对象,创建了内部类对象in.show();************静态、非私有的内部类访问静态成员********************************************/Outer.Inner1.show1();//无需创建外部或内部类的对象,直接用内部类名的方式使用}}
4.为什么内部类可以直接访问外部类的成员?

因为内部类持有了外部类的引用:(若外部类、内部类和局部有同名变量num)

访问外部类成员:Outer.this.num

访问内部类成员:Inner.this.num

访问局部变量:num

5.局部内部类

class Outer{private int num = 1;public void method(){final int x = 5;//局部内部类只能访问被final修饰的局部变量,因为内部类与局部变量的生命周期不同//有可能当method方法弹栈后,局部变量x已不存在,但是局部内部类对象的引用仍然存在//即局部内部类的对象仍然存在于内存中,此时再调用x就有问题了,所以。。。class Inner{//局部内部类void show(){System.out.println("x= "+x);System.out.println("num= "+num);}}Inner in = new Inner();in.show();}}class Demo{public static void main(String[] args) {Outer o = new Outer();o.method();}}

6.匿名内部类:简化书写的内部类

前提:内部类需要继承或者实现外部的类或接口

格式:new 父类or接口() {子类的内容}

实质:匿名内部类其实就是一个子类对象

练习一:

abstract class Father{abstract void show();}class Outer{private int num = 4;public void method(){new Father(){//Father是抽象类不能建立对象,此处实际上是建立了一个父类的子类对象public void show(){System.out.println(num);}//覆盖抽象类中抽象方法show()}.show();//匿名内部类调用show()}}class Demo{public static void main(String[] args) {new Outer().method();}}
练习二:
interface Inner{abstract void show1();abstract void show2();}class Outer{private int num = 4;public void method(){Inner in = new Inner(){//匿名内部类实质是一个子类对象,此处为多态,向上转型为Innerpublic void show1(){System.out.println("show1.."+num);}public void show2(){System.out.println("show2.."+num);}};in.show1();in.show2();}}class Demo1{public static void main(String[] args) {new Outer().method();}}
注意上述两种方法的区别:

class Outer{public void method(){new Object(){public void show(){System.out.println("Object的子类对象");}}.show();//子类对象调用show()}}/*class Outer{public void method(){Object in = new Object(){public void show(){System.out.println("Object的子类对象向上转型为Object");}};in.show();//错误,in为多态Object型对象不能调用子类的特有方法}}*/class Demo2{public static void main(String[] args) {new Outer().method();}}





0 0
原创粉丝点击