6.面向对象(下)

目录

一、关键字:static

二、单例设计模式

三、main()方法的使用说明

四、类的成员之四:代码块(或初始化块)

五、关键字:final

六、abstract关键字的使用

七、接口的使用

 八、类的内部成员之五:内部类


一、关键字:static

 * static关键字的使用
 *     1.static:静态的
 *     2.static:可以用来修饰:属性、方法、代码块、内部类
 *     3.使用static修饰属性:静态变量(或类变量)
 *         3.1 属性:按是否使用static修饰:又分为:静态属性 vs 非静态属性(实例变量)
 *             实例变量:我们创建了类的多个对象,每个对象都独立的拥有一套类中的非静态属性。当修改其中一个对象中的非静态属性时,不会导致其他对象中同样的属性值的修改。
 *             静态变量:我们创建了类的多个对象,多个对象都共享同一个静态变量。当通过某一个对象修改静态变量时,会导致其他对象调用此静态变量时,是修改过了的。
 *         3.2 static修饰属性的其他说明
 *             ①静态变量随着类的加载而加载。可以通过“类.静态变量”的方式进行调用
 *             ②静态变量的加载要早于对象的创建。
 *             ③由于类只会加载一次,则静态变量在内存中也只会存在一份:存在方法区的静态域中
 *             ④               类变量    实例变量
 *                 类           yes        no    
 *                 对象        yes        yes
 *         3.3 静态属性举例:System.out;Math.PI;
 *     4.使用static修饰方法:静态方法
 *         ①随着类的加载而加载,可以通过“类.静态方法”的方式进行调用
 *         ②              静态方法        非静态方法
 *             类           yes            no    
 *             对象        yes            yes
 *         ③静态方法中,只能调用静态的方法或属性
 *            非静态方法中,既可以调用非静态的方法或属性,也可以调用静态的方法或属性
 *     5.static注意点
 *         5.1在静态的方法内,不能够使用this关键字、super关键字
 *         5.2关于静态属性和静态方法的使用,都从生命周期的角度去理解
 *     6.开发中,如何确定一个属性是否要声明为static?
 *         >属性是可以被多个对象所共享的,不会随着对象的不同而不同的
 *         >类中的常量也常常声明为static
 *        开发中,如何确定一个方法是否要声明为static?
 *         >操作静态属性的方法,通常设置为static的
 *         >工具类中的方法,习惯上声明为static的。

                举例一:Math、Arrays、Collections等工具类
                举例二:单例模式

注:设计模式是在大量的实践中总结和理论化之后优的代码结构、编程风格、 以及解决问题的思考方式

二、单例设计模式

 *  1.所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例
 *  2.如何实现
 *      饿汉式 vs 懒汉式
 *  3.区分饿汉式和懒汉式
 *      饿汉式
 *          坏处  对象加载时间过长。
 *          好处  饿汉式是线程安全的。
 *      懒汉式
 *          好处  延迟对象的创建。
 *          目前的写法坏处  线程不安全。--->到多线程内容时再修改

//饿汉式
    1.
    class Bank{    
        //1.私化类的构造器
            private Bank(){        
            }
            //2.内部创建类的对象
            //4.要求此对象也必须声明为静态的
            private static Bank instance = new Bank();
            //3.提供公共的静态的方法,返回类的对象
            public static Bank getInstance(){
                return instance;
            }
    }
    2.使用了静态代码块
    class Bank{    
        //1.私化类的构造器
            private Bank(){        
            }
            //2.内部创建类的对象
            //4.要求此对象也必须声明为静态的
            private static Bank instance = null;
            static{
                instance = new Bank();
            }
            //3.提供公共的静态的方法,返回类的对象
            public static Bank getInstance(){
                return instance;
            }
    }

//懒汉式
    class Order{    
            //1.私化类的构造器
            private Order(){        
            }
            //2.声明当前类对象,没初始化
            //4.此对象也必须声明为static的
            private static Order instance = null;    
            //3.声明public、static的返回当前类对象的方法
            public static Order getInstance(){
                if(instance == null){            
                    instance = new Order();            
                }
                return instance;
            }
    }

三、main()方法的使用说明

 *     1.main()方法作为程序的入口出现
 *     2.main()方法也是一个普通的静态方法
 *     3.main()方法也可以作为我们与控制台交互的方式。(之前:使用Scanner)
 *        如何将控制台获取的数据传给形参:String[] args ?
 *            运行时:java 类名 "Tom" "Jerry" "123" "true"
 *            system.out.println(args[0]);//Tom
 *            system.out.println(args[3]);//true  ---> Boolean.parseBoolean(args[3]);
 *            system.out.println(args[4]);//报异常

小结:一叶知秋
public static void main(String[] args){//方法体}

        权限修饰符:private  缺省  protected  public  ---> 封装性
        修饰符:static、final、abstract、native  可以用来修饰方法
        返回值类型:无返回值 / 有返回值 ---> return
        方法名:需要满足标识符命名的规则、规范:“见名知意”
        形参列表:重载 vs 重写;参数的值传递机制;体现对象的多态性
    方法体:来体现方法的功能

四、类的成员之四:代码块(或初始化块)

 *     1.代码块的作用:用来初始化类、对象
 *     2.代码块如果有修饰的话,只能使用static
 *     3.分类:静态代码块 vs 非静态代码块
 *      3.1.静态代码块
 *          >内部可以有输出语句
 *          >随着类的加载而执行,而且只执行一次
 *          >作用:初始化类的属性
 *          >如果一个类中定义了多个静态代码块,则按照声明的先后顺序执行
 *          >静态代码块的执行要优先于非静态代码块的执行
 *          >静态代码块内只能调用静态的属性、静态的方法,不能调用非静态的结构
 *      3.2.非静态代码块
 *             >内部可以有输出语句
 *             >随着对象的创建而执行
 *             >每创建一个对象,就执行一次非静态代码块
 *             >作用:可以在创建对象时,对对象的属性等进行初始化
 *             >如果一个类中定义了多个非静态代码块,则按照声明的先后顺序执行
 *             >非静态代码块内既可以调用静态的结构,也可以调用非静态的结构

执行:由父及子,静态先行

public class BlockTest {
	public static void main(String[] args) {
		
		String desc = Person.desc;
		System.out.println(desc);
		
		Person p1 = new Person();
		Person p2 = new Person();
		System.out.println(p1.age);
		
		Person.info();
		
	}
}

class Person{
	//属性
	String name;
	int age;
	static String desc = "我是一个人";
	//构造器
	public Person(){
		
	}
	public Person(String name,int age){
		this.name = name;
		this.age = age;
	}
	//代码块
		//静态代码块
	static{
		System.out.println("hello,static block -1");
		//调用静态结构
		desc = "我是一个中国人1";
		info();
		//不可以调用非静态结构
//		eat();
//		name = "Tom";
	}
	static{
		System.out.println("hello,static block -2");
	}
		//非静态代码块
	{
		System.out.println("hello,block -1");
		//调用非静态结构
		age = 1;
		eat();
		//调用静态结构
		desc = "我是一个中国人2";
		info();
	}
	{
		System.out.println("hello,block -2");
	}
	
	//方法
	public void eat(){
		System.out.println("吃饭");
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	public static void info(){
		System.out.println("我是一个快乐的人");
	} 
	
}

 * 对属性可以赋值的位置
 *         ①默认初始化
 *         ②显示初始化/⑤在代码块中赋值
 *         ③构造器中初始化
 *         ④有了对象以后,可以通过“对象.属性”或“对象.方法”的方式,进行赋值
 *   
 * 执行的先后顺序:① - ②/⑤ - ③ - ④

五、关键字:final

 * final:最终的
 *     1.final可以用来修饰的结构:类、方法、变量
 *     2.final 用来修饰类:此类不能被其他类所继承
 *         比如:String类、System类、StringBuffer类
 *     3.final 用来修饰方法:此方法不能被重写
 *         比如:Object类中的getClass();
 *     4.final 用来修饰变量:此时的“变量”就称为是一个常量
 *         4.1 final修饰属性:可以考虑赋值的位置有:显示初始化、代码块中初始化、构造器中初始化
 *         4.2 final修饰局部变量:尤其是使用final修饰形参时,表明此形参是一个常量。当我们调用此方法时,给常量形参赋一个实参,一旦赋值以后,就只能在方法体内使用此形参,但不能进行重新赋值
 * static final :用来修饰属性:全局常量
 *                      用来修饰方法

六、abstract关键字的使用

 *     1.abstract:抽象的
 *     2.abstract可以用来修饰的结构:类、方法
 *         2.1 abstract修饰类:抽象类
 *             >此类不能实例化
 *             >抽象类中一定有构造器,便于子类实例化时调用(涉及:子类对象实例化的全过程)
 *             >开发中,都会提供抽象类的子类,让子类对象实例化,完成相关的操作
 *
 *         2.2 abstract修饰方法:抽象方法
 *             >抽象方法只有方法的声明,没有方法体
 *             >包含抽象方法的类,一定是一个抽象类。反之,抽象类中可以没有抽象方法
 *             >若子类重写了父类中的所有的抽象方法后,则子类方可实例化
 *               若子类没有重写父类中的所有的抽象方法,则此子类也是一个抽象类,需要使用abstract修饰
 * abstract使用上的注意点:
 *     1.abstract只能用来修饰:类、方法
 *     2.abstract不能用来修饰:私有方法、静态方法、final的类、final的方法

举例一:

举例二:IO流中涉及到的抽象类,InputStream/OutputStream/Reader/Writer。
              在其内部定义了抽象的read()、write()方法。

补:

模板方法设计模式
  解决的问题
        在软件开发中实现一个算法时,整体步骤很固定、通用, 这些步骤已经在父类中写好了, 但是某些部分易变,易变部分可以抽象出来,供不同子类实现。这就是一种模板模式
  应用场景
        数据库访问的封装
        Junit单元测试
        JavaWeb的Servlet中关于doGet/doPost方法调用
        Hibernate中模板程序
        Spring中JDBCTemlate、HibernateTemplate等

七、接口的使用

 *     1.接口使用interface来定义
 *     2.Java中,接口和类是并列的两个结构
 *     3.如何定义接口:定义接口中的成员
 *         3.1 JDK7及以前:只能定义全局常量和抽象方法
 *                 >全局常量:public static final的,但是省略不写
 *                 >抽象方法:public abstract的
 *
 *         3.2 JDK8:全局常量、抽象方法、静态方法、默认方法
        //知识点1:接口中定义的静态方法,只能通过接口来调用
        //知识点2:通过实现类的对象,可以调用接口中的默认方法
        //如果实现类重写了接口中的默认方法,调用时,仍然调用的是重写以后的方法
        //知识点3:如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的默认方法,
        //那么子类在没重写此方法的情况下,默认调用的是父类中同名同参数的方法--->类优先原则
        //知识点4:如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,
        //那么在实现类没重写此方法的情况下,报错--->接口冲突。
        //这就需要我们必须在实现类中重写此方法
        //知识点5:如何在子类(或实现类)的方法中调用父类、接口中被重写的方法
            public void myMethod(){
                method3();//调用自己定义的重写的方法
                    super.method3();//调用的是父类中声明的
                    //调用接口中的默认方法
                    CompareA.super.method3();
                    CompareB.super.method3();
            }
 *     4.接口中不能定义构造器!(意味着接口不可以实例化)
 *     5.Java开发中,接口都通过让类去实现(implements)的方式来使用
 *         如果实现类覆盖了接口中的所有抽象方法,则此实现类就可以实例化
 *         如果实现类没有覆盖接口中所有的抽象方法,则此实现类任为一个抽象类
 *     6.Java类可以实现多个接口 ---> 弥补了Java类的单继承性的局限性
 *         格式:class AA extends BB implements CC,DD,EE
 *     7.接口与接口之间可以继承,而且可以多继承
 *******************************************************************
 *     8.接口的具体使用,体现多态性
 *     9.接口,实际上可以看做是一种规范
 
 * 面试题:抽象类和接口哪些异同?(回答时加入Java8新特性)
 *         相同点:不能实例化,都可以包含抽象方法。
 *         不同点:
        >把抽象类和接口(Java7,Java8,Java9)的定义、内部结构解释说明
        >类:单继承性    接口:多继承
        >类与接口:多实现

 *         体会:
 *             1.接口使用上也满足多态性
 *             2.接口,实际上就是定义了一种规范
 *             3.开发中,体会面向接口编程!

public class USBTest {
	public static void main(String[] args) {
		Computer com = new Computer();
		//1.创建了接口的非匿名实现类的非匿名对象
		Flash flash = new Flash();
		com.transferData(flash);
		//2.创建了接口的非匿名实现类的匿名对象
		com.transferData(new Printer());
		//3.创建了接口的匿名实现类的非匿名对象
		USB phone = new USB(){
			@Override
			public void start() {
				System.out.println("手机开始工作");
			}
			@Override
			public void stop() {
				System.out.println("手机结束工作");
			}
		};
		com.transferData(phone);
		//4.创建了接口的匿名实现类的匿名对象
		com.transferData(new USB(){
			@Override
			public void start() {
				System.out.println("mp3开始工作");
			}
			@Override
			public void stop() {
				System.out.println("mp3结束工作");
			}
		});
	}
}

class Computer{
	public void transferData(USB usb){//USB usb = new Flash();
		usb.start();
		System.out.println("具体的传输数据的细节");
		usb.stop();
	}
}

interface USB{
	//定义了长,宽,最大最小的传输速度等
	
	void start();
	
	void stop();
	
}

class Flash implements USB{

	@Override
	public void start() {
		System.out.println("U盘开启工作");
	}
	@Override
	public void stop() {
		System.out.println("U盘结束工作");
	}
	
}

class Printer implements USB{

	@Override
	public void start() {
		System.out.println("打印机开启工作");
	}
	@Override
	public void stop() {
		System.out.println("打印机结束工作");
	}
	
}

面向接口编程:我们在应用程序中,调用的结构都是JDBC中定义的接口,不会出现具体某一个数据库厂商的API

代理模式
    解决的问题
        代理模式是Java开发中使用较多的一种设计模式。代理设计就是为其他对象提供一种代理以控制对这个对象的访问
    应用场景
        安全代理:屏蔽对真实角色的直接访问。
        远程代理:通过代理类处理远程方法调用(RMI
        延迟加载:先加载轻量级的代理对象,真正需要再加载真实对象
    分类
        静态代理(静态定义代理类)
        动态代理(动态生成代理类)

/*
 * 接口的应用:代理模式
 */
public class NetWorkTest{
	public static void main(String[] args) {
		Server server = new Server();
		ProxyServer proxyServer = new ProxyServer(server);
		proxyServer.browse();
		
	}
}

interface NetWork{
	public void browse();
}

//被代理类
class Server implements NetWork{
	@Override
	public void browse() {
		System.out.println("真实的服务器来访问网络");
	}
}

//代理类
class ProxyServer implements NetWork{
	private NetWork work;
	public ProxyServer(NetWork work){
		this.work = work;
	}
	public void check(){
		System.out.println("联网前的检查工作");
	}
	@Override
	public void browse(){
		check();
		work.browse();
	}
}

工厂的设计模式 

工厂的设计模式
    解决的问题
        实现了创建者与调用者的分离,即将创建对象的具体过程屏蔽隔离 起来,达到提高灵活性的目的
    具体模式
            简单工厂模式:用来生产同一等级结构中的任意产品。(对于增加新的产品, 需要修改已有代码)
           工厂方法模式:用来生产同一等级结构中的固定产品。(支持增加任意产品)
           抽象工厂模式:用来生产不同产品族的全部产品。(对于增加新的产品,无 能为力;支持增加产品族)

 八、类的内部成员之五:内部类

 *     1.Java中允许将一个类A声明在另一个类B中,则类A就是内部类,类B称为外部类
 *     2.内部类的分类:成员内部类(静态、非静态) vs 局部内部类(方法内、代码块内、构造器内)
 *     3.成员内部类:
 *         一方面:作为外部类的成员:
 *             >调用外部类的结构
 *             >可以被static修饰
 *             >可以被4中不同的权限修饰
 *         另一方面:作为一个类:
 *             >类内可以定义属性、方法、构造器等
 *             >可以被final修饰:表示此类不能被继承/即不用final修饰的话可以被继承
 *             >可以被abstract修饰
 *     4.注意点
 *         4.1:如何实例化成员内部类的对象
 *             //创建Dog实例(静态的成员内部类)
                Person.Dog dog = new Person.Dog();
                dog.show();
                //创建Bird实例(非静态的成员内部类)
                Person p = new Person();
                Person.Bird bird = p.new Bird();
                bird.sing();
 *         4.2:如何在成员内部类中区分调用外部类的结构
 *                 name//方法的形参
 *                 this.name//内部类的属性
 *                 Person.this.name//外部类的属性
 *         4.3:开发中局部内部类的使用
 *                 //返回一个实现了Comparable接口的类的对象
                public Comparable getComparable(){
        
                //创建一个实现了Comparable接口的类:局部内部类
                //方式一:
                class MyComparable implements Comparable{

                    @Override
                    public int compareTo(Object o) {
                    return 0;
                    }
            
                }
                return new MyComparable();
        
                //方式二:
                return new Comparable(){

                    @Override
                    public int compareTo(Object o) {
                    return 0;
                    }
            
                };

注意点:
     * 在局部内部类的方法中(比如:show)如果调用外部类所声明的方法(比如method)中的局部变量(比如:num)的话
     * 要求此局部变量声明为final的。
     * java7及之前的版本:要求此局部变量显式的声明为final的
     * java8及之后的版本:可以省略final声明

总结:
        成员内部类和局部内部类,在编译以后,都会生成字节码文件。
        格式:成员内部类:外部类$内部类名.class
                   局部内部类:外部类$数字 内部类名.class 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值