类与对象
1.对象是具体的事物,类是对对象的抽象。
2.类可以看成一类对象的模板,对象可以看成该类的一个具体实例。
3.类适用于描述一同一类型的对象的一个抽象概念,类中定义了这一类对象所应具有的共同属性和方法
内存分析---栈,堆,方法区(静态区)
构造方法重载
构造器也叫做构造方法用于对象的初始化。
要点:
1.通过new关键字调用
2.构造器,虽然有返回值,但是不能定义返回值类型,不能再构造其中使用润跳远返回某个值
3.如果我们没有定义构造器,则编译器会自动定义一个无参的构造函数,如果已定义则编译器不会自动添加构造
4.构造器的方法必须和类名一致
垃圾回收机制
垃圾回收过程
1.发现无用对象,
2.回收无用对象占用的内存空间。
对象的三种状态,年轻代,年老代,持久代
垃圾回收过程:
1、新创建的对象,绝大多数都会存储在Eden中,
2、当Eden满了(达到一定比例)不能创建新对象,则触发垃圾回收(GC),将无用对象清理掉,然后剩余对象复制到某个Survivor中,如S1,同时清空Eden区
3、当Eden区再次满了,会将S1中的不能清空的对象存到另外一个Survivor中,如S2,同时将Eden区中的不能清空的对象,也复制到S1中,保证Eden和S1,均披清空。
4、重复多次(默认15次)Survivor中没有被清理的对象,则会复制到老年代Old(Tenured)区中,
5、当Old区满了,则会触发一个一次完整地垃圾回收(FullGC),之前新生代的垃圾回收称为(minorGC)
JVM调优和Full GC
在对JVM调优的过程中,很大一部分工作就是对于Full GC的调节。有如下原因可能导致FullGC:
1.年老代(Tenured)被写满
2.持久代(Perm)被写满
3.System.gc()被显式调用(程序建议GC启动,不是调用GC)
4.上一次GC之后Heap的各域分配策略动态变化
(4)开发中容易造成内存泄露的操作
创建大量无用对象;静态集合类的使用;各种连接对象(IO流对象、数据库连接对象、网络连接对象);未关闭监听器的使用。
this的本质
this的本质就是 创建好的对象的地址”!由于在构造方法调用前,对象已经创建,因此,在构造方法中也可以使用this代表“当前对象”。
this最常的用法:
1.在程序中产生二义性之处,应使用this来指明当前对象;普通方法中,this总是指向调用该方法的对象。构造方法中,this总是指向正要初始化的对象。
2.使用this关键字调用重载的构造方法,避免相同的初始化代码。但只能在构造方法中用,并且必须位于构造方法的第一句。
3.this不能用于static方法中。
static关键字
static修饰的成员变量和方法,从属于类。普通变量和方法从属于对象的。
静态初始化块
用于类的初始化操作!在静态初始化块中不能直接访问非static成员。
静态初始化块执行顺序(学完继承再看这里):
1.上溯到Object类,先执行Object的静态初始化块,再向下执行子类的静态初始化块,直到我们的类的静态初始化块为止。
2.构造方法执行顺序和上面顺序一样
package cn.sxt.lian;
public class User3{
int id; //id
String name;//账户名
String pwd ;//密码
static String company;//公司名称
static {
System.out.println("执行类的初始化工作”);
company ="北京尚学堂”;
printCompany();
public static void printCompany() {
System.out.println(company);
}
public static void main(String[] args) {
User3 u3 = new User3();
}
}
java中参数值传递机制
Java中,方法中所有参数都是“值传递”,也就是“传递的是值的副本”。也就是说,我们得到的是“原参数的复印件,而不是原件”。因此,复印件改变不会影响原件。引用类型是指“对象的地址”
JAVA包机制
包机制是JAVA中管理类的重要手段,开发中,我们会遇到大量同名的类,通过包我们很容易对解决类重名的问题,也可以实现对类的有效管理报,对于累,相当于文件夹,对于文件的作用。
我们通过package实现对类的管理,package的使用有两个要点:
1.通常是类的第一句非注释性语句。
2.包名:域名倒着写即可,再加上模块名,便于内部管理类。
注意事项:
1,写项目时都要加包,不要使用默认包。
2,com.gao和com.gao.car,这两个包没有包含关系,是两个完全独立的包。只是逻辑上看起来后者是前者的一部分。
JKD中的主要包
import导入类
如果我们要使用其他包的类,需要使用import导入,从而可以在本类中直接通过类名来调用,否则就需要书写类的完整包名和类名。import后,便于编写代码,提高可维护性。
注意要点:
1.Java会默认导入java.lang包下所有的类,因此这些类我们可以直接使用。
2.如果导入两个同名的类,只能用包名+类名来显示调用相关类:
静态导入
关于小游戏的蠢蠢欲动
一,创建游戏主窗口
package cn.sxt.game;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
public class MyGameFrame extends JFrame{
/**
* 初始化窗口
*/
public void launchFrame() {
this.setTitle("启航储备成员_小试");
this.setVisible(true);
this.setSize(500,500);
this.setLocation(300,300);
this.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] args) {
MyGameFrame f= new MyGameFrame();
f.launchFrame();
}
}
得到效果图
二,图形绘制,文本绘制,颜色改变
利用paint可以得到画笔,可以画出各种几何图形,如直线(g.drawLine)矩形( g.drawRect)椭圆(g.drawOval)还有满矩形框(g.fillRect)。
public void paint(Graphics g) {//自动被调用,g相当于画笔
g.drawLine(100,100,300,300);
g.drawRect(100,100,300,300);
g.drawOval(100,100,300,300);
g.fillRect(100, 100, 40, 40, );
}
颜色利用g.setColor改变
根据老师所讲,应该得到
而我却得到一个黑幕,如下【留问++】
字体用g.setFont实现。
三,线程内部类实现动画
添加背景和小飞机
内部类帮助我们使用外部类的属性
小飞机移动的实现
游戏体父类的实现
定义键盘监听内部类
选择keyPressed和 keyReleased
得到下列代码