Java开发必备点12_内部类和Objiect类

内部类 和 Objiect类

内部类

概念
概念:在一个类内部定义一个完整的类
特点:每一个类都会生成一个单独的 .class 文件
语法:
class  外部类类名{
	class 内部类类名{

	}
}
案例:
package cn.baizhi.day13;

public class Demo {

}

//定义外部类

class  Outer{
	
	//定义内部类
	class Inner{
		
	}
}
内部类的分类
成员内部类
静态内部类
局部内部类
匿名内部类
成员内部类
位置:外部类的成员位置 和成员方法成员变量并列
特点:可以访问外部类的私有成员而不破坏封装
案例:
package cn.baizhi.day13;

public class Demo {

}

//定义外部类

class  Outer{
	private int a = 10;//实例变量
	//定义内部类
	//成员内部类
	class Inner{
		
		//内部类的方法
		public void m1() {
			System.out.println(a);
		}
	}
}

创建内部类的对象
第一步:创建外部类的对象
第二步:通过外部类的对象创建内部类的对象

案例:
package cn.baizhi.day13;

public class Demo {
	public static void main(String[] args) {
		//1  创建外部类的对象
		Outer outer = new Outer();
		//2.通过外部类的对象创建内部类的对象
		Outer.Inner inner = outer.new Inner();
		inner.m1();
	}
}

//定义外部类

class  Outer{
	private int a = 10;//实例变量
	static int b = 20;//静态变量 类变量
	//定义内部类
	//成员内部类
	class Inner{
		//int a = 250;
		int c = 30;
		//内部类的方法
		public void m1() {
			System.out.println(a);//10
			System.out.println(b);//20
			System.out.println(c);//30
		}
	}
}


当内部类存在和外部类成员变量重名问题 通过 外部类.this  访问外部类的属性
this.   代表的是本类的引用
外部类.this.  代表的是外部类的引用
案例:
package cn.baizhi.day13;

public class Demo {
	public static void main(String[] args) {
		//1  创建外部类的对象
		Outer outer = new Outer();
		//2.通过外部类的对象创建内部类的对象
		Outer.Inner inner = outer.new Inner();
		inner.m1();
	}
}

//定义外部类

class  Outer{
	private int a = 10;//实例变量
	static int b = 20;//静态变量 类变量
	//定义内部类
	//成员内部类
	class Inner{
		int a = 250;//内部类的成员变量
		int c = 30;
		//内部类的方法
		public void m1() {
			int a = 360;//内部类局部变量
			System.out.println(a);//360
			System.out.println(this.a);//250
			System.out.println(Outer.this.a);//10
			System.out.println(b);//20
			System.out.println(c);//30
		}
	}
}


注意:不能在成员内部类中创建静态成员
案例
package cn.baizhi.day13;

public class Demo {
	public static void main(String[] args) {
		//1  创建外部类的对象
		Outer outer = new Outer();
		//2.通过外部类的对象创建内部类的对象
		Outer.Inner inner = outer.new Inner();
		inner.m1();
	}
}

//定义外部类

class  Outer{
	private int a = 10;//实例变量
	static int b = 20;//静态变量 类变量
	//定义内部类
	//成员内部类
	class Inner{
		int a = 250;//内部类的成员变量
		int c = 30;
		//static int d = 30;//不可以创建内部类的静态成员
		//内部类的方法
		public void m1() {
			int a = 360;//内部类局部变量
			System.out.println(a);//360
			System.out.println(this.a);//250
			System.out.println(Outer.this.a);//10
			System.out.println(b);//20
			System.out.println(c);//30
		}
	}
}

静态内部类
位置:在外部类中 和静态的成员并列
语法:
static class 类名{
}

案例:静态内部类中不能访问外部类非静态的成员
//定义外部类

class  Outer{
	int a = 10;//实例变量
	static int b = 20;//静态变量
	//静态内部类
	static class Inner{
		
		public void m1() {
			//System.out.println(a);//静态内部类中不能访问外部类非静态的成员
			System.out.println(b);
		}
	}
}
==================================================================
创建静态内部类的对象
访问静态内部类中的静态成员可以通过 外部类类名.内部类类名.静态成员
语法:外部类类名.内部类类名  对象名 = new 外部类.内部类();
案例:
package cn.baizhi.day13;

public class Demo {
	public static void main(String[] args) {
		//创建静态内部类的对象
		/*Outer.Inner inner = new Outer.Inner();
		inner.m1();*/
		
		System.out.println(Outer.Inner.d);
	}
}

//定义外部类

class  Outer{
	int a = 10;//实例变量
	static int b = 20;//静态变量
	//静态内部类
	static class Inner{
		//int a = 20;
		int c = 30;
		static int b = 250;
		static int d = 40;
		public void m1() {
			
			//System.out.println(a);//静态内部类中不能访问外部类非静态的成员
			System.out.println(Outer.b);
			System.out.println(c);
			System.out.println(d);
		}
	}
}

局部内部类
位置: 在外部类的方法中定义局部内部类
语法:
//定义外部类
class  Outer{
	
	public void m1() {
		//定义局部内部类
		class Inner{
			
		}
	}
	
}

特点:在局部内部类中可以访问外部类中的成员
案例:
//定义外部类
class  Outer{
	int a = 10;
	static int b =20;
	public void m1() {
		//定义局部内部类
		class Inner{
			public void m2() {
				System.out.println(a);
				System.out.println(b);
			}
		}
	}
	
}

创建局部内部类的对象
注意:局部内部类的对象只能在它所在的方法中创建
案例:
package cn.baizhi.day13;

public class Demo {
	public static void main(String[] args) {
		Outer outer = new Outer();
		outer.m1();
	}
}


//定义外部类
class  Outer{
	int a = 10;
	static int b =20;
	public void m1() {
		//定义局部内部类
		class Inner{
			public void m2() {
				System.out.println(a);
				System.out.println(b);
			}
		}
		
		//创建局部内部类的对象
		Inner inner  = new Inner();
		inner.m2();
	}
	
}


注意:局部内部类访问外部类的局部变量 要求这个局部变量必须是final修饰的 在jdk7中必须加final  jdk8可以不加但是默认是final
案例:
package cn.baizhi.day13;

public class Demo {
	public static void main(String[] args) {
		Outer outer = new Outer();
		outer.m1();
	}
}


//定义外部类
class  Outer{
	int a = 10;
	static int b =20;
	public void m1() {
		final int c = 30;
		//定义局部内部类
		class Inner{
			public void m2() {
				System.out.println(a);
				System.out.println(b);
				System.out.println(c);
			}
		}
		//创建局部内部类的对象
		Inner inner  = new Inner();
		inner.m2();
		
	}
	
}


案例:
学生可以通过学校选择老师 如果输入偶数 返回一个老师   刘洋  如果奇数 返回高健

代码:
package cn.baizhi.day13;

import java.util.Scanner;

public class Student {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入一个整数选择老师:");
		int a = scanner.nextInt();
		Teacher teacher = School.getTeacher(a);
		teacher.teach();
	}
}


//定义一个教学的接口
interface Teacher{
	public void teach() ;
}

//定义一个刘洋类
class LiuYang implements Teacher{
	@Override
	public void teach() {
		System.out.println("刘洋教Java");
	}
	
}

//定义一个高健类
class GaoJian implements Teacher{
	@Override
	public void teach() {
		System.out.println("高健教 抽烟 喝酒 烫头");
		
	}
}

//定义一个学校类
class  School{
	public static Teacher getTeacher(int a) {
		if (a%2==0) {
			return new LiuYang();
		} else {
			return new GaoJian();
		}
	}
}


案例的问题  学生可以不通过学校获得老师  
改进后: 学生必须通过学校才能得到老师   实现了 强制弱耦合
案例:
package cn.baizhi.day13;

import java.util.Scanner;

public class Student {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入一个整数选择老师:");
		int a = scanner.nextInt();
		Teacher teacher = School.getTeacher(a);
		teacher.teach();
		/*LiuYang liuYang = new LiuYang();
		liuYang.teach();*/
	}
}


//定义一个教学的接口
interface Teacher{
	public void teach() ;
}



//定义一个学校类
class  School{
	public static Teacher getTeacher(int a) {
		//定义一个刘洋类
		class LiuYang implements Teacher{
			@Override
			public void teach() {
				System.out.println("刘洋教Java");
			}
			
		}

		//定义一个高健类
		class GaoJian implements Teacher{
			@Override
			public void teach() {
				System.out.println("高健教 抽烟 喝酒 烫头");
				
			}
		}
		if (a%2==0) {
			return new Teacher();
		} else {
			return new GaoJian();
		}
	}
}

匿名内部类
概念:特殊的局部内部类
要求:必须继承一个类 或者实现一个接口
特点:一个匿名内部类只能创建一个对象
案例:
package cn.baizhi.day13;

import java.util.Scanner;

public class Student {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		System.out.println("请输入一个整数选择老师:");
		int a = scanner.nextInt();
		Teacher teacher = School.getTeacher(a);
		teacher.teach();
		/*LiuYang liuYang = new LiuYang();
		liuYang.teach();*/
	}
}


//定义一个教学的接口
interface Teacher{
	public void teach() ;
}



//定义一个学校类
class  School{
	public static Teacher getTeacher(int a) {

		if (a%2==0) {
			return new Teacher() {
				public void teach() {
					System.out.println("刘洋教java");
				}
			};
		} else {
			return new Teacher() {
				public void teach() {
					System.out.println("高健 抽烟 喝酒 烫头");
					
				}
			};
		}
	}
}

Object 类

finalize()
垃圾:在内存中没有引用指向的对象。。数据
垃圾回收:释放内存空间 将没有用的数据清除掉
手动回收:需要调用System.gc() 当垃圾回收器处于空闲状态  就会回收垃圾 通知垃圾回收器  不一定管用
自动回收:当内存中的垃圾太多 将满了的时候会自动触发垃圾回收机制
protected void finalize()
案例:
package cn.baizhi.day13;

public class Demo1 {
	public static void main(String[] args) {
		//创建一个动物类对象
		/*Animal animal =  new Animal();
		animal = null;*/
		
		//手动通知
		//System.gc();
		
		for (int i = 0; i < 100000000; i++) {
			new Animal();
		}
	}
}

class Animal{
	String name;
	int age;
	@Override
	protected void finalize(){
		System.out.println("垃圾回收被调用了");
	}
	
}

getClass()
判断引用中存放的对象的类型
案例:
package cn.baizhi.day13;

public class Demo1 {
	public static void main(String[] args) {
		/*Dog dog = new Dog();
		Cat cat = new Cat();*/
		Animal animal1 = new Dog();
		Animal animal2 = new Dog();
		
		System.out.println(animal1.getClass()==animal2.getClass());
	}
}

class Animal{
	String name;
	int age;
	
}


class Dog extends Animal{
	
}

class Cat extends Animal{
	
}
toString()
案例:
package cn.baizhi.day13;

public class Demo1 {
	public static void main(String[] args) {
		S1 s1 = new S1("刘洋", 17);
		System.out.println(s1);
	}
}

class S1 extends Object{
	String name;
	int age;
	
	public S1(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	@Override
	public String toString() {
		return "S1 [name=" + name + ", age=" + age + "]";
	}
}



equals
public boolean equals(Object obj)
判断两个对象是否相等 this 和  obj 进行对比
案例:
package cn.baizhi.day13;

public class Demo1 {
	public static void main(String[] args) {
		Person person1 = new Person("刘洋", 17);
		Person person2 = new Person("高健", 250);
		Person person3 = new Person("刘洋", 17);
		
		//System.out.println(person1==person2);
		System.out.println(person1==person3);
		System.out.println(person1.equals(person2));
	}
}

class Person{
	String name;
	int age;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	
	/*public boolean equals(Object obj) {
		//向下转型
		Person person = (Person)obj;
        //姓名相同  年龄相同  同一个人
		if (this.name.equals(person.name)&&this.age==person.age) {
			return true;
		} else {
			return false;
		}
    }*/
	
	
	
}


总结
Object:是所有类的父类 超类  基类 
Object类型的引用可以存放任何类型的对象

Object中的方法需要自己写写 具有自己手写的能力

重点:掌握 toString()equals()  至少10遍 

b/s  浏览器 和 服务器
c/s  客户端  和  服务器
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值