初学Java第十三天

笔记:

1. 成员内部类:应用率低,了解

   - 类中套类,外面的称为外部类,里面的称为内部类

   - 内部类通常只服务于外部类,对外不具备可见性

   - 内部类对象通常在外部类中创建

   - 内部类中可以直接访问外部类的成员(包括私有的)

     内部类中有个隐式的引用指向了创建它的外部类对象---外部类名.this------API时会用

   ```java
   public class InnerClassDemo {
       public static void main(String[] args) {
           Mama m = new Mama();
           //Baby b = new Baby(); //编译错误,内部类对外不具备可见性
       }
   }
   
   class Mama{ //外部类
       private String name;
       void create(){
           Baby b = new Baby(); //正确
       }
       class Baby{ //内部类
           void showName(){
               System.out.println(name);
               System.out.println(Mama.this.name); //Mama.this指代当前对象的外部类对象
               //System.out.println(this.name); //编译错误,this指代当前Baby对象
           }
       }
   }
   ```

2. 匿名内部类:重点-----------------大大简化代码

   - 若想创建一个类(派生类)的对象,并且对象只被创建一次,可以做成匿名内部类
   - 匿名内部类中不能修饰外面局部变量的值,因为在此处该变量会默认为final的

   ```java
   public class AnonInnerClassDemo {
       public static void main(String[] args) {
           //new Aoo(); //创建Aoo对象
           //new Aoo(){}; //创建Aoo的派生类的对象
   
           //1)创建了Aoo的一个派生类,但是没有名字
           //2)为该派生类创建了一个对象,名为o1
           //3)大括号中的为派生类的类体
           Aoo o1 = new Aoo(){ //向上造型
           };
   
           //1)创建了Aoo的一个派生类,但是没有名字
           //2)为该派生类创建了一个对象,名为o2
           //3)大括号中的为派生类的类体
           Aoo o2 = new Aoo(){
   
           };
   
           int num = 5;
           num = 55;
           //1)创建了Boo的一个派生类,但是没有名字
           //2)为该派生类创建了一个对象,名为o3
           //3)大括号中的为派生类的类体
           Boo o3 = new Boo(){
               void show(){ //重写Boo类的抽象方法
                   System.out.println("showshow");
                   //num = 66; //编译错误,在此处会默认num为final的---API时会用
               }
           };
           o3.show();
       }
   }
   
   abstract class Boo{
       abstract void show();
   }
   
   abstract class Aoo{
   }
   ```

   

## 精华笔记:

1. 成员内部类:应用率低,了解

   - 类中套类,外面的称为外部类,里面的称为内部类

   - 内部类通常只服务于外部类,对外不具备可见性

   - 内部类对象通常在外部类中创建

   - 内部类中可以直接访问外部类的成员(包括私有的)

     内部类中有个隐式的引用指向了创建它的外部类对象---外部类名.this------API时会用

2. 匿名内部类:重点-----------------大大简化代码

   - 若想创建一个类(派生类)的对象,并且对象只被创建一次,可以做成匿名内部类
   - 匿名内部类中不能修饰外面局部变量的值,因为在此处该变量会默认为final的

## 补充:

1. 隐式的引用:
   - this:指代当前对象
   - super:指代当前对象的超类对象
   - 外部类名.this:指代当前对象的外部类对象
2. 小面试题:
   - 问:内部类有独立的.class吗?
   - 答:有
3. 做功能的套路:
   - 先写行为/方法:
     - 若为对象所特有的行为,就将方法设计在特定的类中
     - 若为所有对象所共有的行为,就将方法设计在超类中
   - 窗口调用:
     - 若为定时发生的,就在定时器中调用
     - 若为事件触发的,就在侦听器中调用---------------明天讲
4. 如何调错:
   - 打桩:
     - System.out.println(数据);

1. 潜艇入场:

   参考代码:

   ```java
   package day07;
   import javax.swing.JFrame;
   import javax.swing.JPanel;
   import java.awt.Graphics;
   import java.util.Arrays;
   import java.util.Random;
   import java.util.Timer;
   import java.util.TimerTask;
   //整个游戏世界
   public class World extends JPanel {
       public static final int WIDTH = 641;
       public static final int HEIGHT = 479;
   
       private Battleship ship = new Battleship(); //战舰
       private SeaObject[] submarines = {}; //潜艇(侦察潜艇、鱼雷潜艇、水雷潜艇)
       private Mine[] mines = {}; //水雷
       private Bomb[] bombs = {}; //深水炸弹
   
       /** 随机生成潜艇 */
       public SeaObject nextSubmarine(){
           Random rand = new Random();
           int type = rand.nextInt(20);
           if(type<10){
               return new ObserveSubmarine();
           }else if(type<15){
               return new TorpedoSubmarine();
           }else{
               return new MineSubmarine();
           }
       }
   
       private int subEnterIndex = 0;
       /** 潜艇入场 */
       public void submarineEnterAction(){ //每10毫秒走一次
           subEnterIndex++;
           if(subEnterIndex%40==0){ //每400毫秒
               SeaObject obj = nextSubmarine();
               submarines = Arrays.copyOf(submarines,submarines.length+1);
               submarines[submarines.length-1] = obj;
           }
       }
   
       /** 启动程序的运行 */
       public void action(){
           Timer timer = new Timer();
           int interval = 10;
           timer.schedule(new TimerTask() {
               public void run() {
                   submarineEnterAction(); //潜艇(侦察、水雷、鱼雷)入场
                   repaint();
               }
           }, interval, interval);
       }
   
       public void paint(Graphics g){
           Images.sea.paintIcon(null,g,0,0); //画海洋图
           ship.paintImage(g);
           for(int i=0;i<submarines.length;i++){
               submarines[i].paintImage(g);
           }
           for(int i=0;i<mines.length;i++){
               mines[i].paintImage(g);
           }
           for(int i=0;i<bombs.length;i++){
               bombs[i].paintImage(g);
           }
       }
   
       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(WIDTH+16, HEIGHT+39);
           frame.setLocationRelativeTo(null);
           frame.setVisible(true);
           world.action();
       }
   }


2. 水雷入场:

   ```java
   package day07;
   import javax.swing.ImageIcon;
   //水雷潜艇
   public class MineSubmarine extends SeaObject {
       public MineSubmarine(){
           super(63,19);
       }
   
       public void move(){
           x+=speed;
       }
   
       public ImageIcon getImage(){
           return Images.minesubm;
       }
   
       /** 生成水雷对象 */
       public Mine shootMine(){
           int x = this.x+this.width; //x:潜艇的x+潜艇的宽
           int y = this.y-5;          //y:潜艇的y-5
           return new Mine(x,y);
       }
   }
   
   package day07;
   import javax.swing.JFrame;
   import javax.swing.JPanel;
   import java.awt.Graphics;
   import java.util.Arrays;
   import java.util.Random;
   import java.util.Timer;
   import java.util.TimerTask;
   //整个游戏世界
   public class World extends JPanel {
       public static final int WIDTH = 641;
       public static final int HEIGHT = 479;
   
       private Battleship ship = new Battleship(); //战舰
       private SeaObject[] submarines = {}; //潜艇(侦察潜艇、鱼雷潜艇、水雷潜艇)
       private Mine[] mines = {}; //水雷
       private Bomb[] bombs = {}; //深水炸弹
   
       /** 随机生成潜艇 */
       public SeaObject nextSubmarine(){
           Random rand = new Random();
           int type = rand.nextInt(20);
           if(type<10){
               return new ObserveSubmarine();
           }else if(type<15){
               return new TorpedoSubmarine();
           }else{
               return new MineSubmarine();
           }
       }
   
       private int subEnterIndex = 0;
       /** 潜艇入场 */
       public void submarineEnterAction(){ //每10毫秒走一次
           subEnterIndex++;
           if(subEnterIndex%40==0){ //每400毫秒
               SeaObject obj = nextSubmarine();
               submarines = Arrays.copyOf(submarines,submarines.length+1);
               submarines[submarines.length-1] = obj;
           }
       }
       
       private int mineEnterIndex = 0;
       /** 雷(鱼雷、水雷)入场 */
       public void MineEnterAction(){
           mineEnterIndex++;
           if(mineEnterIndex%100==0){
               //如下代码暂时搁置-----第9天才讲到
           }
       }
   
       /** 启动程序的运行 */
       public void action(){
           Timer timer = new Timer();
           int interval = 10;
           timer.schedule(new TimerTask() {
               public void run() {
                   submarineEnterAction(); //潜艇(侦察、水雷、鱼雷)入场
                   MineEnterAction();      //水雷入场
                   repaint();
               }
           }, interval, interval);
       }
   
       public void paint(Graphics g){
           Images.sea.paintIcon(null,g,0,0); //画海洋图
           ship.paintImage(g);
           for(int i=0;i<submarines.length;i++){
               submarines[i].paintImage(g);
           }
           for(int i=0;i<mines.length;i++){
               mines[i].paintImage(g);
           }
           for(int i=0;i<bombs.length;i++){
               bombs[i].paintImage(g);
           }
       }
   
       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(WIDTH+16, HEIGHT+39);
           frame.setLocationRelativeTo(null);
           frame.setVisible(true);
           world.action();
       }
   }


3. 海洋对象移动:

   完整代码:

   ```java
   package day07;
   import javax.swing.JFrame;
   import javax.swing.JPanel;
   import java.awt.Graphics;
   import java.util.Arrays;
   import java.util.Random;
   import java.util.Timer;
   import java.util.TimerTask;
   //整个游戏世界
   public class World extends JPanel {
       public static final int WIDTH = 641;
       public static final int HEIGHT = 479;
   
       private Battleship ship = new Battleship(); //战舰
       private SeaObject[] submarines = {}; //潜艇(侦察潜艇、鱼雷潜艇、水雷潜艇)
       private Mine[] mines = {}; //水雷
       private Bomb[] bombs = {}; //深水炸弹
   
       /** 随机生成潜艇 */
       public SeaObject nextSubmarine(){
           Random rand = new Random();
           int type = rand.nextInt(20);
           if(type<10){
               return new ObserveSubmarine();
           }else if(type<15){
               return new TorpedoSubmarine();
           }else{
               return new MineSubmarine();
           }
       }
   
       private int subEnterIndex = 0;
       /** 潜艇入场 */
       public void submarineEnterAction(){ //每10毫秒走一次
           subEnterIndex++;
           if(subEnterIndex%40==0){ //每400毫秒
               SeaObject obj = nextSubmarine();
               submarines = Arrays.copyOf(submarines,submarines.length+1);
               submarines[submarines.length-1] = obj;
           }
       }
       
       private int mineEnterIndex = 0;
       /** 雷(鱼雷、水雷)入场 */
       public void MineEnterAction(){
           mineEnterIndex++;
           if(mineEnterIndex%100==0){
               //如下代码暂时搁置-----第9天才讲到
           }
       }
       
       /** 海洋对象移动 */
       public void moveAction(){
           for(int i=0;i<submarines.length;i++){
               submarines[i].move();
           }
           for(int i=0;i<mines.length;i++){
               mines[i].move();
           }
           for(int i=0;i<bombs.length;i++){
               bombs[i].move();
           }
       }
   
       /** 启动程序的运行 */
       public void action(){
           Timer timer = new Timer();
           int interval = 10;
           timer.schedule(new TimerTask() {
               public void run() {
                   submarineEnterAction(); //潜艇(侦察、水雷、鱼雷)入场
                   MineEnterAction();      //水雷入场
                   moveAction();           //海洋对象移动
                   repaint();
               }
           }, interval, interval);
       }
   
       public void paint(Graphics g){
           Images.sea.paintIcon(null,g,0,0); //画海洋图
           ship.paintImage(g);
           for(int i=0;i<submarines.length;i++){
               submarines[i].paintImage(g);
           }
           for(int i=0;i<mines.length;i++){
               mines[i].paintImage(g);
           }
           for(int i=0;i<bombs.length;i++){
               bombs[i].paintImage(g);
           }
       }
   
       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(WIDTH+16, HEIGHT+39);
           frame.setLocationRelativeTo(null);
           frame.setVisible(true);
           world.action();
       }
   }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值