Java
内部类
1、内部类的概述
2、内部类之一:静态内部类(了解)
1、什么是静态内部类?
2、静态内部类的访问拓展
package b1_内部类_静态内部类;
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 Inner() {
}
public Inner(String name, int age) {
this.name = name;
this.age = age;
}
public void show(){
System.out.println("名称:" + name);
System.out.println(a);
//System.out.println(hobby);无法访问,报错
}
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 b1_内部类_静态内部类;
public class Test {
public static void main(String[] args){
Outer.Inner in = new Outer.Inner();
in.setName("离散");
in.show();
}
}
3、总结
3、内部类之二:成员内部类(了解)
1、什么是成员内部类?
2、成员内部类的访问拓展
package b2_内部类_成员内部类;
public class Outer {
public static int num = 111;
private String hobby ;
public Outer(){
};
public Outer(String hobby) {
this.hobby = hobby;
}
//成员内部类,不加static修饰
public class Inner {
private String name;
private int age;
// public static void test(){
//
// }//JDK16开始支持静态方法
public void show() {
System.out.println(name + "很厉害!!" + age + "岁不错");
System.out.println("数量" + num);
System.out.println("爱好" + hobby);
}
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 int a;//JDK16开始支持静态成员
}
}
package b2_内部类_成员内部类;
public class Test {
public static void main(String[] args) {
Outer.Inner in = new Outer().new Inner();
in.setName("萧炎");
in.setAge(55);
in.show();
//Outer.Inner.test();//访问静态方法
System.out.println("----------------");
Outer.Inner in1 = new Outer("爱听课!").new Inner();
in1.setName("熏儿");
in1.setAge(18);
in1.show();
}
}
3、总结
4、面试题
代码
package b2_内部类_成员内部类;
//面试题
public class Test2 {
public static void main(String[] args) {
People.Heart H = new People().new Heart();
H.show();
}
}
class People{
private int heartbeat = 150;
public class Heart{
private int heartbeat = 110;
public void show(){
int heartbeat = 70;
System.out.println(heartbeat);
System.out.println(this.heartbeat);
System.out.println(People.this.heartbeat);
}
}
}
4、内部类之三:局部内部类(了解)
package b3_内部类_局部内部类;
import 抽象类案例.Card;
//了解局部内部类
public class Test {
static{
class Dog{
}
abstract class Animal{
}
}
public static void main(String[] args) {
class Cat {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Cat c = new Cat();
c.setName("阿瑟ui");
System.out.println(c.getName());
}
}
5、内部类之四:匿名内部类(重点)
package b4_内部类_匿名内部类;
public class Test {
public static void main(String[] args) {
Animal a = new Animal() {//相当于new了一个子类
@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();
}
1、总结
标题文本样式列表图片链接目录代码片表格注脚注释自定义列表LaTeX 数学公式插入甘特图插入UML图插入Mermaid流程图插入Flowchart流程图插入类图快捷键
标题复制
5.1、匿名内部类常见的使用形式
package b4_内部类_匿名内部类;
/*掌握匿名内部类的使用形式*/
public class Test2 {
public static void main(String[] args) {
//匿名内部类1
Swimming s = new Swimming() {
@Override
public void swim() {
System.out.println("学生的自由泳挺快!~~~");
}
};
go(s);
System.out.println("----------------------");
//匿名内部类2
Swimming s2 = new Swimming() {
@Override
public void swim() {
System.out.println("老师的蛙泳很快~~");
}
};
go(s2);
System.out.println("--------------------------");
//更简洁的匿名内部类3
go(new Swimming() {
@Override
public void swim() {
System.out.println("运动员花式游泳!!!");
}
});
}
public static void go(Swimming s) {
System.out.println("开始!!!");
s.swim();
System.out.println("结束。。。。");
}
}
interface Swimming {
void swim();
}
5.2、匿名内部类在开发中的使用场景演示
package b4_内部类_匿名内部类;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
/*
* 目标:通过GUI编程 ,理解匿名内部类的真实使用场景
* */
public class Test3 {
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.把按钮对象添加到桌布上展示
win.add(btn);
//4.展示窗口
win.setSize(400,300);
win.setLocationRelativeTo(null);
win.setVisible(true);
}
}
API
1、什么是API
1、常用API—Object的toString方法
package c1_常用API_Object;
public class Student {//extends Object(默认继承)
private String name;
private char sex;
private int age;
public Student() {
}
public Student(String name, char sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student{name = " + name + ",sex=" + sex + ",age=" + age + "}";
}
}
package c1_常用API_Object;
public class Test {
public static void main(String[] args) {
Student s = new Student("周杰伦", '男', 16);
//String rs = s.toString();
//System.out.println(rs);
//System.out.println(s.toString());
//直接输出对象变量,默认可以省略toString调用不写的
System.out.println(s);
}
}
1、总结
2、常用API—Object的equals方法
1、总结
package c1_常用API_Object;
import java.util.Objects;
public class Student {//extends Object(默认继承)
private String name;
private char sex;
private int age;
public Student() {
}
public Student(String name, char sex, int age) {
this.name = name;
this.sex = sex;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//官方重写的equals代码
@Override
public boolean equals(Object o) {
//1.判断是否是同一个对象比较,如果是返回true。
if (this == o) return true;
//2.如果o是null返回false,如果o不是学生类型返回false(getClass是取类型)
if (o == null || this.getClass() != o.getClass()) return false;
//3.说明o是学生类型且不是null
Student student = (Student) o;
return sex == student.sex &&
age == student.age &&
Objects.equals(name, student.name);
}
/*
* 自己重写equals,自己定制相等规则,
* 两个对象的内容一样就认为是相等的
* s1.equals(s2)
* 比较者:s1 == this(s1调用的方法,this指向s1)
* 被比较者: s2 ==> o
* */
/*@Override
public boolean equals(Object o) {
//1.判断o是不是学生类型
if (o instanceof Student) {
Student s2 = (Student) o;
//2.判断两个对象内容是否一样
// if (this.name.equals(s2.name) && this.age == s2.age
&& this.sex == s2.sex) {
// return true;
// } else {
// return false;
// }
//直接用一行代码
return this.name.equals(s2.name) && this.age ==
s2.age && this.sex == s2.sex;
} else {
//学生只能和学生比较,否则结果一定是false
return false;
}
}*/
@Override
public String toString()
{
return "Student{name = " + name + ",sex=" + sex + ",age=" + age + "}";
}
}
package c1_常用API_Object;
/*
* 目标: toString方法的使用
* */
public class Test1 {
public static void main(String[] args) {
Student s = new Student("周杰伦", '男', 16);
//String rs = s.toString();
//System.out.println(rs);
//System.out.println(s.toString());
//直接输出对象变量,默认可以省略toString调用不写的
System.out.println(s);
}
}
package c1_常用API_Object;
/*
* 目标: 掌握Object类中的equals方法的使用
*
* */
public class Test2 {
public static void main(String[] args) {
Student s1 = new Student("jojo",'男',88);
Student s2 = new Student("jojo",'男',88);
//equals 默认比较两个对象的地址是否相同
System.out.println(s1.equals(s2));
System.out.println(s1 == s2);
}
}
3、常用API—Objects的equals方法
1、Objects的概述
2、Objects的常见方法
package c2_常用API_Objects;
import java.util.Objects;
/*
* 目标: 掌握Objects类的常用方法:equals
* */
public class Test {
public static void main(String[] args) {
String s1 = null;
String s2 = new String("iiii");
// System.out.println(s1.equals(s2));//留下了隐患,可能出现空指针异常
System.out.println(Objects.equals(s1,s2));//更安全,结果也是对的
//源码ctrl+鼠标左键
/*public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}*/
}
}
3、总结