Java 我建的一个qt paint调用方法在main方法里没调用,为什么还会执行它?

JAVA对象怎样实现对一个方法的调用的?
今天闲着没事干,查了些资料,又把老师将的内容复习了一遍,后来有人问我对象是怎样实现对一个方法的调用的?整理了上课记得笔记。总结出了些心得供大家学习会有些帮助吧!!!!
&&public class
public&static void&main(String[]
//Bean 对象
Bean b = new Bean();
class Bean{
&&& private
int num =0;
&&& public
this.num = 5;
&&&&public
void way(){}
这里把JVM当做一个实例对象
JVM j = new JVM();
首先,JAVA虚拟机在执行一个主程序Main方法之前,先创建一个虚拟机的实例,在虚拟机创建实例就拥有一个堆一个方法区,实例就会启动线程来执行Main方法,(所有的Java程序的入口必须执行Main方法的).方法执行完后,类装载器会编译
.class的文件,并将读取到的类信息放到方法区.并且把读取到的(二进制的)类信息返回给JVM,JVM得到类型信息后,会立即取得ClassName,比如Bean,
并且在JAVA栈中入栈一个对Bean类型的引用,
;并且有一个指向堆的指针,由Bean b
指向堆的指针,堆中的指针还会指向一个方法区的指针(用来存放方法)。当用new运算符的时候,会在堆中分配内存,把类型信息放进方法区中,并初始化类中的成员变量
int num = 0.这时候,调用new
之后的构造函数之后的时候,才真正的为对象分配内存(至于分配多大的内存,由JVM所读取的类型信息来决定),即 int num =5;
栈中的Bean b 的指针会指向堆中的对象。
并且在堆中还有一个指向方法区取得指针,这时候指针就会到方法区找到它所对应的way方法.
就完成了Java对象对方法的调用.
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。为什么main方法是public static void? - ImportNew
Main方法是我们学习Java编程语言时知道的第一个方法,你是否曾经想过为什么main方法是public、static、void的。当然,很多人首先学的是C和C++,但是在Java中main方法与前者有些细微的不同,它不会返回任何值,为什么main方式是public、static、void,这篇文章尝试去找到一些答案。
Main方法是Java程序的入口,记住,我们这里不会讨论Servlet、MIDlet和其他任何容器管理的java程序,在java核心编程中,JVM会查找类中的public static void main(String[] args),如果找不到该方法就抛出错误NoSuchMethodError:main 程序终止。
Main方法必须严格遵循它的语法规则,方法签名必须是public static void,参数是字符串数组类型,如果是Java1.5及以后的版本还可以使用可变参数:
public static void main(String... args)
为什么main方法是静态的(static)
正因为main方法是静态的,JVM调用这个方法就不需要创建任何包含这个main方法的实例。
因为C和C++同样有类似的main方法作为程序执行的入口。
如果main方法不声明为静态的,JVM就必须创建main类的实例,因为构造器可以被重载,JVM就没法确定调用哪个main方法。
静态方法和静态数据加载到内存就可以直接调用而不需要像实例方法一样创建实例后才能调用,如果main方法是静态的,那么它就会被加载到JVM上下文中成为可执行的方法。
为什么main方法是公有的(public)
Java指定了一些可访问的修饰符如:private、protected、public,任何方法或变量都可以声明为public,Java可以从该类之外的地方访问。因为main方法是公共的,JVM就可以轻松的访问执行它。
为什么main方法没有返回值(Void)
因为main返回任何值对程序都没任何意义,所以设计成void,意味着main不会有任何值返回
main方法必须声明为public、static、void,否则JVM没法运行程序
如果JVM找不到main方法就抛出NoSuchMethodError:main异常,例如:如果你运行命令:java HelloWrold,JVM就会在HelloWorld.class文件中搜索public static void main (String[] args) 放法
main方式是程序的入口,程序执行的开始处。
main方法被一个特定的线程”main”运行,程序会一直运行直到main线程结束或者non-daemon线程终止。
当你看到“Exception in Thread main”如:Excpetion in Thread main:Java.lang.NullPointedException ,意味着异常来自于main线程
你可以声明main方法使用java1.5的可变参数的方式如:
public static void main(String... args)
除了static、void、和public,你可以使用final,synchronized、和strictfp修饰符在main方法的签名中,如:
public strictfp final synchronized static void main(String[] args)
main方法在Java可以像其他方法一样被重载,但是JVM只会调用上面这种签名规范的main方法。
你可以使用throws子句在方法签名中,可以抛出任何checked和unchecked异常
静态初始化块在JVM调用main方法前被执行,它们在类被JVM加载到内存的时候就被执行了。
原文链接:
- 译文链接: [ 转载请保留原文出处、译者和译文链接。]
关于作者:
程序员,关注 Java、Python、云计算,移动互联网。(新浪微博:)
微信关注: ImportNew
分享Java相关的技术文章、工具资源和热点资讯。扫描加关注,碎片时间提高Java开发技能!
Java并发包学习:http://qifuguang.me/categories/Java%E5%B...
关于ImportNew
ImportNew 专注于 Java 技术分享。于日 11:11正式上线。是的,这是一个很特别的时刻 :)
ImportNew 由两个 Java 关键字 import 和 new 组成,意指:Java 开发者学习新知识的网站。 import 可认为是学习和吸收, new 则可认为是新知识、新技术圈子和新朋友……
– 写了文章?看干货?去头条!
– 为IT单身男女服务的征婚传播平台
– 优秀的工具资源导航
– 活跃 & 专业的翻译小组
– 国内外的精选博客文章
– JavaScript, HTML5, CSS
– 专注Android技术分享
– 专注iOS技术分享
– 专注Java技术分享
– 专注Python技术分享
新浪微博:
微信号:importnew
反馈建议:@
广告与商务合作QQ:
& 2015 ImportNewJava中那些默认运行的方法(如Runnable接口自动运行run方法)到底是在哪里设置的?_百度知道
Java中那些默认运行的方法(如Runnable接口自动运行run方法)到底是在哪里设置的?
过滤器类中的doFilter方法,HttpServlet中的doGet、doPost方法。想问这些都是在哪里规定的Runnable接口中的 run方法,都会在一定时机自动调用、JSP扩展标签方法中的doTag方法,甚至运行程序时的main方法?学了这么久Java想问总没有问,请指教、Applet中的paint方法等等
虚拟机?解释器?配置文件?
提问者采纳
实现上也有用回调实现的,比如runnable.paint(g).run() servlet、观察者等模式,技巧上的一种“控制反转”这仅仅是一种API层面的;所举的都是在java的运行库中以java代码实现的;applet.doPost()。属于一种或几种设计模式的有机结合,设计模型上涉及事件驱动结构。都是在特定情况以其控制环境的控制器“调用”执行这个特定的接口方法,类似的机制自己也可以用
来自团队:
其他类似问题
为您推荐:
自动运行的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁Java 关于paintComponent与paint有什么区别?各自的特征 - CSDN博客
1&-&paint()&中调用&paintComponent(),&paintBorder(),&paintChildren()
2&-&最重要的区别是“双缓冲”。Swing&组件的&paint()&中实现了双缓冲,所以不要随便去覆写,会破坏双缓冲的,————建议的方式是覆写&paintComponent(),很多人做的小程序会”闪烁“,就是因为他们覆写了&paint()&方法,破坏了Swing本身的双缓冲。Swing&不建议用户自己实现双缓冲。
3&-&覆写&paint(),如果新方法没有去调用&paintChildren(),还会造成子控件不显示,鼠标移上去才显示,这个也是很多新手问的问题:&“为什么我的按钮只有鼠标移上去才显示?”
4&-&只有极少数的情况可能需要覆写&paint()&方法,通常是为了实现特殊的绘图效果,或者特殊的优化,比如&JViewport&覆写了&paint()&方法,使用“延迟重绘”的方式来合并当滚动条移动时一些特别频繁的重绘请求,等等。
------解决方案--------------------
之间我看过一个人写的关于这个的文章,写的应该挺全的,可惜找不到地址了。。
这两个方法,
paint()是基础,paint中会调用&paintComponent(),&paintBorder(),&paintChildren()
这三个方法,
这三个方法一个是绘制背景,一个绘制边框,一个绘制子控件。
一般重写背景,是建议重写paintComponent()的。3516人阅读
/---------------资料1---------------/
昨晚小许同学把paintComponent方法以一t之差写成painComponent,在花费了大量的人力物力之后
才找到这个错误,不得不感慨:粗心才是程序员的噩梦啊!
马士兵曰过:“重写方法你给我在API文档中找方法签名!”,小许,你懂了吗?
不过小许问的问题倒让我发现了Swing中paint与paintComponent的区别。
查API文档,查得在类Jcomponent下的paint方法有以下解释:
& & &&“This method actually delegates the work ofpainting to three protected & && & && &methods:&paintComponent,&paintBorder,and&paintChildren.They're
called in the & && & && order listed to ensure that children appear ontop of component itself.”
也就是说当Swing中的paint方法被调用时,paintComponent、paintBorder、& & && paintChildren这三个方法也会被按顺序调用,之所以要按这个顺序调用是为了保证子组件能正确地显示在目前这个组件之上。
所以paintComponent就是本身这个容器自己画出自己组件的方法了。如果只是为了改变本身这个容器中的组件,只需要改写paintComponent方法就可以了,如果还要保留容器中的原本组件就别忘了调用super.paintComponent(g)。如果要改写paint方法来改变本身这个容器的组件,那么也别忘了要调用super.paint(g),不然出来的东西是不包含原组件、原边框和子组件的。这个做个实验就可以很快验证的。
&& &&&public class MyDrawPanelextends JPanel{
public void paint(Graphics g){
super.paint(g);
g.setColor(Color.orange);
g.fillRect(20, 50, 100, 100);
public static void main(String[] args){
JFrame frame = new JFrame();
MyDrawPanel panel = new MyDrawPanel();
JLabel label = new JLabel(&aaa&);
panel.setBackground(Color.blue);
panel.add(label);
frame.getContentPane().add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.setVisible(true);
以上这个程序除了JPanel本身正常显示之外还会显示出子组件label和一个方块。如果注释掉super.paint(g),那么就只能显示出方块了。
不过我还发现了一个更神奇的地方。
那就是以上这些只适用于Swing,如果换成awt就不同了。
awt要改变组件样式,只能重写paint方法了,因为他是没有paintComponent方法的。什么?你有发现这个方法?!如果你看清楚你就会发现这个方法不是paintComponent而是paintComponents方法,后面多了一个s
这个paintComponents方法按API说是用来把所有的容器内组件都显示出来的方法,我做了一下实验,这个方法在容器对象初始化的时候应该是没有被自动调用的,当你要用的时候只能自己调用了,不过好像只是显示出子组件而已,因为awt中即使重写paint方法而没有调用父类的paint方法是不影响本身容器自己的组件显示的。这是一个例子:
&& &&&public class MyDrawPanelextends Panel{
public void paint(Graphics g){
//super.paint(g);
g.setColor(Color.orange);
g.fillRect(20, 50, 100, 100);
paintComponents(g);
public static void main(String[] args){
JFrame frame = new JFrame();
MyDrawPanel panel = new MyDrawPanel();
JLabel label = new JLabel(&aaa&);
panel.setBackground(Color.blue);
panel.add(label);
frame.getContentPane().add(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300, 300);
frame.setVisible(true);
& &&可以把paintComponents(g)注释掉再看看效果。
& && &总结了一下:Swing中改变组件样式重写paintComponent就可以了,其他paintBorder和paintChildren默认就可以。awt中改变组件样式要重写paint方法,而且如果不需要调用super.paint(g)就可以保留原组件样式,但是不会显示子组件样式,可以调用paintComponents(g)解决这个问题。
/---------------------资料2-----------------------/
AWT 和 Swing 中组件的绘制方式不同,绘制方法的实现也有区别。
AWT 中组件重绘时先调用 update(Graphics g) 清除以前绘制的,再调用 paint() 方法里进行绘制,所以在 AWT 组件里重绘时,只要简单的覆写 paint() 方法就可以了。
而在Swing 中,组件绘制 paint() 方法会依次调用 paintComponent(),paintBorder(),paintChildren() 三个方法。根据方法名就可以看出,paintComponent() 绘制组件本身,paintBorder() 绘制组件的边框,paintChildren() 绘制组件的子组件,所以Swing 编程时,如果继承 JComponent 或者其子类需要重绘的话,只要覆写 paintComponent() 而不是 paint(),方法 paintBorder(),paintChildren()
一般默认即可
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:238022次
积分:3332
积分:3332
排名:第5193名
原创:80篇
转载:120篇
评论:64条
(2)(2)(4)(2)(4)(8)(4)(5)(1)(4)(2)(9)(1)(4)(2)(2)(2)(4)(2)(3)(2)(1)(11)(7)(5)(16)(2)(11)(14)(15)(4)(18)(6)(10)(6)(5)

我要回帖

更多关于 java main调用非静态 的文章

 

随机推荐