一.概述
Outer.java
package Test;
//外部类
public class Outer {
public static int a=100;
private String hobby;
// 学习静态成员内部类
public static class Inner{
private String name;
private int age;
public static String schoolName;
public void show(){
System.out.println("名称:"+name);
System.out.println(a);
}
public Inner(){
}
public Inner(String name, int age) {
this.name = name;
this.age = age;
}
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 static String getSchoolName() {
return schoolName;
}
public static void setSchoolName(String schoolName) {
Inner.schoolName = schoolName;
}
}
}
test.java
package Test;
public class Test {
public static void main(String[] args){
Outer.Inner in=new Outer.Inner();
in.setName("张三");
in.show();
}
}
成员内部类
内部类不能写static变量和方法,只有外部类可以
test.java
package Test;
public class Test {
public static void main(String[] args){
Outer.Inner in=new Outer().new Inner();
in.setName("内部");
in.show();
// Outer.Inner.test();
}
}
Outer.java
package Test;
//外部类
public class Outer {
public static int num=111;
// 成员内部类:不能加static修饰 属于外部类对象的
public class Inner{
private String name;
private int age;
// public static void test(){
// System.out.println(a);
// }
public void show(){
System.out.println("名称:"+name+num);
}
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;
}
}
}
内部类访问外部类的参数
package Test;
public class Test2 {
public static void main(String args[]){
People.Heart heart=new People().new Heart();
heart.show();
}
}
class People{
private int heartbeat=150;
// 成员内部类
public class Heart{
private int heartbeat=110;
public void show(){
int heartbeat=78;
System.out.println(heartbeat);//78
System.out.println(this.heartbeat);//110
System.out.println(People.this.heartbeat);//150
}
}
}
局部内部类
package Test;
public class Test {
static {
class Dog{
}
abstract class Animal{
}
interface SportManInter{
}
}
public static void main(String[] args){
class Cat{
private String name;
public static int onLineNumber=100;
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
}
Cat c=new Cat();
c.setName("叮当响");
}
}
二.匿名内部类
概述
package Test;
//目标:学习匿名内部类的形式和特点
public class Test {
public static void main(String[] args){
// 这里是匿名内部类
Animal a=new Animal(){
@Override
public void run(){
System.out.println("老虎跑的快");
}
};
a.run();
}
}
//class Tiger extends Animal{
// @Override
// public void run() {
// System.out.println("老虎跑的快");
// }
//}
abstract class Animal{//抽象类不能创建对象
public abstract void run();
}
匿名内部类的使用
package Test;
//目标:掌握匿名内部类的使用形式(语法)
public class Test2 {
public static void main(String[] args) {
Swimming s=new Swimming(){
@Override
public void swim(){
System.out.println("学生快乐的自由泳");
}
};
go(s);
System.out.println("-----------------");
Swimming s1=new Swimming(){
@Override
public void swim(){
System.out.println("老师泳游的贼快");
}
};
go(s1);
System.out.println("-----------------");
// 第二种写法
go(new Swimming(){
@Override
public void swim(){
System.out.println("运动员游的很快");
}
});
}
/**
* 学生 老师 运动员可以一起参加游泳比赛
*/
public static void go(Swimming s){
System.out.println("开始");
s.swim();
System.out.println("结束");
}
}
class Student implements Swimming{
@Override
public void swim(){
System.out.println("学生快乐的自由泳");
}
}
interface Swimming{
void swim();
}
案例
package Test;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
//目标:通过GUI编程 理解匿名内部类的真实使用场景
public class Test2 {
public static void main(String[] args) {
// 1.创建窗口
JFrame win=new JFrame("登录界面");
JPanel panel=new JPanel();
win.add(panel);
// 2.创建一个按钮对象
JButton btn=new JButton("登录");
// 注意:讲解匿名内部类的使用
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JOptionPane.showMessageDialog(win,"点我以下,说明爱我");
}
});
btn.addActionListener(e -> JOptionPane.showMessageDialog(win,"别说话,吻我"));
// 3.把按钮对象添加到桌面上展示
panel.add(btn);
// 4.展示窗口
win.setSize(400,300);
win.setLocationRelativeTo(null);
win.setVisible(true);
}
}