java基础笔记-面向对象2


8. static

8.1 概述

? 希望属性or方法不归具体的对象所有,而是属于类,

? 随着类的加载而加载

在内存池中,就存一份,在方法区的静态域中

8.2 静态属性

? static可以用来修饰: 属性,方法,代码块,内部类

class chinese{
    private static String contory; //全内存就一份,所有对象共享
    private String name;
}

8.3 静态方法

? 调用关系,看生命周期

? 静态方法中,不能使用this,super

8.4 单例模式

? 单例:单独的一个实例,某个类只能创建一个对象

? 构造方法权限为private,这样不能在外部使用new来创建

? 在内部使用一个静态方法来创建一个对象,同时,由于静态方法只能访问静态成员变量,所以类的所有成员都得是静态的

8.4.1创建单例模式的两种方法

? 饿汉式 线程安全,但是对象加载时间过长

? 懒汉式 延迟对象的创建 线程不安全(两个线程同时想创建单例对象,俩人判断都是null,就各自会new一个)

//饿汉式
class Singleton1{
    //私有构造方法
	private Singleton1(){
        pass;
    }
    //类内部创建对象
    private static Bank ins = new Singleton1();
    //提供共有方法返回类的对象
    public static Singleton1 getInstance(){
        return ins;
    }
}
//懒汉式
class A{
	private A(){
		pass;
	}
    //声明当前类对象,不初始化
    private static A ins = null;
    //提供共有方法返回类的对象
    public static A getInsance(){
        if(ins==null){
            ins = new A();
        }
    	return ins;         
    }
}

8.4.2 使用场景

? 数据库连接池,网站计数器,日志处理,配置文件类,windows任务管理器,回收站,Application

9. 代码块 ( 初始化块 )

? { 代码块 } static{代码块}

? 通常都是用来初始化类或者对象的,

? 只能用static修饰,或者不修饰

? 代码块可以有多个,按着先后顺序先后执行(没必要写俩静态代码块吧。)(甚至,没必要写代码块)

9.1静态代码块

? 随着类的加载而 执行

? 就执行一次

9.2 非静态代码块

? 随着对象的创建而执行

? 每创建一个对象都执行一次

? 作用:可以在对象创建时,对属性进行初始化

10. final

? final可以用来修饰 :类(简单的说,割了),方法(不可以被重写,你爸爸给你用,但是不给你重写),变量

10.1 final修饰方法和类

? 权限 [final] class A{ }

? [权限] [final] [static] [final] 返回值 方法名()

? 被final修饰的类:String,System,StringBuffer

? 被final修饰的方法:Object的getClass()

10.2 final修饰变量和属性

? 变量:变成常量了

? 属性:赋值可以放在:显式初始化位置,代码块中,构造器中。 不能用在对象.属性处

? 局部变量: 方法内:变成常量

? 形参:方法体内就不能再修改了

10.3 static+final

? static final 修饰属性:全局常量 常见于接口中

11. 抽象类,抽象方法

? 儿子太多,导致父类变成了一个公共东西的抽象,那么实际使用对父类对象的使用就少了,那还要父类干嘛,写成抽象类,不做实例化了

? abstract : 用来修饰 类 ,方法

abstract class  Person{
    String name;
    int age;
    public Person(){
        
    }
}
class Sun{
    
}

11.1抽象类

? 一定要有构造方法,虽然自己不能用,但是可以给实现的子类来用

11.2 抽象方法

? 该类必须是抽象类

? 可以没有抽象方法,可以有普通成员方法,这个成员方法还可以调用抽象方法

? 不能修饰构造方法,私有方法,静态方法,final方法

11.3抽象类的匿名子类

? 真的很常见

? 抽象类的方法太多了就别用了!

abstract class Person{
    public abstract void eat();
}

//方法声明
public static void function(Person p){}
//调用
function(new Person{
    @override
    public void eat(){}
})

11,4 设计模式:模板方法

? 功能内部的一部分是现实确定的,一部分是现实不确定的,这时可以把不确定的部分暴露出去,留给子类来实现

12. interface

? 接口的最主要目的就是实现多继承,次要目的就是单纯的抽象多个类的公共特征

? implements 实现

? 实现类如果没有implements接口中的所有方法,则该类是一个抽象类

12.1 接口的成员:

? JDK7:

? 全局常量: public static final

? 抽象方法:public abstract

? JDK8+:

? 还可以定义:

? 静态方法: 可以有方法体(接口越来越像类靠齐了)

? 但是有个接口A{ static func1()},实现类B b,调用时 b.func1()

? 只能A.func1();

? 默认方法:默认方法使用default修饰,可以通多实现类对象调用 ,可以重写,但是要去掉default

? 绝对不能定义构造方法

interface Flyable{
    //全局常量
    public static final int MAX_SPEED =7900;
    int MIN_SPEED =7900; //同上,省略了(包括省略了public)
 	//抽象方法
    public abstract void fly();
    void stop();//省略同上
    //静态方法
    public static void method1(){
        
    }
    //默认方法
    public default void method2(){} //default默认 得写
    default void method3(){} //省略
}

12.2接口的继承性

? java可以多实现接口,接口之间可以多继承!!!

12.3 (多继承)带来的重名问题

? 父类和接口中有重名函数 ,规定,子类不重写则默认用父类的 --类优先原则

? class A extends B implements C{ }

? 俩接口里面有重名函数,规定:

? <1>如果定义的是默认方法,则实现类必须重写(接口冲突),如果想使用接口的默认方法,则B.super.func()

class A  implements B,C{  }

12.3 接口的使用(多态)

interface USB{
	void start();
    void stop();
}
class Flash implements USB{
    public void start(){}
    public void stop(){}
}
class Computer{
    public void transferData(USB sub){
        usb.start();
        ...
        usb.stop(); 
    }
}
main(){
    Computer com =new Computer();
    //非匿名实现类的对象
    Flash flash =new Flash();
    com.transferData(flash)
        
  
    //匿名实现类的匿名对象
    comg.transferData(new USB{
        public void start(){}
   	 	public void stop(){}
    });
}

12.4设计模式:代理模式

? 使用较多

? 就是为其他对象提供一种代理以控制对这个对象的访问

? 一个接口,被俩类实现,一个代理类,一个被代理类

interface NetWork{
	public void browse();
}
//被代理类
class Server implements NetWork{
    @oiverride
    public void browse(){}
}
//代理类
class ProxyServer implements NetWork{
    private NetWork work;
    public ProxyServer(NetWork work){
        this.work = work;
    }
    public void check(){
        sout("联网前的检测");
    }
    @override
    public void browse(){
        check();
        work.browse();
    }
}

main(){
    Server server = new Server();
    ProxyServer proxyServer = new ProxyServer(server);
    proxyServer.browse();
}

? 应用场景: 安全代理,屏蔽对真实角色的直接访问

? 远程代理:通过代理类处理远程方法调用(RMI)

? 延迟加载:先加载轻量级的代理对象,真正需要再加载真是对象

12.5设计模式:工厂模式

13. 内部类

? 内部类 TM只出现在面试中吧。。。。

? 自己做开发没事闲的扯什么犊子写这玩意。。。

? 活着不好么???

? 分类:成员内部类(static成员内部类,和非static成员内部类)

? 局部内部类(方法内,代码块内,构造方法内),匿名内部类

class Person{
    public void method(){
        class A{}//方法体内局部innerclass
    }
    {
        class B{}//代码块内局部innerclass
    }
    public Person(){
        class C{}//构造方法内局部innerclass
    }
    class Heat{//成员内部类
        
    }
}

13.1成员内部类

? 作为类的成员:

? >能调用外部类的东西,但是要注意静态的关系

? >innerclass里面的this指的是内部类,想要调用外部类的属性,A.this.func()

? >可以被四种权限修饰

? 作为一个类:

? >类内可以定义的东西:当初普通类就行

? >可以被继承,可以被final修饰,可以抽象

class A{
	class B{
        int age;
        public void show(){}
    }	
    static class C{
        int age
    }
}

13.2内部类的实例化 及区分

class Person{
	String name;
	public void eat(){sout("人吃饭")}
    static class Dog{
        String name;
        public void eat(){sout("狗吃饭")}
    }
    class Bird{
        String name;
        public void eat(){sout("鸟吃食")}
        //区分同名属性
        public void display( String name){
            sout(name);
            sout(this.name);
            sout(Person.this.name);
        }
    }
}
main(){
    Person.Dog dog = new Person.Dog(); //创建静态成员内部类
    dog.eat();
    
    Person p = new Person();
    Person.Bird bird = p.new Bird();//创建 非静态成员内部类
    bird.eat();
}

13.3 局部内部类

注意:方法体内的内部类,使用了方法体里面的局部变量,这个变量必须是final,哪怕你不声明,它也会默认final,你敢改变量值,他就敢报错

JDK6之前,不写final也报错

why:局部变量的声明周期,除了函数,就没了,而类呢,哪怕是局部类,他也是直到不用了才销毁的,问题来了,类还在,变量没了,咋办? 只能final

class Person{
    
    //开发中巨少见
    public void method(){
        class A{}//方法体内局部innerclass
    }
    
    //真实情况,返回一个实现了Comparable接口的类的对象
    //方法1
    public Comparable getComparable(){
        class MyComparable implements Comparable{
            ...
        }
        return new MyComparable();
    }
    //方法2,不标准
    public Comparable getComparable(){
        return new Comparable(){
            @override
            ...
        };
    }
    
    {
        class B{}//代码块内局部innerclass
    }
    public Person(){
        class C{}//构造方法内局部innerclass
    }
}