zoukankan      html  css  js  c++  java
  • JAVA笔记5__构造块、静态块/单例设计模式/继承/final关键字/super关键字

    public class Main {
        { //构造块(在构造对象时调用,先于构造方法执行)
            System.out.println("我是构造块!");
        }
        static{ //静态块(在类加载时执行,且只执行一次【在构造块前执行】eg:数据库连接)
            System.out.println("我是静态块!");
        }
        public Main(){
            System.out.println("我是构造方法!");
        }
        public static void main(String[] args) {
            Main m1 = new Main();
            Main m2 = new Main();
        }  
    }
    /**
     * 单例设计模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点
     * 1.构造方法私有化
     * 2.声明一个本类对象
     * 3.给外部提供一个静态方法获取对象实例
     * 两种实现方式:饿汉式、懒汉式
     * 应用场合:工具类(例数据库)
     */
    public class Main {
        public static void main(String[] args) {
            Singleton1 s1 = Singleton1.getInstance();
            s1.print();
            Singleton1 s2 = Singleton1.getInstance(); 
            Singleton1 s3 = Singleton1.getInstance();
            System.out.println(s1==s2); //输出true,s1,s2,s3都指向同一个对象
            
            Singleton2 t1 = Singleton2.getInstance();
            t1.print();
            Singleton2 t2 = Singleton2.getInstance();
            System.out.println(t1==t2); //输出true,t1,t2指向同一个对象
        }
    }
    
    /**
     * 把该类设计成单例设计模式
     * 饿汉式
     */
    class Singleton1{
        private static Singleton1 s = new Singleton1(); //饿汉,先new一个对象
        private Singleton1(){}
        public void print(){
            System.out.println("饿汉式单例设计模式!");
        }
        public static Singleton1 getInstance(){
            return s;
        }
    }
    
    /**
     * 把该类设计成单例设计模式
     * 懒汉式【在多线程访问时会有线程安全问题】
     */
    class Singleton2{
        private static Singleton2 s = null; //懒汉,先不new,调用时再new
        private Singleton2(){}
        public void print(){
            System.out.println("懒汉式单例设计模式!");
        }
        public static Singleton2 getInstance(){
            if(s==null){
                s = new Singleton2();
            }
            return s;
        }
    }
    /**
     * 继承
     * 1.Java只能实现单继承,也就是一个类只能有一个直接父类
     * 2.继承只能继承非私有的属性和方法(public,protected,default)
     * 3.构造方法不能被继承
     */
    public class Main {
        public static void main(String[] args) {
            HomeDog d2 = new HomeDog("hels"); //父类的构造方法先执行(且只能执行父类的默认构造方法【无参】,除非显式调用)
            d2.desc();
        }  
    }
    
    class Dog{
        String name;
        public Dog(){
            System.out.println("A dog born.");
        }
        public Dog(String name){
            System.out.println("A dog:"+name+" is born.");
        }
        public void desc(){
            System.out.println("I'm a dog.");
        }
    }
    class HomeDog extends Dog{
        public HomeDog(String name){
            super(name); //表示父类的引用【必须放在第一句】
            System.out.println("A HomeDog born.");
        }
        /**
         * 方法的重写
         * 1.发生方法重写的两个方法返回值、方法名、参数列表必须完全一致(子类重写父类的方法)
         * 2.子类抛出的异常不能超过父类相应方法抛出的异常
         * 3.子类方法的访问级别不能低于父类相应方法的访问级别(例:父protected 子public)
         */
        public void desc(){
            System.out.println("我是重写过后的方法!");
        }
        
    }
    class WildDog extends Dog{
        public WildDog(){
            System.out.println("A WildDog born.");
        }
    }
    /**
     * super关键字可以完成的操作:
     * 1.调用父类中的属性
     * 2.调用父类中的方法
     * 3.调用父类中的构造方法
     */
    public class Main {
        public static void main(String[] args) {
            BlackDuck d1 = new BlackDuck();
            d1.desc();
        }  
    }
    
    class Duck{
        protected String name;
        protected int price = 55;
        
        public void count(){
            System.out.println("Duck price is "+price);
        }
    }
    
    class BlackDuck extends Duck{
        public void desc(){
            System.out.println("I'm a BlackDuck,My price is "+super.name);
            super.count();
        }
    }
    /**
     * final关键字可以完成的操作:
     * 1.声明一个类(最终类,不能被继承)
     * 2.声明一个方法(这个方法不能再被子类重写)
     * 3.声明一个常量(1.直接赋值  2.在构造方法中赋值)
     */
    public class Main {
        public static void main(String[] args) {
            Girl g1 = new Girl(30);
            g1.desc();
        }  
    }
    
    final class Girl{
        final String name = "fish7";
        final int age;
        public Girl(int age){
            this.age = age;
        }
        public final void desc(){
            System.out.println("I'm "+name+", My age is "+age);
        }
    }
  • 相关阅读:
    轻松学习Linux之AWK使用初步
    轻松学习Linux之理解Shell的硬链接与软连接
    轻松学习Linux之自动执行任务
    轻松学习Linux系统安装篇之fdisk命令行工具的使用
    Leetcode-1030 Next Greater Node In Linked List(链表中的下一个更大节点)
    Leetcode-1028 Convert to Base -2(负二进制转换)
    Leetcode-1029 Binary Prefix Divisible By 5(可被 5 整除的二进制前缀)
    ACM模板——2的次方表
    ACM模板——快速幂
    ACM模板——素数相关
  • 原文地址:https://www.cnblogs.com/fish7/p/4141212.html
Copyright © 2011-2022 走看看