swing LayoutManager 和多态
interface LayoutManager{
void show();
}
class FlowLayout implements LayoutManager{
public void show(){
System.out.println("这是流式布局!");
}
}
class BorderLayout implements LayoutManager{
public void show(){
System.out.println("这是边界布局!");
}
}
class GridLayout implements LayoutManager{
public void show(){
System.out.println("这是卡片布局!");
}
}
class Panel {
Panel(){
System.out.println("空构造函数");
}
Panel(LayoutManager layout){ //这里面的LayoutManager是什么,这句话是什么意思
layout.show();
}
void add(Object obj){ //object obj什么意思
System.out.println("添加组件啦");
}
void showAllInfo(){
System.out.println("要显示属性啦");
}
}
public class Nineth {
public static void main(String[] args) {
GridLayout layout=new GridLayout();
Panel pan=new Panel(layout);
}
}
这个程序的执行顺序是什么?谢谢!

其他2条回答
第一个问题:
1.首先,我们从main函数入手开始看,
GridLayout layout=new GridLayout();
实例化GridLayout这个类,我们需要观察该类的构造函数和继承状态 2.OK,没有带参数的构造函数,那么看到class GridLayout implements LayoutManager意思是实现了LayoutManager这个接口
interface LayoutManager 这个接口定义了show() 方法,并在GridLayout 实现(重写)了该方法。
GridLayout layout=new GridLayout();执行完毕。 3.Panel pan=new Panel(layout);
实例化Panel 这个类,我们需要观察该类的构造函数和继承状态 4,OK,我们看到Panel 类就两个构造函数,一个是无参数的,还有一个是Panel(LayoutManager layout)构造函数,LayoutManager是什么呢?为什么能传入GridLayout 类的变量作为参数而不是GridLayout 类型的参数呢?
OK,我们看到LayoutManager是一个接口,接口被GridLayout 实现,刚才也说过class GridLayout implements LayoutManager意思是实现了LayoutManager这个接口
也就是说,我们的GridLayout 跟 接口LayoutManager 显然存在着继承关系。 OK。我们仔细观察不难发现之间存在的关系。
<1>,有继承的存在。 GridLayout implements LayoutManager 。
<2>,有重写,刚说过GridLayout 实现(重写)了show方法。
<3>,在你的疑问里,LayoutManager layout,既然能传入,证明作者的设计LayoutManager 跟GridLayout 存在着继承的关系,并在这里,GridLayout 的引用变量layout作为实参传入了该构造函数,那么LayoutManager layout这个形参就指向了GridLayout 类的实例。 那么为什么父类引用能指向子类的实例?有什么好处? 这种设计方式是java语言的核心基础,称之为多态!不知道多态是什么?赶紧去面壁,然后翻书。
这么做的好处?简单来说就是,我们加入新的子类到程序中时,(就像你这个程序里的FlowLayout的加入) ,不必重写或修改处理这个类型的程序(这里就是不需要增加令一个参数类型的构造函数)给程序员提供了非常非常大的便利(不需要修改构造函数难道不便利么?)。
关于多态,你需要仔细阅读java书籍才能弄懂更多的细节。
继续说程序,layout.show()在构造函数中被调用,System.out.println("这是卡片布局!"),输出这是卡片布局。
Panel pan=new Panel(layout);执行结束了。然后main方法结束。程序结束。
第一个问题结束! 第二个问题:
void add(Object obj){ //object obj什么意思
System.out.println("添加组件啦");
}
这里的Panel 类中,有一个add方法,这个方法在程序中没有被调用,所以该程序再执行过程中没它什么事。我们来分析一下这个add方法。
Object obj在该方法中作为形参准备接收调用该方法时传来的实参,OK。
Object 是什么?Object 是java所有类的最终的基类。你定义的所有类,都默认extends Object。也就是说,在这里,不管传入什么东西,肯定是父类引用指向子类实例。
这跟上面一样,还是多态的使用。 关于object类和多态,还是需要看书继续深化理解。所以,骚年,任重道远,这只是开始的开始的开始。 但是,基础至关重要。
LayoutManager是个接口,定义了一个方法show(),所有implements这个接口的类都要实现这个方法。
你在main方法里面new一个GridLayout,然后再把它置到panel里面。
panel在构造时,使用了 Panel(LayoutManager layout){ //这里面的LayoutManager是什么,这句话是什么意思
这个构造方法,所以它全执行这个方法的layout.show();
所以GridLayout的show方法也要执行。
结果只打印一句
这是卡片布局! 未测试,不保证结果,哈。
swing LayoutManager 和多态的更多相关文章
- Java Swing 探索(一)LayoutManager
BorderLayout FlowLayout GridLayout GridBagLayout CardLayout BoxLayout 1.BorderLayout java.lang.Objec ...
- Java第4次实验提纲(面向对象2-继承、多态、抽象类与接口与Swing)
PTA 题集面向对象2-进阶-多态接口内部类 第1次实验 1.1 题集5-1(Comparable) 难点:如果传入对象为null,或者传入对象的某个属性为null,怎么处理? 1.2 题集5-2(C ...
- 运用 Swing
一:Swing的组件: 组件(component,或称原件)就是你会放在GUI上的东西,这些东西用户可以看到并可以与之交互. 组件是可以嵌套的. 创建GUI的四个步骤: 1.创建window(JFra ...
- swing的第一课
Swing介绍 Swing API 可扩展 GUI组件,以减轻开发者的生活创造基于JAVA前端/GUI应用.它是建立在AWT API之上,并作为 AWTAPI 的更换,因为它几乎每一个控制对应 AWT ...
- (转)Java 的swing.GroupLayout布局管理器的使用方法和实例
摘自http://www.cnblogs.com/lionden/archive/2012/12/11/grouplayout.html (转)Java 的swing.GroupLayout布局管理器 ...
- Swing布局管理器
在Swing中使用的所有布局管理器都可以实现LayoutManager接口.Swing中有五种常见的布局管理器分别为FlowLayout.BorderLayout.GridLayout.CardLay ...
- Java 的swing.GroupLayout布局管理器的使用方法和实例(转)
The following builds a panel consisting of two labels in one column, followed by two textfields in t ...
- Java学习之旅基础知识篇:面向对象之封装、继承及多态
Java是一种面向对象设计的高级语言,支持继承.封装和多态三大基本特征,首先我们从面向对象两大概念:类和对象(也称为实例)谈起.来看看最基本的类定义语法: /*命名规则: *类名(首字母大写,多个单词 ...
- Swing学习篇 API之JButton组件
按钮(Jbutton) Swing中的按钮是Jbutton,它是javax.swing.AbstracButton类的子类,swing中的按钮可以显示图像,并且可以将按钮设置为窗口的默认图标,而且还可 ...
随机推荐
- Hbase之使用回调函数进行批处理操作
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseConfiguration; impo ...
- python操作mongodb之八地理索引空间数据
from pymongo import MongoClient, GEO2D #使用geo_example库 db = MongoClient('192.168.30.252',27017).geo_ ...
- maven寻找jar
http://mvnrepository.com/artifact/org.springframework/spring-context
- 安卓虚拟机启动失败intel haxm未安装
1:环境是android studio 在AVD中启动显示,提示当前电脑为安装HAXM emulator: ERROR: x86 emulation currently requires hardwa ...
- JDK里面常用的包
1.java.lang-------java里的核心类,如String.Math.Integer.System.Thread,java.lang里还有一个子包:java.lang.reflect用于实 ...
- 解决xshell 中文乱码
在xshell命令行里面 输入: locale输出: LANG=zh_CN.UTF-8LC_CTYPE="zh_CN.UTF-8"LC_NUMERIC="zh_CN.U ...
- 【bzoj1043】下落的圆盘
[bzoj1043]下落的圆盘 题意 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. \(1\leq n\leq 1000\ ...
- Azure 云平台用 SQOOP 将 SQL server 2012 数据表导入 HIVE / HBASE
My name is Farooq and I am with HDinsight support team here at Microsoft. In this blog I will try to ...
- 166. Fraction to Recurring Decimal -- 将除法的商表示成字符串(循环节用括号表示)
Given two integers representing the numerator and denominator of a fraction, return the fraction in ...
- case when 对某个字段值分类讨论
SELECT SM_ID,SM_CID,SM_STATION,SM_TIME,PS_CODE,PS_NUMBER,SS_NAME,SS_CODE, ( THEN '中转站' END) FROM dbo ...