潭州Java中级班(day_10)-静态代码块,构造代码块,单例设计模式,重写,多态

Day09面向对象(三)

1. 静态代码块

 * 静态代码块格式:

 *         static{

 *         

 *         }

 * 特点:

 *     1.创建对象的时候会调用静态代码块。

 *     2.静态代码块只执行一次。

 *     3.静态代码块>构造代码块>构造函数。

/**
 * 这个类是讲述静态代码块
 * @ClassName:     Demo1Static.java
 * @Description:   TODO  
 * @author         Jim老师 
 * @version        jdk8.0  
 * @Date           2018年8月29日   下午7:24:09 
                     无敌是多么的寂寞
                     男人不能说不行,不行也得行
 */
/*
 * 静态代码块格式:
 *         static{
 *         
 *         }
 * 特点:
 *     1.创建对象的时候会调用静态代码块。
 *     2.静态代码块只执行一次。
 *     3.静态代码块>构造代码块>构造函数。
 */
class  User{
       static   {
             System.out.println("1.开东风悦达起亚");
       }
       static   {
             System.out.println("2.开宝马X6");
       }
       public   User(){
             System.out.println("3.开法拉利");
       }
}
public class Demo1Static {
       public static void main(String[] args) {
                 new    User();  //1   2   3
                 new    User();  //3
       }
}

2. 构造代码块

 * 构造代码块:

 *        {

 *        

 *        }

 * 特点:

 *      1.执行构造函数的时候会调用构造代码块,也就说每调用一次构造函数,就执行一次构造代码块。

 *      2.构造代码块优先于构造函数执行。

 *      3.静态的是随着类的加载而加载,非静态成员是随着对象的加载而加载。

 *      4.静态代码块优先于构造代码块。

/**
 * 这个类是讲述构造代码块
 * @ClassName:     Demo2Construtor.java
 * @Description:   TODO  
 * @author         Jim老师 
 * @version        jdk8.0  
 * @Date           2018年8月29日   下午7:26:05 
                     无敌是多么的寂寞
                     男人不能说不行,不行也得行
 */
/*
 * 构造代码块:
 *        {
 *        
 *        }
 * 特点:
 *      1.执行构造函数的时候会调用构造代码块,也就说每调用一次构造函数,就执行一次构造代码块。
 *      2.构造代码块优先于构造函数执行。
 *      3.静态的是随着类的加载而加载,非静态成员是随着对象的加载而加载。
 *      4.静态代码块优先于构造代码块。
 */
class    User2{
        String   name;
        int       age;
        {
                System.out.println("1.开奥拓");
        }
        static{
                System.out.println("3.开拖拉机");//jdbc连接数据库,封装的时候
        }
        public   User2(){
                System.out.println("2.开QQ");
        }
}
public class Demo2Construtor {
        public static void main(String[] args) {
                  new   User2();  //3  1   2
                  new   User2();  //1  2
        }
}

3. 单例设计模式

 * 单例:就是一个实例化,也就说只new了一次.也就是说一个对象被所有人共享

 * 饿汉式:

 *        

  private static   Person    person=new  Person();

 *          public  static      Person      getPerson(){

        return  person;

        }

 * 懒汉式:

 *

 private static   Person     person;

 *          public  static      Person      getPerson(){

        if(person==null){

             person=new  Person();

        }

        return  person;

        }

 *

 * 封装:封装属性和实现细节,仅对外提供公共的方法进行访问。

 * 封装构造函数:private  

 *

 * 引用数据类型的默认值都是null

 

/**
 * 这个类是讲述单例设计模式
 * @ClassName:     Demo3Single.java
 * @Description:   TODO  
 * @author         Jim老师 
 * @version        jdk8.0  
 * @Date           2018年8月29日   下午7:26:58 
                     无敌是多么的寂寞
                     男人不能说不行,不行也得行
 */
/* 
 * 
 * 单例:就是一个实例化,也就说只new了一次.也就是说一个对象被所有人共享。
 * 饿汉式:
 *          private static   Person    person=new  Person();
 *          public  static      Person      getPerson(){
                    return  person;
            }
 * 懒汉式:
 *             private static   Person     person;
 *          public  static      Person      getPerson(){
                    if(person==null){
                            person=new  Person(); 
                    }
                    return  person;
            }
 * 
 * 封装:封装属性和实现细节,仅对外提供公共的方法进行访问。
 * 封装构造函数:private  
 * 
 * 引用数据类型的默认值都是null
 * 
 * 
 * 封装构造函数,然后去调用该类中非静态方法?
 * class  Person{
       private   Person(){
       }
       private   String       name;  
       public     void    setName(String  nn){
                this.name=nn;
       }
   }
 */
class  Person{
       private   static  Person     pp=new  Person();//pp默认是等于null  pp=new  Person();
       private   Person(){
       }
       public  static Person  getInstance(){
                return  pp;
       }
       
//       public  static      Person      getInstance(){
//                if(pp==null){   //pn进来,是第一次,pp是null;
//                                //第二次就不是null,有值
//                    pp=new  Person(); 
//                }
//                return  pp;
//       }
       
}
public class Demo3Single {
       public static void main(String[] args) {
               Person    pn=Person.getInstance();//pn=pp
               
               Person    pn2=Person.getInstance();//pn2=pp
               
               System.out.println(pn==pn2);
               
               
               
//               String  str2=pn2.getName();
//               System.out.println("str2="+str2);
//               
//               
//               pn.setName("潽");
//               String  str=pn.getName();
//               System.out.println("str="+str);
    }
}
/*
 
 class  Person{
       private static   Person     pp;//
       private   Person(){
       }
       public  static      Person      getInstance(){
                if(pp==null){
                    pp=new  Person(); 
                }
                return  pp;
       }
       
       private   String       name;  //私有成员变量,
       //this:。。。的意思   哪个对象调用就指哪个对象。this只能调用成员变量
       public   void    setName(String  nn){//String  name="南浔"
                this.name=nn;
       }
       public    String    getName(){
                return  name;
       }
}
 
 
 */

 

问题:

 * 封装构造函数,然后去调用该类中非静态方法?

 

* class  Servlet1{

   private   Servlet1(){

   }

   private   String       name;  

   public     void    setName(String  nn){

        this.name=nn;

   }

   }

4. 重写

 * 重载:  方法名相同,参数类型或者参数个数不同

 *

 * 重写:  也叫 复写,覆盖

 *      子类方法跟父类方法相同。除了访问权限修饰符必须大于等于父类访问权限,其他都必须一直。

 *      注意:私有的不能被重写。

/**
 * 这个类是讲述重写
 * @ClassName:     Demo4Override.java
 * @Description:   TODO  
 * @author         Jim老师 
 * @version        jdk8.0  
 * @Date           2018年8月29日   下午7:27:48 
                     无敌是多么的寂寞
                     男人不能说不行,不行也得行
 */
/* 
 * 重载:  方法名相同,参数类型或者参数个数不同。
 * 
 * 重写:  也叫 复写,覆盖
 *      子类方法跟父类方法相同。除了访问权限修饰符必须大于等于父类访问权限,其他都必须一直。
 *      注意:私有的不能被重写。
 */
class   Fu{
       String  car="宝马";
       protected   void    play(){
               System.out.println("玩麻将!");
       }
}
class   Zi  extends  Fu{
       String  car="奔驰";
       public   void    play(){
               System.out.println("玩Java!");
       }
}
public class Demo4Override {
       public static void main(String[] args) {
              Zi   zi=new  Zi();
              zi.play();
    }
}

5. 多态

 * 多态:  事物的多种存在形态。

 * 体现:  父类引用指向子类对象。

 * 格式:

 *      父类        对象名=new    子类();

 *      

 *      

 * 多态的特点:

 *     1.访问非静态成员变量: 编译看父类                运行看父类

 *     2.访问静态成员变量:    编译看父类                运行看父类

 *     3.访问非静态成员函数: 编译看父类                运行看儿子

 *     4.访问静态成员函数:    编译看父类                运行看父类

 *     

/**
 * 这个类是讲述多态英poli'mo:fizəm
 * @ClassName:     Demo5Polymorphism.java
 * @Description:   TODO  
 * @author         Jim老师 
 * @version        jdk8.0  
 * @Date           2018年8月29日   下午7:47:40 
                     无敌是多么的寂寞
                     男人不能说不行,不行也得行
 */
/*
 * 多态:  事物的多种存在形态。
 * 体现:  父类引用指向子类对象。
 * 格式:
 *      父类        对象名=new    子类();
 *      
 *      
 * 多态的特点:
 *     1.访问非静态成员变量: 编译看父类                运行看父类
 *     2.访问静态成员变量:    编译看父类                运行看父类
 *     3.访问非静态成员函数: 编译看父类                运行看儿子
 *     4.访问静态成员函数:    编译看父类                运行看父类
 *     
 * 
 * 总结:多态编译都看父类,运行也看父类(除了非静态成员函数)。
 *     
 */
class   Animal{
        double    weight=50;
        static   String    name="无名";
        public   void   play(){
                System.out.println("玩爬树");
        }
        public  static  void   eat(){
            System.out.println("动物吃空气");
        }
}
class   Cat   extends   Animal{
        double    weight=10;
        static   String    name="猫";
        public   void   play(){
            System.out.println("猫玩老鼠");
        }
        public  static  void   eat(){
            System.out.println("猫吃鱼");
        }
}
public class Demo5Polymorphism {
         public static void main(String[] args) {
                //父类               引用    指向         子类对象
                Animal     animal =      new   Cat();//多态:
                animal.play();
                animal.eat();
                
                
                
                
                
                
                
                double   weight=animal.weight;
                System.out.println("weight="+weight);
                
                String    name=animal.name;
                System.out.println("name="+name);
                
                
        }
}

 应用:

/**
 * 这个类是讲述多态的运用
 * @ClassName:     Demo51PolymorphismApply.java
 * @Description:   TODO  
 * @author         Jim老师 
 * @version        jdk8.0  
 * @Date           2018年8月29日   下午10:29:42 
                     无敌是多么的寂寞
                     男人不能说不行,不行也得行
 */
/*
 * 喂养动物的例子
 *  
 */
class   Cat5   extends    Animal5{
        
}
public class Demo51PolymorphismApply {
          public static void main(String[] args) {
                     Animal5   aa=new    Cat5();//多态
                     feed(aa);
          }
          public   static   void   feed(Animal5   animal5){ //Animal5  animal5=?;aa;
                     animal5.eat();
          }
}
abstract   class   Animal5{   //这是抽象类,抽象类不能new对象
        public   void  eat(){
                System.out.println("动物吃");
        }
}

 *

 * 总结:多态编译都看父类,运行也看父类(除了非静态成员函数)。

猜你喜欢

转载自www.cnblogs.com/yuyiWang/p/9559174.html