Java学习笔记03--main方法详解;单例设计模式;继承;instanceof 关键字

时间:2022-01-07 16:52:25

===============java相关讲解=============

main函数的详解:

public : 公共的。 权限是最大,在任何情况下都可以访问。 
    原因: 为了保证让jvm在任何情况下都可以访问到main方法。

static:  静态。静态可以让jvm调用main函数的时候更加的方便。不需要通过对象调用。

void:  没有返回值。 因为返回的数据是 给 jvm,而jvm使用这个数据是没有意义的。所以就不要了。


main: 函数名。   注意: main并不是关键字,只不过是jvm能识别的一个特殊的函数名而已。


arguments :担心某些程序在启动需要参数。
class Demo4 {

    public static  void main(String[] args) 
    {
        System.out.println("数组的长度:"+ args.length);
        for(int i = 0 ; i <args.length ; i++){
            System.out.print(args[i]+",");
        }

        Scanner scanner = new Scanner(System.in);


    }
}

单例设计模式

单例设计模式的步骤:

饿汉单例设计模式

  • 私有化构造函数。
  • 声明本类的引用类型变量,并且使用该变量指向本类对象。
  • 提供一个公共静态的方法获取本类的对象。

懒汉单例设计模式:

  • 私有化构造函数。
  • 声明本类的引用类型变量,但是不要创建对象,
  • 提供公共静态 的方法获取本类 的对象,获取之前先判断是否已经创建了本类 对象
    ,如果已经创建了,那么直接返回对象即可,如果还没有创建,那么先创建本类的对象,
    然后再返回。

推荐使用: 饿汉单例设计模式。 因为懒汉单例设计模式会存在线程安全问题,目前还不能保证一类在内存中只有一个对象。

//饿汉单例设计模式 ----> 保证Single在在内存中只有一个对象。
class Single{

    //声明本类的引用类型变量,并且使用该变量指向本类对象
    private static  Single s = new Single();

    //私有化构造函数
    private Single(){}

    //提供一个公共静态的方法获取本类的对象
    public  static  Single getInstance(){
        return s;
    }
}
//懒汉单例设计模式 ----> 保证Single在在内存中只有一个对象。

class Single2{

    //声明本类的引用类型变量,不创建本类的对象
    private static Single2 s;

    //私有化了构造函数
    private Single2(){}

    //
    public static Single2 getInstance(){
        if(s==null){
            s = new Single2();
        }
        return s;
    }
}

java继承

继承:继承是通过关键字extends体现的。

继承的格式:

class 类名1 extends 类名2{

}

继承要注意的事项:

  • 千万不要为了减少重复代码而去继承,只有真正存在着继承关系的时候才去继承。
  • 父类私有的成员不能被继承。
  • 父类的构造函数不能被继承。
  • 创建子类对象时默认会先调用父类无参的构造函数。
//人类 
class Person{

    String name;

    private int age;

    public  Person(String name){
        this.name = name;
    }

    public Person(){
        System.out.println("Person类的构造方法被调用了....");
    }

    public void eat(){
        System.out.println(name+"在吃饭...");
    }
}

//学生类
class Student extends Person {  // Student 就称作为Person类的子类, Person类就称作为Student的父类(超类、基类)

    int num; //学号

    public Student(){
        System.out.println("Student类的构造方法被调用了....");
    }

    public void study(){
        System.out.println(name+"good good study , day day up");
    }   
}

疑问: 为什么要调用父类的构造方法啊?这样子做的意义在那?

调用父类 的构造方法是可以初始化从父类继承下去的属性的。

class Fu{

    int x = 10;

    String name;

    public Fu(String name){
        this.name = name;
        System.out.println("Fu类d带参的构造方法...");
    }

    public Fu(){
        System.out.println("Fu类无参的构造方法...");
    }
}


class Zi extends Fu{

    int x = 20;

    public Zi(String name){
        super(name); //指定调用父类一个参数的构造函数。
    }


    public void print(){
        System.out.println("x1 = "+ x);
    }

}


class Demo8 {
    public static void main(String[] args) 
    {
        Zi z = new Zi("大头儿子"); 
        System.out.println("name= "+z.name);

    }
}

instanceof 关键字

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

  • instanceof关键字的使用前提:判断的对象与指定的类别必须要存在继承或者实现的关系。

  • instanceof关键字的使用格式:

    `对象  instanceof 类别`
    
  • 一般我们做强制类型转换之前都会使用该关键字先判断一把,然后在进行转换的。

class Demo{

    public static void main(String[] args) 
    {
        Dog d = new Dog("哈士奇","白色");
        System.out.println("狗是狗类吗?"+ (d instanceof Dog));
        System.out.println("狗是动物类吗?"+ (d instanceof Animal));   
        //System.out.println("狗是老鼠类吗?"+ (d instanceof Mouse)); 
        Animal a = new Animal("狗娃","黄色"); //狗娃是人
        System.out.println("动物都是狗吗?"+ (a instanceof Dog));


    }
}

——————————————————————————————————————————————————

===============与上方java相关的iOS技术关联理解==========

ios程序启动原理

iOS单例 –Singleton

单例模式的意思就是只有一个实例。单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类称为单例类。

  • 单粒:保证程序运行过程中,永远只有一个对象实例

  • 目的是:全局共享一份资源、节省不必要的内存开销

单例的特点:

  • 1.单例对象可以存储一些共享的信息,每个对象都能访问和修改
  • 2.如果一个类的创建非常耗费性能,那么这个类最好设计为单列,只创建一次,节约性能;
    缺点:单例对象一旦建立,对象指针是保存在静态区的,单例对象在堆中分配的内存空间,会在应用程序终止后才会被释放;
#import "ServiceManager.h"

static ServiceManager *defaultManager;

@implementation ServiceManager

+(ServiceManager *)defaultManager{
    if(!defaultManager)
        defaultManager=[[self allocWithZone:NULL] init];
    return  defaultManager;
}

@end
#import "ServiceManager.h"


@implementation ServiceManager


+(ServiceManager *)sharedManager{
    static dispatch_once_t predicate;
    static ServiceManager * sharedManager;
    dispatch_once(&predicate, ^{
        sharedManager=[[ServiceManager alloc] init];
    });
    return sharedManager;
}

@end