本学习内容来着b站:黑马程序员
注:痛苦啊真痛苦,明明觉得学习Java特别厉害,非常羡慕技术大佬,但是我自己总是感觉有心无力,备受打击,真的痛苦,啥时候才能见到光明啊,我也知道必须经过黎明前的黑暗我们才能见到光明,还得继续坚持下去。今天的内容可以说是不全的,只有多态和内部类,还有常见的api我没有敲过代码,就不放到这里来了。结尾:本内容,当做笔记的复习材料,如果你看到了这篇文章能对你有所帮助,给我点个赞或者评论也是对我更新的最大动力!感谢,内容如果有错误,欢迎各位兄弟姐妹批评指正!!!
一. 多态
1.1 什么是多态
代码实现:抽象类父类 animal
package com.xiaochen.d1_polymorphic;
public class Tortoise extends Animal{
public String name = "子类乌龟";
@Override
public void run() {
System.out.println("跑的慢");
}
}
代码实现:子类 dog
package com.xiaochen.d1_polymorphic;
public class Dog extends Animal{
public String name = "子类狗";
@Override
public void run() {
System.out.println("狗跑的很快");
}
}
代码实现:子类 tortoise
package com.xiaochen.d1_polymorphic;
public class Tortoise extends Animal{
public String name = "子类乌龟";
@Override
public void run() {
System.out.println("跑的慢");
}
}
代码实现:测试类
package com.xiaochen.d1_polymorphic;
//目标:认识多态,理解多态的形式和概念
public class Test {
public static void main(String[] args) {
//1、多态的形式: 父类构造器 对象名称 = new 子类构造器
Animal a = new Dog();
a.run();//编译看左边,运行看右边
System.out.println(a.name);//对于变量的调用,编译看左,运行也看左
Animal a2 = new Tortoise();
a2.run();//编译看左边,运行看右边
System.out.println(a2.name);//对于变量的调用,编译看左,运行也看左
}
}
1.2 多态的优势
代码实现:父类 animal
package com.xiaochen.d2_polymorphic_advantage;
//父类
public class Animal {
public String name = "动物名称";
public void run(){
System.out.println("动物可以跑");
}
}
代码实现:子类 Dog
package com.xiaochen.d2_polymorphic_advantage;
public class Dog extends Animal {
public String name = "狗名称";
@Override
public void run(){
System.out.println("狗跑的快");
}
/*
独有功能
*/
public void lookDoor(){
System.out.println("狗在看门");
}
}
代码实现:子类 tortoise
package com.xiaochen.d2_polymorphic_advantage;
public class Tortoise extends Animal{
public String name = "乌龟名称";
@Override
public void run(){
System.out.println("乌龟跑的慢");
}
/*
独有功能
*/
public void lookDoor(){
System.out.println("乌龟在爬");
}
}
代码实现:测试类
package com.xiaochen.d2_polymorphic_advantage;
public class Test {
public static void main(String[] args) {
Animal a = new Tortoise();
go(a);
Animal a2 = new Dog();
go(a2);
//a2.lookDoor();//多态下不能访问子类的独有功能
}
/*
要求:所有的动物都可以进来比赛
*/
public static void go(Animal a){
System.out.println("开始");
a.run();
System.out.println("结束");
}
}
1.3 多态下引用类型数据转换
代码实现:父类 animal
package com.xiaochen.d3_polymorphic_convert;
//父类
public class Animal {
public void run(){
System.out.println("动物可以跑");
}
}
代码实现:子类 dog
package com.xiaochen.d3_polymorphic_convert;
public class Dog extends Animal{
@Override
public void run(){
System.out.println("狗跑的快");
}
/*
独有功能
*/
public void lookDoor(){
System.out.println("狗在看门");
}
}
代码实现:子类 cat
package com.xiaochen.d3_polymorphic_convert;
public class Cat extends Animal{
public void run(){
System.out.println("猫跑的也很快");
}
/*
独有功能
*/
public void maojiao(){
System.out.println("猫叫");
}
}
代码实现:测试类
package com.xiaochen.d3_polymorphic_convert;
public class Test {
public static void main(String[] args) {
//自动类型转换
Animal a = new Dog();
a.run();
//强制类型转换
Animal a2 = new Cat();
a2.run();
//Dog d = (Dog) a2;//强制类型转换,编译阶段不报错的(注意:有继承或者实现关系编译阶段可以强转,没有毛病)运行时可能会出错的
if(a2 instanceof Cat){
Cat t = (Cat) a2;//从父类类型到子类类型,必须强制类型转换
t.maojiao();
}else if(a2 instanceof Dog){
Dog d = new Dog();
d.lookDoor();
}
System.out.println("=================");
go(new Dog());
go(new Cat());
}
public static void go(Animal a){
//a到底是狗还是猫
if(a instanceof Cat){
Cat t = (Cat) a;//从父类类型到子类类型,必须强制类型转换
t.maojiao();
}else if(a instanceof Dog){
Dog d = new Dog();
d.lookDoor();
}
}
}
1.4 多态的案例
代码实现:接口
package com.xiaochen.d4_polymorphic_test;
//USB接口 = 规范
public interface USB {
//接入 拔出
void connect();
void unconnerct();
}
代码实现:实现类 keyboard
package com.xiaochen.d4_polymorphic_test;
//实现类
public class KeyBoard implements USB{
private String name;
public KeyBoard(String name) {
this.name = name;
}
@Override
public void connect() {
System.out.println(name + "成功连接了电脑");
}
/*
独有功能
*/
public void keyDown(){
System.out.println(name + "敲击了,来了,老铁666666");
}
@Override
public void unconnerct() {
System.out.println(name + "成功从电脑拔出");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
代码实现:实现类 mouse
package com.xiaochen.d4_polymorphic_test;
//实现类
public class Mouse implements USB{
private String name;
public Mouse(String name) {
this.name = name;
}
@Override
public void connect() {
System.out.println(name + "成功连接了电脑");
}
/*
独有功能
*/
public void dbClick(){
System.out.println(name + "双击点亮小红心,一键三连");
}
@Override
public void unconnerct() {
System.out.println(name + "成功从电脑拔出");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
代码实现:电脑类
package com.xiaochen.d4_polymorphic_test;
public class Computer {
private String name;
public Computer(String name) {
this.name = name;
}
public void start(){
System.out.println(name + "开机了");
}
/*
提供安装USB设备的入口
*/
public void installUSB(USB usb){
//多态 usb == 可能是鼠标,也可以是键盘
usb.connect();
//独有功能:先判断,再强转
if(usb instanceof KeyBoard){
KeyBoard k = (KeyBoard) usb;
k.keyDown();
}else if(usb instanceof Mouse){
Mouse m = (Mouse) usb;
m.dbClick();
}
usb.unconnerct();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
代码实现:测试类
package com.xiaochen.d4_polymorphic_test;
/*
目标:USB设备模型
1、定义USB接口:接入 拔出
2、定义2个USB的实现类:鼠标 键盘
3、创建一个电脑对象,创建USB设备对象,安装启动
*/
public class Test {
public static void main(String[] args) {
//1、创建电脑对象
Computer c = new Computer("华为");
c.start();
//2、创建鼠标对象,键盘对象
USB u = new KeyBoard("小陈");
c.installUSB(u);
USB u1 = new KeyBoard("罗技鼠标");
c.installUSB(u1);
}
}
二.内部类
2.1 什么是内部类
2.2 静态内部类
代码实现 :Outer
package com.xiaochen.d5_innerclass_static;
/*
外部类
*/
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);
Outer o = new Outer();
System.out.println(o.hobby);//间接访问
// 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 String getSchoolName() {
return schoolName;
}
public static void setSchoolName(String schoolName) {
Inner.schoolName = schoolName;
}
}
}
代码实现:测试类
package com.xiaochen.d5_innerclass_static;
public class Test {
public static void main(String[] args) {
Outer.Inner in = new Outer.Inner();
in.setName("小陈");
in.show();
}
}
2.3 成员内部类
代码实现:outer类
package com.xiaochen.d6_innerclass;
//外部类
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 int a = 100 ;//jdk16开始支持静态成员了
public static void test(){
System.out.println(a);
}
public void show(){
System.out.println("名称:" + name);
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;
}
}
}
代码实现: 测试类
package com.xiaochen.d6_innerclass;
public class Test {
public static void main(String[] args) {
Outer.Inner in = new Outer().new Inner();
in.setName("内部");
in.show();
Outer.Inner.test();
System.out.println("========");
Outer.Inner in1 = new Outer().new Inner();
in1.show();
}
}
2.4 局部内部类
package com.xiaochen.d7_innerclass;
目标:了解局部内部类的语法
public class Test {
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;
}
}
}
}
2.5 匿名内部类重点
package com.xiaochen.d8_innerclass_anonymous;
//目标:学习匿名内部类的形式和特点
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 com.xiaochen.d8_innerclass_anonymous;
//目标:掌握匿名内部类的使用形式
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 com.xiaochen.d8_innerclass_anonymous;
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.showConfirmDialog(win,"点我一下,说明爱我");
// }
// });
btn.addActionListener( e -> JOptionPane.showConfirmDialog(win,"点我一下,说明爱我"));
//3、把按钮对象添加到桌布上展示
panel.add(btn);
//4、展示窗口
win.setSize(400,300);
win.setLocationRelativeTo(null);
win.setVisible(true);
}
}