华清远见嵌入式学习day42——Java多态性

回顾:
 1:继承
 关键字: extends
 格式:
 class 子类名 extends 父类名{}
 eg:
 class Animal{
   String name;
   int age;
   public void eat(){
   System.out.print("eat")
   }
 }
 //在创建对象的时候
 可以创建一个Animal类
 Animal a = new Animal()
 因为Animal不应该能被实例化
 应该是一个抽象的 所以我就想把Animal
 定义成抽象类
 因为每个动物吃的东西也不一样,那我就
 不想再Animal类里来写出吃的具体实现
 把eat()写成抽象方法,未来具体的类
 继承Animal后该吃什么吃什么
 9:20代码及笔记:
 ----------------------------------
 package com.hqyj.demo;
/**
 * 抽象的动物类
 * 格式
 * public abstract class Animal{}
 * 抽象方法格式: 没有方法体也没有{}
 * public abstract void sleep() ;
 * 暂时只写成员变量 和成员方法
 *  抽象类里可以有非抽象方法 和抽象方法
 *  有抽象方法的类必须定义成抽象类
 * @author zj
 *
 */
public abstract  class Animal {
    String name ;
    int age;
    
    public void eat() {
        System.out.println("eat");
    }
    //抽象方法
    public abstract void sleep() ;
    

}
---------------------------------------
9:20后到下课时间的代码
----------------------------------
抽象的Animal 类
package com.hqyj.demo;
/**
 * 抽象的动物类
 * 格式
 * public abstract class Animal{}
 * 抽象方法格式: 没有方法体也没有{}
 * public abstract void sleep() ;
 * 暂时只写成员变量 和成员方法
 *  抽象类里可以有非抽象方法 和抽象方法
 *  有抽象方法的类必须定义成抽象类
 * @author zj
 *
 */
public abstract  class Animal {
    String name ;
    int age;
    public void eat() {
        System.out.println("eat");
    }
    //抽象方法
    public abstract void sleep() ;    

}
//练习到  9:40的时候 
//放demo出来
//9:45
--------------------------------------
Animal的子类 Cat
--------------------------------------
package com.hqyj.demo;
/**
 * 继承抽象Animal的具体类
 *  抽象类里的抽象方法 是要求子类必须重写的方法
 * @author zj
 *
 */
public class Cat extends Animal{
    public void sleep() {
        System.out.println("cat 趴着睡");
    }
    public void play() {
        System.out.println("cat 玩老鼠");
    }

}
--------------------------------------------
测试类
-----------------------------------
package com.hqyj.demo;
/**
 * 测试类
 * @author zj
 *
 */
public class Demo {

    public static void main(String[] args) {
        //创建抽象的Animal对象
    //    Animal a = new Animal();//直接给创想类创建对象 这个时候会报错
        //只能通过多态创建Animal对象
        Animal a = new Cat();
        a.name="小猫";
        a.eat();
        a.sleep();
        //a.play();  不能访问子类特有方法
        //直接创建子类对象
        Cat c = new  Cat();
        c.play();
        c.sleep();
        c.eat();
        //向下转型
        Cat  cc = (Cat) a;
        cc.play();
    }

}
--------------------------------------
 第二节课开始 10:00
小结一下抽象类
 1:抽象类的关键字:abstract
 2:抽象类里可以有抽象方法 
    也可以有非抽象方法
 3:有抽象方法的类必须定义成抽象方法
 4:抽象方法定义:没有方法体的方法
   eg: public abstract void eat();
   
 5:抽象方法的使用:
    1:不能直接创建对象(实例化)
    2:只能通过多态来创建对象
        注意:多态创建的对象不能
        访问子类特有功能
 
--------------------------------------
动物园马戏团:狗跳高,猴子骑自行车
不是天生就有的功能我们它定义在Animal
里不合适 定义再Dog也不合适;这种东西都是
通过后天培训出来的,这种培训出来的东西
java提供了接口来定义,未来谁想要拥有
这种特长就需要自己去实现接口,
------------------------------------
10:30
------------------------------------
package com.hqyj.demo2;
/**
 * 跳高接口
 * 接口是一个特殊的抽象类
 * 格式:
 *  访问修饰符 interface  接口名{}
 *  
 *  接口的成员:
 * 1: jdk8以前只能是 抽象方法
 *  默认访问修饰符: public abstract
 *      public abstract void show();
 *      jdk 8以后 接口中可以定义静态方法
 *      还可以:
             public  default void show2() {
                System.out.println("show2");
                //i++;
                System.out.println(i);
            }
 *  
 *  2:接口中只能定义静态常量
 *   默认修饰符:public final static 
 * @author zj  //练习到10:34
 */
public interface InterJump {
    public final static int i  =10;
    public abstract void show();
    //jdk8以后的新特性
    public  default void show1() {
        System.out.println("show2");
        //i++;
        System.out.println(i);
    }
    public  static void show2() {
        System.out.println("show2");
        //i++;
        System.out.println(i);
    }

}
--------------------------------------
11:10代码讲解
----------------------------------------
package com.hqyj.demo2;
/**
 * 跳高接口
 * 接口和类的关系是实现 
 * @author zj
 *
 */
public interface Jump {
    //抽象的跳高方法
    public abstract void jumpping();
}
-----------------------------------
具体类实现接口代码
----------------------------------
package com.hqyj.demo2;
/**
 * 接口是一个特殊的抽象类
 * 实现跳高接口
 * 关键字:implements
 * 格式: public class Dog implements Jump{

        }
  抽象类 和具体类都可以实现接口
  但是: 具体类要求必须重写接口中的抽象方法
           抽象类 就没这个要求
           eg:
           abstract class Dog1 implements Jump{}
 * @author zj
 *
 */
public class Dog implements Jump{
    //重写接口里的抽象方法
    @Override
    public void jumpping() {
        System.out.println("jump dog");
    }
}
//
//abstract class Dog1 implements Jump{    
//}
//练习到下下课
-------------------------------------
测试类
---------------------------------------
package com.hqyj.demo2;
/**
 * 接口测试类
 * @author zj
 */
public class Demo {
    public static void main(String[] args) {
        //接口不能直接创建对象
        //Jump j = new Jump() ;//抽象类
        //多态来创建接口对象 父类的引用指向子类
        Jump j = new Dog();
        j.jumpping();
        //j能不能调用 dog里特有的方法
        
    }
}
-------------------------------------------
11:20看接口其他特点
类和类之间的关系:
    继承关系:单继承 多层继承
接口和接口之间的关系:
    继承 :多继承
类和接口之间的关系
    实现关系: 实现多个接口
    
-----------------------------------
接口和接口之间的关系:
    继承 :多继承 代码下下面
---------------------------------
package com.hqyj.demo3;
/**
 * 接口和接口的关系:
 *  多继承 格式: interface InterDemo extends A,B
 * @author zj
 *
 */
public interface InterDemo extends A,B {

}
//接口
interface A{}
interface B{}
--------------------------------------
接口和类的关系 :实现
--------------------------------------
package com.hqyj.demo3;
/**
 * 类和接口关系:实现实现多个接口
 * 
 * 继承
 * 还可以继承一个类再实现多个接口
 * @author zj
 */
public class InterDemo2 extends 
            Object 
            implements A1,B1 {
}
//接口
interface A1{}
interface B1{}
--------------------------------------
从现在开始前面基础好坏先放一下
----------------------------------
内部类:
----------------------------------------
package com.hqyj.demo4;
/**
 * 内部类:
 *  把一个类定义在另一个类的内部
 *  
 *  内部类的分类:
 *   1:成员内部类
 *   2:局部内部类
 * @author zj
 *
 */
public class Outer {
    class Inner{}

}
----------------------------------------
分类两大类:
1:成员内部类
2:局部内部类
-------------------------------------------
package com.hqyj.demo4;
/**
 * 内部类的分类:
 *   1:成员内部类:
 *        内部类定义在外部类成员的位置
 *   2:局部内部类:
 *           内部类定义在外部类局部的位置
 * @author zj
 *
 */
public class Outer2 {
    //成员内部类
    class Inner2{}
    //方法
    public void show() {
        //局部内部类
        class Inner3{}
    }

}
--------------------------------------
成员内部的访问特点:
成员内部类访问特点:
 *    1:内部类可以直接访问外部类的成员包括私有的
 *    2:外部类访问内部类 必须创建对象
---------------------------------------
package com.hqyj.demo4;
/**
 * 内部类的分类:
 *   1:成员内部类:
 *        内部类定义在外部类成员的位置
 *   2:局部内部类:
 *           内部类定义在外部类局部的位置
 *   
 *   成员内部类访问特点:
 *    1:内部类可以直接访问外部类的成员包括私有的
 *    2:外部类访问内部类?
 * @author zj
 */
public class Outer3 {
    private  int num = 10;
    //成员内部类
    class Inner2{
        //方法
        public void show() {
            System.out.println(num);
            method();
        }
    }  //停留到58  然后再看下面内容
    //外部类的成员方法
    private void method() {
        // syso+Alt+/
        System.out.println("method");
        //创建内部类对象 在调用
        Inner2 in = new Inner2();
        in.show();
    }
}
-----------------------------------------

下午:
成员内部类的访问
=======================================
成员内部类
-----------------------------------
package com.hqyj.demo4;
/**
 * 内部类的分类:
 *   1:成员内部类:
 *        内部类定义在外部类成员的位置
 *   2:局部内部类:
 *           内部类定义在外部类局部的位置
 *   
 *   成员内部类访问特点:
 *    1:内部类可以直接访问外部类的成员包括私有的
 *    2:外部类访问内部类?
 * @author zj
 */
public class Outer3 {
    private  int num = 10;
    //成员内部类
    class Inner2{
        //方法
        public void show() {
            System.out.println(num);
            method();
        }
    }  
    //外部类的成员方法
    public  void method() {
        System.out.println("method");
        
    }
}
------------------------------------
测试类: 在这里创建内部类的对象
格式:
外部类.内部类 对象名 = 
    new 外部类().new 内部类()
-------------------------------------
package com.hqyj.demo4;
/**
 * 对外部类Outer3创建对象调用方法
 * 创建内部类格式:
 * 外部类名.内部类名 对象名 = 外部类对象.内部类对象;

 * @author zj
 *
 */
//测试 
public class Demo {

    public static void main(String[] args) {
        //对外部类Outer3创建对象调用方法
        Outer3 outer  =new Outer3();
        outer.method();
        //创建内部类对象 调用内部类里的show方法
        //外部类名.内部类名 对象名 = 外部类对象.内部类对象;
        Outer3.Inner2 in = new Outer3().new Inner2();
        in.show();
        //练习到13:50

    }

}
-------------------------------------
静态内部类:
就是成员内部类加上static 
-----------------------------------------
package com.hqyj.demo5;
/**
 * 成员内部类
 * 静态内部类:就是成员内部类加static
 *   注意:静态的只能访问静态的
 *        静态内部类只能访问外部类的静态成员
 * @author zj
 *
 */
public class Outer {
    int num = 10;
    static int num2 = 10;
    //静态内部类
    public static class Inner{
        public void show() {
        //    System.out.println(num);
            System.out.println(num2);
        }
        public static void show2() {
            //    System.out.println(num);
                System.out.println(num2);
            }
    
    }

}
------------------------------------------------
测试类: 
访问静态内部类的方法
1:非静态的  :创建对象在调用
2:静态的      :可以外部类.内部类.方法名()
创建对象格式:
格式:
外部类.内部类 对象名 = 
        new 外部类.内部类();
-------------------------------------------------
package com.hqyj.demo5;
/**
 * 创建静态内部类对象并访问 静态方法和成员方法
 * 外部类名.内部类名 对象名 = new 外部类名.内部类名();
 * 可以把:外部类名.内部类名当作一个整体 

 * @author zj
 *写一下代码:写到14:20
 */
public class Demo {
    public static void main(String[] args) {
        //创建静态内部类对象并访问 静态方法和成员方法
        Outer.Inner oi = new Outer.Inner();
        oi.show();
        oi.show2();
        //静态方法可以类名.方法名()
        Outer.Inner.show2();
    }
}
----------------------------------------------------
14:30
匿名内部类
就是局部内部类的简化写法。
前提:存在一个类或者接口
这里的类可以是具体类也可以是抽象类。
格式:
new 类名或者接口名() {重写方法;}

匿名内部类隐式地继承了一个父类或者实现了一个接口。

匿名内部类使用得比较多,通常是作为一个方法参数。

---------------------------------------------

package com.hqyj.demo7;
/**
 * 匿名内部类:是一个局部内部类
 * 格式:
 *  new 类名/接口名(){
 *    重写接口里的方法
 *  }
 *  
 *  前提: 接口
 *  实质上是:
 *   一个实现了接口的具体类的对象
 *   
 *   想调用谁的方法 就需要创建谁的对象.方法()
 * @author zj
 */
//接口
interface inter{
    public abstract void show();
}
//外部类  写到15:10
public class Outer {
    
  public void method() { 
       new inter() {
            public void show() {
                System.out.println("show");
            }
        }.show();
      //你匿名内部类 //一个 实现了接口的具体类的对象 .show(); }
  }
}
------------------------------------------
测试类:
---------------------------------------------
package com.hqyj.demo7;

public class Demo {
    public static void main(String[] args) {
        Outer outer = new Outer();
        outer.method();
    }
}
-------------------------------------------------
异常:
1:运行时期异常
    int a = 10 int b =0
    a/b
    运行的时候报错;
    
    这种异常是因为自己代码写的不规范、
    导致的,这种异常需要自己改代码
    不需要去处理
    
2:非运行时期异常 :编译时期异常

3:error:错误 不需要处理
异常处理方式:
 1:捕获
 2:抛出 4:20练习的
--------------------------------------
package com.hqyj.demo8;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

/**
 * 异常:
 * 
 * @author zj
 */
public class Demo {
    public static void main(String[] args)  {
        //文件流的操作  自己捕获异常
            try {
                FileInputStream fis = new FileInputStream("a.txt");
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            //调用method
            try {
                method();
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    }
    
    //方法  我不想处理  谁调用 谁处理  抛出
    public static void method() throws FileNotFoundException  {
        FileInputStream fis = new FileInputStream("a.txt");
        //
    }//异常 练习到16:20
}
----------------------------------------
常用类:
Math类 String
Math类里的方法全是static的所以使用的
时候,直接通过类名.就可以
----------------------------------------
package com.hqyj.demo8;
/**
 * Math 类
 * @author zj
 *
 */
public class MathDemo {
    public static void main(String[] args) {
        //绝对值
        System.out.println(Math.abs(-12));
        System.out.println(Math.max(10, 20));
        // 0.0~1.0   无限接近1
        System.out.println(Math.random());
        // 1~10的随机数    //0.0 ~10.0 无限接近10
        System.out.println(Math.random()*10);
        // 0~9
        System.out.println((int)(Math.random()*10));
        // 1~10
        System.out.println((int)(Math.random()*10+1));
        
        
    }

}
-------------------------------------------
String类:不可改变的字符序列
---------------------------------------------
package com.hqyj.demo8;
/**
 * String 一组不可改变的字符序列
 *  "hello" 会在常量池
 *  "java" 会在常量池
 *  "hellojava"
 * @author zj
 *
 */
public class StringDemo {
    public static void main(String[] args) {
        String str1 = "helLO";//hello
        String str2 = "java";//java
        System.out.println(str1+str2);//hellojava
        System.out.println(str1.charAt(1));
        System.out.println(str1.toLowerCase());
    }
}

 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值