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

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(){//匿名内部类实质是一个子类对象,此处为多态,向上转型为Inner
			public 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值