一、内部类简介
内部类:类内部的类
内部类,属于Java面向对象中,最高级级别的东西(绝大多数情况下,面试问的多,实际用的少)
四种内部类
成员内部类(注意),静态内部类,局部内部类,匿名内部类(注意)
二、兄弟类
在一个Java文件中,以并列的方式,定义类
但是要注意:兄弟类的访问修饰符,是采用的默认
只能在本包或本类中使用
package com.woniuxy.java22.study;
/**
* 内部类的讲解
* @author Administrator
*
*/
public class Person {
}
/**
* 兄弟类
* @author Administrator
*
*/
class Dog{
}
/**
* 兄弟类
* @author Administrator
*
*/
class Cat{
}
三、成员内部类(注意)
成员内部类,就是某一个类,是当前的类的成员之一
此时内部类和类之间的关系:组合(部分跟整体的关系)
当前内部类和类的耦合关系,非常的高
eg: 人 (头,躯干,四肢)
package com.woniuxy.java22.study;
/**
* 内部类的讲解
* @author Administrator
*
*/
public class Person {
private String name;
/**
* 人的头
* @author Administrator
*
*/
class Head {
/**
* 头的大小
*/
private int size;
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
@Override
public String toString() {
return "Head [size=" + size + "]";
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* 兄弟类
* @author Administrator
*
*/
class Dog{
}
/**
* 兄弟类
* @author Administrator
*
*/
class Cat{
}
package com.woniuxy.java22.study;
import com.woniuxy.java22.study.Person.Head;
public class MainEnter {
public static void main(String[] args) {
// TODO Auto-generated method stub
//定义人
Person person = new Person();
person.setName("张三");
//---------------------------------------
//成员内部类的用法
//---------------------------------------
Head head = person.new Head();
head.setSize(20);//人的头的大小
}
}
四、静态内部类
静态内部类 和成员内部类一样,都是类中的一部分。区别在于:成员内部类 在定义时,没有使用static,而静态内部类使用static定义
package com.woniuxy.java23.study;
/**
* 内部类的讲解
* @author Administrator
*
*/
public class Person {
private String name;
/**
* 静态内部类(了解)
*
* 注意:静态内部类内部, 不能使用外部类的非静态成员
* 但是可以使用静态成员
*
* Person$StaticInner.class
* @author Administrator
*
*/
static class StaticInner{
private String staticName;
public void meth01() {
// name = "";
System.out.println("我是一个静态内部类");
}
public String getStaticName() {
return staticName;
}
public void setStaticName(String staticName) {
this.staticName = staticName;
}
}
/**
* 成员内部类
* Person$Head.class
* 人的头
* @author Administrator
*
*/
class Head {
/**
* 头的大小
*/
private int size;
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
@Override
public String toString() {
return "Head [size=" + size + "]";
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* 兄弟类
* @author Administrator
*
*/
class Dog{
}
/**
* 兄弟类
* @author Administrator
*
*/
class Cat{
}
五、局部内部类
成员内部类和静态内部类,都是定义在方法之外,接下来的局部内部类和匿名内部类都是定义在方法内部的类
局部内部类是在类的方法内部定义的类。局部内部类只能在方法内部中使用。一旦方法执行完毕,局部内部类就会从内存中被清除。
public class Person {
private String name;
/**
* 局部内部类
*/
public void breath() {
/**
* 定义在方法内部的类
* 该类的作用范围,只在方法内部有效
Person$1O2.class
* @author Administrator
*
*/
class O2{
/**
* 氧气的状态(1液氧,2汽氧)
*/
private int type;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
}
//局部内部类的实例,也是在方法的内部
O2 o2 = new O2();
o2.setType(1);
}
}
局部内部类的命名方式: 外部类$编号 局部内部类的名称.class
六、匿名内部类(注意)
匿名内部类 是局部内部类中的一个特例,但是它的特点是:
1、它没有名字
2、类的类定义,类的实例化是在同一个地方
package com.woniuxy.java23.study;
/**
* 内部类的讲解
* @author Administrator
*
*/
public class Person {
private String name;
/**
* 回家
* @param driver
*/
public void goHome(Driverable driver) {
driver.driver();
driver.stop();
}
public void eat() {
/**
* Person$2Water.class
* @author Administrator
*
*/
class Water{
}
}
/**
* 局部内部类
*/
public void breath() {
/**
* 定义在方法内部的类
* 该类的作用范围,只在方法内部有效
* Person$1O2.class
* @author Administrator
*
*/
class O2{
/**
* 氧气的状态(1液氧,2汽氧)
*/
private int type;
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
}
//局部内部类的实例,也是在方法的内部
O2 o2 = new O2();
o2.setType(1);
/**
* Person$1Water.class
* @author Administrator
*
*/
class Water{
}
}
/**
* 静态内部类(了解)
*
* 注意:静态内部类内部, 不能使用外部类的非静态成员
* 但是可以使用静态成员
*
* Person$StaticInner.class
* @author Administrator
*
*/
static class StaticInner{
private String staticName;
public void meth01() {
// name = "";
System.out.println("我是一个静态内部类");
}
public String getStaticName() {
return staticName;
}
public void setStaticName(String staticName) {
this.staticName = staticName;
}
}
/**
* 成员内部类
* Person$Head.class
* 人的头
* @author Administrator
*
*/
class Head {
/**
* 头的大小
*/
private int size;
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
@Override
public String toString() {
return "Head [size=" + size + "]";
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
/**
* 兄弟类
* @author Administrator
*
*/
class Dog{
}
/**
* 兄弟类
* @author Administrator
*
*/
class Cat{
}
package com.woniuxy.java23.study;
import com.woniuxy.java23.study.Person.Head;
public class MainEnter {
public static void main(String[] args) {
// TODO Auto-generated method stub
//定义人
Person person = new Person();
person.setName("张三");
//---------------------------------------
//成员内部类的用法
//---------------------------------------
Head head = person.new Head();
head.setSize(20);//人的头的大小
//---------------------------------------
//静态内部类的用法
//---------------------------------------
Person.StaticInner inner = new Person.StaticInner();
inner.meth01();
//---------------------------------------
//局部内部类的用法
//---------------------------------------
person.breath();
//匿名内部类(类是没有名字的,即在定义类,又在实例化类)
person.goHome(new Driverable() {
@Override
public void driver() {
// TODO Auto-generated method stub
System.out.println("开车回家!!!!");
}
@Override
public void stop() {
// TODO Auto-generated method stub
System.out.println("我停下来了!!!");
}
});
}
}
匿名内部类(2):
package com.woniuxy.java23.study;
public class Student implements Comparable<Student>{
private String name;
private int age;
private int gender;
public Student(String name, int age, int gender) {
super();
this.name = name;
this.age = age;
this.gender = gender;
}
public Student() {
super();
// TODO Auto-generated constructor stub
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public int getGender() {
return gender;
}
public void setGender(int gender) {
this.gender = gender;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", gender=" + gender + "]";
}
@Override
public int compareTo(Student o) {
// TODO Auto-generated method stub
return this.age - o.age;
}
}
package com.woniuxy.java23.study;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import com.woniuxy.java23.study.Person.Head;
public class MainEnter {
public static void main(String[] args) {
// TODO Auto-generated method stub
// study01();
study02();
}
private static void study02() {
// TODO Auto-generated method stub
Student stu = new Student("张三", 12, -1);
Student stu2 = new Student("李四", 32, 1);
Student stu3 = new Student("王五", 23, 0);
Student stu4 = new Student("赵六", 45, 1);
Student stu5 = new Student("田七", 13, 0);
List<Student> stus = new ArrayList<Student>();
Collections.addAll(stus, stu,stu2,stu3,stu4,stu5);
//默认升序
Collections.sort(stus);
//降序(匿名内部类)
Collections.sort(stus, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
// TODO Auto-generated method stub
return o1.getGender() - o2.getGender() ;
}
});
System.out.println(stus);
}
private static void study01() {
// TODO Auto-generated method stub
// 定义人
Person person = new Person();
person.setName("张三");
// ---------------------------------------
// 成员内部类的用法
// ---------------------------------------
Head head = person.new Head();
head.setSize(20);// 人的头的大小
// ---------------------------------------
// 静态内部类的用法
// ---------------------------------------
Person.StaticInner inner = new Person.StaticInner();
inner.meth01();
// ---------------------------------------
// 局部内部类的用法
// ---------------------------------------
person.breath();
// 匿名内部类(类是没有名字的,即在定义类,又在实例化类)
person.goHome(new Driverable() {
@Override
public void driver() {
// TODO Auto-generated method stub
System.out.println("开车回家!!!!");
}
@Override
public void stop() {
// TODO Auto-generated method stub
System.out.println("我停下来了!!!");
}
});
}
}