1. 面向对象
1.1 package和import:
- package:声明包
- 作用:为了避免类的命名冲突
- 同包中的类不能同名,但不同包中的类可以同名
- 类的全称:包名.类名,包名常常有层次结构
- 建议:包名所有字母都小写
- import:导入类
- 同包中的类可以直接访问,但不能包中的类不能直接访问,若想访问:
- 先import导入类再访问类------建议
- 类的全称----------------------------太繁琐,不建议
- 同包中的类可以直接访问,但不能包中的类不能直接访问,若想访问:
1.2.访问控制修饰符:-----------保护数据的安全
- public:公开的,任何类
- private:私有的,本类
- protected:受保护的,本类、派生类、同包类
- 默认的:什么也不写,本类、同包类--------------------------------不建议
- 注意:
- 1. 类的访问权限只能是public或默认的
- 2. 类中成员的访问权限如上4种都可以
package ooday05;
//访问控制修饰符的演示
public class Aoo {
public int a; //任何类
protected int b; //本类、派生类、同包类
int c; //本类、同包类
private int d; //本类
void show(){
a = 1;
b = 2;
c = 3;
d = 4;
}
}
class Boo{ //---------------------演示private
void show(){
Aoo o = new Aoo();
o.a = 1;
o.b = 2;
o.c = 3;
//o.d = 4; //编译错误
}
}
package ooday05_vis;
import ooday05.Aoo;
public class Coo { //--------------演示同包的
void show(){
Aoo o = new Aoo();
o.a = 1;
//o.b = 2; //编译错误
//o.c = 3; //编译错误
//o.d = 4; //编译错误
}
}
class Doo extends Aoo{ //跨包继承------演示protected
void show(){
a = 1;
b = 2;
//c = 3; //编译错误
//d = 4; //编译错误
}
}
1.3final:最终的、不可改变的----------单独应用几率低
- 修饰变量:变量不能被改变
class Eoo{
final int num = 5;
void show(){
//num = 55; //编译错误,final的变量不能被改变
}
}
- 修饰方法:方法不能被重写
//演示final修饰方法
class Foo {
final void show(){}
void test(){}
}
class Goo extends Foo{
//void show(){} //编译错误,final的方法不能被重写
void test(){}
}
- 修饰类:类不能被继承
//演示final修饰类
final class Hoo{}
//class Ioo extends Hoo{} //编译错误,final的类不能被继承
class Joo{}
final class Koo extends Joo{} //正确,不能当老爸,但能当儿子
1.4static:静态的
- 静态变量:
- 由static修饰
- 属于类,存储在方法区中,只有一份
- 常常通过类名点来访问
- 何时用:所有对象所共享的数据(图片、音频、视频等)
class Loo{
int a; //实例变量
static int b; //静态变量
Loo(){
a++;
b++;
}
void show(){
System.out.println("a="+a+",b="+b);
}
}
public class StaticDemo {
public static void main(String[] args) {
Loo o1 = new Loo();
o1.show();
Loo o2 = new Loo();
o2.show();
Loo o3 = new Loo();
o3.show();
System.out.println(Loo.b); //常常通过类名点来访问
}
}
- 静态方法:
- 由static修饰
- 属于类,存储在方法区中,只有一份
- 常常通过类名点来访问
- 静态方法中没有隐式this传递,所以不能直接访问实例成员,只能直接访问静态成员
- 何时用:方法的操作与对象无关(不需要操作对象的数据)
class Moo{
int a; //实例变量(对象点来访问)
static int b; //静态变量(类名点来访问)
void show(){ //有隐式this
System.out.println(this.a);
System.out.println(Moo.b);
}
static void test(){ //没有隐式this
//静态方法没有隐式this传递
//没有this就意味着没有对象
//而实例变量a必须由对象点来访问
//所以如下语句发生编译错误
//System.out.println(a); //编译错误
System.out.println(Moo.b);
}
}
//演示静态方法何时用
class Noo{
int a; //实例变量(描述对象的属性)
//在show()中访问对象的属性a了,说明show()与对象有关,不能设计为静态方法
void show(){
System.out.println(a);
}
//在plus()中并没有访问对象的属性,说明plus()与对象无关,可以设计为静态方法
static int plus(int num1,int num2){
int num = num1+num2;
return num;
}
}
public class StaticDemo {
public static void main(String[] args) {
Moo.test(); //常常通过类名点来访问
}
}
1.5静态代码块:
- 由static修饰
- 属于类,在类被加载期间自动执行,一个类只被加载一次,所以静态块只执行一次
- 何时用:初始化/加载静态资源(图片、音频、视频等)
//演示静态块
class Poo{
static{
System.out.println("静态块");
}
Poo(){
System.out.println("构造方法");
}
}
public class StaticDemo {
public static void main(String[] args) {
//1)加载Poo.class到方法区中,同时自动执行静态块
//2)new Poo()时,自动调用构造方法
Poo o4 = new Poo();
//1)new Poo()时,自动调用构造方法
Poo o5 = new Poo();
//1)new Poo()时,自动调用构造方法
Poo o6 = new Poo();
}
}
2. 潜艇游戏第五天:
- 给类中成员添加访问控制修饰符
- 设计Images图片类
2.1代码project目录
2.1.1Battleship类
package cn.tedu.submarine;
import java.util.Objects;
/**
* 战舰
*/
public class Battleship extends SeaObject{
/**
* 命
*/
private int life;
public Battleship() {
super(66,26,270,124,5);
this.life = 5;
}
@Override
public void move() {
}
/**
* 发射炸弹的方法
*/
public void shootBomb(){
}
}
2.1.2Bomb类
package cn.tedu.submarine;
import java.util.Objects;
/**
* 炸弹
*/
public class Bomb extends SeaObject{
public Bomb(int x , int y) {
super(9,12,x,y,3);
}
/**
* 炸弹移动的方法
*/
@Override
public void move() {
y += speed;
}
}
2.1.3Images类(今天新增)
package cn.tedu.submarine;
import javax.swing.ImageIcon;
public class Images {
/**
* 背景图
*/
public static ImageIcon sea;
/**
* 战舰图
*/
public static ImageIcon battleship;
/**
* 炸弹图片
*/
public static ImageIcon bomb;
/**
* 游戏结束
*/
public static ImageIcon gameover;
/**
* 水雷图片
*/
public static ImageIcon mine;
/**
* 水雷潜艇
*/
public static ImageIcon minesubm;
/**
* 侦察潜艇
*/
public static ImageIcon obsersubm;
/**
* 鱼类潜艇
*/
public static ImageIcon torpesubm;
/**
* 初始化图片
*/
static {
battleship = new ImageIcon("img/battleship.png");
sea = new ImageIcon("img/sea.png");
bomb = new ImageIcon("img/bomb.png");
gameover = new ImageIcon("img/gameover.png");
mine = new ImageIcon("img/mine.png");
minesubm = new ImageIcon("img/minesubm.png");
obsersubm = new ImageIcon("img/obsersubm.png");
torpesubm = new ImageIcon("../mysubmarine/img/torpesubm.png");
}
/**
* 测试图片
* @param args
*/
public static void main(String[] args) {
//返回8表示成功了
System.out.println(battleship.getImageLoadStatus());
}
}
2.1.4Mine类
package cn.tedu.submarine;
import java.util.Objects;
/**
* 水雷
*/
public class Mine extends SeaObject{
public Mine(int x , int y) {
super(11,11,x,y,1);
}
/**
* 水雷移动的方法
*/
@Override
public void move() {
y-=speed;
}
}
2.1.5MineSubMarine类
package cn.tedu.submarine;
import java.util.Objects;
import java.util.Random;
/**
* 水雷潜艇
*/
public class MineSubmarine extends SeaObject{
public MineSubmarine() {
super(63,19);
}
@Override
public void move() {
x+=speed;
}
}
2.1.6ObserverSubMarine类
package cn.tedu.submarine;
import java.util.Objects;
import java.util.Random;
/**
* 侦察潜艇
*/
public class ObserverSubmarine extends SeaObject{
public ObserverSubmarine() {
super(63,19);
}
@Override
public void move() {
x+=speed;
}
}
2.1.7SeaObject类
package cn.tedu.submarine;
import java.util.Random;
/**
* 海洋对象
*/
public abstract class SeaObject {
/**
* 成员变量一般都要private的
* 此处设计为protected
* 因为还没有讲到getter/setter
*/
/**
* 宽
*/
protected int width;
/**
* 高
*/
protected int height;
/**
* x轴
*/
protected int x;
/**
* y轴
*/
protected int y;
/**
* 速度
*/
protected int speed;
public SeaObject(int width,int height,int x , int y,int speed){
this.width = width;
this.height = height;
this.x = x;
this.y = y;
this.speed = speed;
}
public SeaObject(int width,int height){
this.width = width;
this.height = height;
Random rand = new Random();
x = -width;
y = rand.nextInt(479-height-150+1 ) +150;
this.speed = rand.nextInt(3)+1;
}
/**
* 移动的方法
*/
public abstract void move();
}
2.1.8TorpedoSubmarine类
package cn.tedu.submarine;
import java.util.Objects;
import java.util.Random;
/**
* 鱼类潜艇
*/
public class TorpedoSubmarine extends SeaObject{
public TorpedoSubmarine() {
super(64,20);
}
/**
* 鱼类潜艇移动的方法
*/
@Override
public void move() {
x+=speed;
}
}
2.1.9World(测试类)
package cn.tedu.submarine;
import javax.swing.*;
/**
* 整个游戏世界
*/
public class World extends JPanel {
public static void main(String[] args) {
JFrame frame = new JFrame();
World world = new World();
world.setFocusable(true);
frame.add(world);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(641+16,479+39);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
/*
ObserverSubmarine os = new ObserverSubmarine();
System.out.println("原始数据---- x:"+os.x+",y:"+os.y+",speed:"+os.speed);
os.move();
System.out.println("移动后数据---- x:"+os.x+",y:"+os.y+",speed:"+os.speed);
TorpedoSubmarine ts = new TorpedoSubmarine();
System.out.println("原始数据---- x:"+ts.x+",y:"+ts.y+",speed:"+ts.speed);
ts.move();
System.out.println("移动后数据---- x:"+ts.x+",y:"+ts.y+",speed:"+ts.speed);
MineSubmarine ms = new MineSubmarine();
System.out.println("原始数据---- x:"+ms.x+",y:"+ms.y+",speed:"+ms.speed);
ms.move();
System.out.println("移动后数据---- x:"+ms.x+",y:"+ms.y+",speed:"+ms.speed);
Bomb b = new Bomb(150,300);
System.out.println("原始数据---- x:"+b.x+",y:"+b.y+",speed:"+b.speed);
b.move();
System.out.println("移动后数据---- x:"+b.x+",y:"+b.y+",speed:"+b.speed);
Mine m = new Mine(100,120);
System.out.println("原始数据---- x:"+m.x+",y:"+m.y+",speed:"+m.speed);
m.move();
System.out.println("移动后数据---- x:"+m.x+",y:"+m.y+",speed:"+m.speed);
// Battleship s = new Battleship();
// System.out.println(s.x+","+s.y+","+s.speed);
// s.move();
// SeaObject[] subMarines = new SeaObject[5];
// subMarines[0] = new ObserverSubmarine();
// subMarines[1] = new MineSubmarine();
// subMarines[2] = new TorpedoSubmarine();
// subMarines[3] = new ObserverSubmarine();
// subMarines[4] = new TorpedoSubmarine();
//
// for (int i = 0; i < subMarines.length; i++) {//遍历所有的潜艇
// SeaObject so = subMarines[i];
// System.out.println(so.x+","+so.y+","+so.speed);
// subMarines[i].move();
// }
//
// ObserverSubmarine[] oses = new ObserverSubmarine[3];
// oses[0] = new ObserverSubmarine();
// oses[1] = new ObserverSubmarine();
// oses[2] = new ObserverSubmarine();
// for (int i = 0; i < oses.length; i++) {
// System.out.println(oses[i].x+","+oses[i].y+","+oses[i].speed);//输出每个侦察挺的x和y坐标
// oses[i].move();
// }
// Bomb[] bs = new Bomb[3];
// bs[0] = new Bomb(100,522);
// bs[1] = new Bomb(145,243);
// bs[2] = new Bomb(113,443);
// for (int i = 0; i < bs.length; i++) {
// Bomb b = bs[i];
// System.out.println(b.x+","+b.y+","+b.speed);
// bs[i].move();
// //炸弹移动
// //炸弹打潜艇
// }
//
// Mine[] ms = new Mine[2];
// ms[0] = new Mine(241,22);
// ms[1] = new Mine(341,112);
// for (int i = 0; i < ms.length; i++) {
// Mine m = ms[i];
// System.out.println(m.x+","+m.y+","+m.speed);
// ms[i].move();
// }
*/
}
}
3.补充
3.1顺序问题:如果有的话
- package在最上面
- import在package的下面
- class在import的下面
3.2成员变量分为如下两种:- 下午画内存图来详细讲解
- 实例变量:没有static修饰,属于对象的,存储在堆中,有几个对象就有几份,
通过引用名/对象打点来访问
- 静态变量:由static修饰,属于类的,存储在方法区中,只有一份
通过类名打点来访问
3.3内存管理:由JVM来管理
- 堆:new出来的对象(包括实例变量、数组元素)
- 栈:局部变量(包括方法的参数)
- 方法区:.class字节码文件(包括静态变量、所有方法)
3.4给成员变量赋值规则:
- 静态变量,一般在静态块中初始化
- 实例变量,一般在构造方法中初始化
3.5明日单词:
1)graphics:图像/画笔
2)PI:圆周率
3)count:数量
4)abstract:抽象的
5)live:活着的
6)dead:死了的
7)state:状态
8)is:是
9)paint:画