zoukankan      html  css  js  c++  java
  • Java学习笔记(8)

    static修饰方法(静态的成员方法):

    访问方式:

    1. 可以使用对象进行访问                   对象.静态函数名();
    2. 可以使用类名进行访问                   类名.静态函数名();

    静态函数要注意的事项:

    • 静态函数是可以使用类名或者对象进行调用的,而非静态函数只能使用对象进行调用
    • 静态的函数可以直接访问静态的成员(函数与变量),但是不能直接访问非静态的成员。         原因:静态函数是可以使用类名直接调用的,这时候可能还没有存在对象,而非静态的成员数据是随着对象的存在而存在的。
    • 非静态的函数是可以直接访问静态与非静态的成员             原因:非静态函数只能由对象调用,当对象存在的时候,静态数据老早就存在了,而非静态数据也随着对象的创建而存在了。
    • 静态函数不能出现this或者super关键字                原因:因为静态的函数是可以使用类名调用的,一旦使用类名调用,这时候不存在对象,而this关键字是代表了一个函数的调用者对象,这时候产生了冲突。

    推荐使用类名直接访问静态的成员   (节省内存     简便)

    静态的数据的生命周期:  静态的成员变量数据是优先于对象存在的。

    静态代码块是在类.calss文件加载到内存的时候就马上执行的。

    static什么时候修饰一个函数呢?          答:如果一个函数没有直接访问到非静态的成员时,那么就可以使用static修饰了。    一般用于工具类型的方法

    静态函数不能访问非静态的成员?   不正确(不能直接访问)        静态函数只要存在有对象,那么也可以访问非静态的数据。 只是不能直接访问而已。

    静态的成员变量与非静态的成员变量的区别: 

    作用上的区别:

    1. 静态的成员变量共享一个数据给所有对象使用。
    2. 非静态的成员变量的作用是描述一类事物的公共属性

    数量与存储位置上的区别:

    1. 静态成员变量是存储方法区内存中,而且只会存在一份数据
    2. 非静态的成员变量是存储在堆内存中,有n个对象就有n份数据

    生命周期的区别:

    1. 静态的成员变量数据是随着类的加载而存在,随着类文件的消失而消失。
    2. 非静态的成员数据是随着对象的创建而存在,随着对象被垃圾回收器回收而消失。

    main函数的详解:

    • public    原因: 为了保证让jvm在任何情况下都可以访问到main方法
    • static (静态)静态可以让jvm调用main函数的时候更加的方便。不需要通过对象调用。
      •   不使用static修饰的麻烦:
        • 需要创建对象调用
        • jvm不知道如何创建对象,因为创建对象有些是需要参数的,参数传递什么东西呢?
    • void   没有返回值  因为返回的数据是给jvm。而jvm使用这个数据是没有意义的,因为返回的时候意味这main函数结束了,所以这个数据也没用了。所以就不要了。
    • main   函数名。    注意:main并不是关键字,只不过是jvm能识别的一个特殊的函数名而已。
    • arguments    参数        担心某些程序在启动时需要参数。

    单例设计模式:保证一个类在内存中只有一个对象 

    模式:模式就是解决一类问题的固定步骤。

    单例设计模式的步骤:(饿汉单例设计模式)

    1. 私有化构造函数
    2. 声明本类的引用类型变量,并且使用该变量指向本类对象
    3. 提供一个公共静态的方法获取本类的对象
    public class SingleCreative {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Single1 s1=Single1.getInstance();
            Single1 s2=Single1.getInstance();
            System.out.println(s1==s2);
        }
    
    }
    
    class Single1{
        
        private static Single1 s=new Single1();
        private Single1() {}
        
        public static Single1 getInstance() {
            return s;
        }
    }

    懒汉单例设计模式:

    1. 私有化构造函数
    2. 声明本类的引用类型变量,但是不要创建对象
    3. 提供公共静态的方法获取本类的对象,获取之前先判断是否已经创建了本类的对象,如果已经创建了,那么直接返回对象即可,如果还没有创建,那么先创建本类的对象,然后再返回
    public class Single {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Single2 s1=Single2.getInstance();
            Single2 s2=Single2.getInstance();
            System.out.println(s1==s2);
        }
    
    }
    class Single2{
        
        private static Single2 s;
        private Single2() {}
        
        public static Single2 getInstance() {
            if (s==null) {
                s=new Single2();
            }
            return s;
        }

     推荐使用:饿汉单例设计模式    (因为懒汉单例设计模式会存在线程安全问题  )

    继承:继承是通过关键字extends体现的       父类(超类 基类)   子类 

    继承的格式:

       class  类名1   extends   类名2{

    }

    继承要注意的事项:

    1. 千万不要为了减少重复代码而去继承,只有真正存在着继承关系的时候才去继承。
    2. 父类私有的成员不能被继承。
    3. 父类的构造函数不能被继承。
    4. 创建子类对象时默认会先调用父类无参的构造函数。
      1.   为什么要调用父类的构造方法呢?这样子做的意义在哪儿?
        • 调用父类的构造方法是可以初始化从父类继承下去的属性的。

    super关键字:super关键字代表了父类空间的引用。

    super关键字的作用:

    1. 子父类存在着同名的成员时,在子类中默认时访问子类的成员,可以通过super关键字指定访问父类的成员
    2. 创建子类对象时,默认会先调用父类无参的构造方法,可以通过super关键字指定调用父类的构造方法
    public class Demo1 {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Zi z=new Zi("狗娃","铁蛋");
            z.print();
        }
    
    }
    class Fu{
        int x=10;
        String Name;
        public Fu() {}
        public Fu(String name) {
            this.Name=name;
        }
        public void eat() {
            System.out.println("小头爸爸吃番薯");
        }
    }
    class Zi extends Fu{
        int x=20;
        String name;
        public Zi(String name,String Name) {
            this.name=name;
            super.Name=Name;
            
        }
        public void print() {
            super.eat();
            eat();
            System.out.println("名字=:"+super.Name);
        }
        public void eat() {
            System.out.println("大头儿子吃龙虾");
        }
    }

    super关键字调用父类构造方法要注意的事项:

    1. 如果在子类的构造方法上没有指定调用父类的构造方法,那么java编译器会在子类的构造方法上面加上super()语句。
    2. super关键字调用父类的构造函数时,该语句必须要是子类构造函数中的第一个语句。
    3. super和this关键字不能同时出现在同一个构造函数中调用其他的构造函数。因为两个语句都需要在第一位。

    super关键字和this关键字的区别:

    1. 代表的事物不一致
      1. super关键字代表的是父类空间的引用     (代表一块内存空间)
      2. this关键字代表的是所属函数的调用者对象
    2. 使用前提不一样
      1. super关键字必须要有继承关系才能使用
      2. this关键字不需要存在继承关系也可使用
    3. 调用构造函数的区别
      1. super关键字是调用父类的构造函数
      2. this关键字是调用本类的构造函数

    方法的重写:子父类出现了同名的函数,这个我们就称为方法的重写    (父类的功能无法满足子类的需求时)

    方法重写的前提:必须要存在继承的关系。

    方法重写要注意的事项:

    1. 方法重写时,方法名与形参列表必须一致。
    2. 方法重写时,子类的权限修饰符必须要大于或者等于父类的权限修饰符。    (public的权限比不写的要大一点儿)
    3. 方法重写时,子类的返回值类型必须要小于或者等于父类的返回值类型。
    4. 方法重写时,子类抛出的异常类型要小于或者等于父类抛出的异常类型。   Exception (最坏)     RuntimeException(小坏)

    instanceof关键字:

    instanceof的作用:判断一个对象是否属于指定的类别。

    instanceof的使用前提:判断的对象与指定的类别i必须要存在继承或者实现的关系。   (可以对象是子类   也可以对象是父类    判断的类别是它的子类)

    instanceof关键字的使用格式:   对象    instanceof   类别     (是  返回true    不是  返回false)

  • 相关阅读:
    linux c 链接详解3-静态库
    ubuntu下安装chrome谷歌浏览器
    零填充(Zero-padding)
    单例模式的多种写法(线程安全)
    执行代码出现ImportError:attempted relative import with no known parent package
    用anaconda安装tensorflow
    A* 算法的原理
    梯度消失(vanishing gradient)和梯度爆炸(exploding gradient)
    spark安装
    [转]虚拟机VMware3种网络模式(桥接、nat、Host-only)的工作原理
  • 原文地址:https://www.cnblogs.com/zhangwugai/p/10321829.html
Copyright © 2011-2022 走看看