DUFQ_2020.12.15-杜飞强-内部类
内部类
定义
内部类是将一个类定义在另一个类的内部,被定义在内部的类称为内部类,包含内部类的类称为外部类。
PS:如果一个类只在另外一个类的内部使用,不会再其他的地方使用,就可以定位内部类。
分类
成员内部类
/**
* 成员内部类
* 1) 成员内部类与实例变量/实例方法一样,都是属于某一个Outer对象的
* 2) 一般情况下, 在实例方法中使用成员内部类创建对象
* 3) 在Java中,所有类编译后都会生成一个独立的字节码文件,
* 内部类的字节码文件: 外部类$内部类名.class
*/
public class Outer {
int xx = 10 ; //实例变量
public void m1() {
System.out.println("实例方法");
xx = 123; //在实例方法中,可以直接使用实例变量
//一般情况下, 在实例方法中使用成员内部类创建对象
Inner1 obj = new Inner1();
}
//成员内部类
class Inner1{
}
}
静态内部类
/**
* 静态内部类
* 1) 使用static修饰的成员 内部类
* 2) 静态内部类一般情况下是在静态方法中使用
*/
public class Outer {
static int yy = 20; //静态变量
public static void sm() {
System.out.println("静态方法");
yy = 202 ; //在静态方法中,可以直接使用静态变量
//一般情况下是在静态方法中使用静态内部类
Inner2 obj = new Inner2();
}
//静态内部类
static class Inner2{
}
}
局部内部类
/**
* 局部内部类
* 1) 在方法体中定义的内部类就是局部内部类
* 2) 局部内部类的作用域 , 是从定义内部类的位置开始, 直到包含它的大括弧结束
*
*/
public class Outer {
public void m3() {
int zz = 10; //局部变量
class Inner3{} //局部内部类
}
}
匿名内部类
/**
* 匿名内部类
* 1)匿名内部类,就是没有类名的内部类,
* 2)因为匿名内部类没有类名, 匿名内部类的定义与对象的创建必须在一起
* 3)给接口/抽象类的引用赋值时,可以赋值匿名内部类对象,接口实现类/抽象类的子类只使用一次时, 可以使用 * 匿名内部类
* 如果方法的形参是接口/抽象类的引用,在调用方法时,可以传递匿名内部类对象
*/
public class Test {
public static void main(String[] args) {
//接口的引用只能赋值实现类对象, 接口不能实例化对象, 需要先定义一个类,让它实现接口,再创建实现类对象给接口引用赋值
//如果接口的实现类就使用这一次, 以后再也不用了,就不需要再单独的定义一个实现类了,可以直接给接口引用赋值匿名内部类对象
Flyable flyable = new Flyable() {
//在匿名内部类中重写接口的抽象方法
@Override
public void fly() {
System.out.println("我是匿名内部类中重写的飞行操作");
}
};
flyable.fly();
//抽象类不能实例化对象, 抽象类的引用需要赋值子类对象, 先定义子类继承抽象类, 重写抽象类的抽象方法, 再创建子类对象给抽象类引用赋值
//当子类就使用这一次时, 可以直接给抽象类引用赋值匿名内部类对象
Animal animal = new Animal() {
//在匿名内部类中重写抽象类的抽象方法
@Override
public void walk() {
System.out.println(" 这是一个神奇的动物, 它没有腿也能走路");
}
};
animal.walk();
}
}
习题1
package com.dufq.pack;
import java.util.Scanner;
/**
* @author dufq
* @version idea 1.3
* @date 2020/12/15 16:14
*/
public abstract class Area {//面积抽象类Area
public abstract void area(double n, double m,double r);//定义有参抽象方法
}
class RectArea extends Area {//矩形面积类RectArea
@Override
public void area(double n, double m, double r) {
double area = n * m;
System.out.println("矩形面积是:" + area);
}
}
class RoundArea extends Area {//圆形面积RoundArea
@Override
public void area(double n, double m, double r) {
double area = Math.PI * Math.pow(r, 2);
System.out.println("原型面积" + area);
}
}
public class Test {
public static void main(String[] args) {
Scanner r = new Scanner(System.in);
RectArea rectArea = new RectArea();
RoundArea roundArea = new RoundArea();
System.out.println("请输入图形的长:");
int h = r.nextInt();
System.out.println("请输入图形的宽:");
int w = r.nextInt();
rectArea.area(h,w,0);
System.out.println("请输入半径:");
double v = r.nextDouble();
roundArea.area(0,0,v);
}
}
习题2
package com.dufq.pack1;
import java.util.Scanner;
/**
* @author dufq
* @version idea 1.3
* @date 2020/12/15 22:25
*/
public abstract class Print {
public static void pr() {
}
abstract void print();
}
class DotMatrixtPrinter extends Print{
@Override
void print() {
System.out.println("已连接针式打印机!");
}
}
class InkpetPrinter extends Print{
@Override
void print() {
System.out.println("已连接喷墨打印机!");
}
}
class LaserPrinter extends Print{
@Override
void print() {
System.out.println("已连接激光打印机!");
}
}
public class Test {
public static void main(String[] args) {
Print print = null;
Scanner r = new Scanner(System.in);
System.out.println("请选择你需要的打印机,1:针式打印机;2,喷墨打印机;3,激光打印机");
int score = r.nextInt();
switch(score){
case 1:
print = new DotMatrixtPrinter();
break;
case 2:
print = new InkpetPrinter();
break;
case 3:
print = new LaserPrinter();
break;
}
print.print();
}
}
近期评论