• 面向对象


    结构化程序设计和面向对象程序设计的区别

    1. 面向过程,以函数为中心

    吃(猪八戒,西瓜)
    2. ####面向对象,以对象为中心
    猪八戒.吃(西瓜)
    面向对象更接近自然语法。

    面向对象的基本特征(缺一不可)

    • 抽象
    • 封装
    • 继承
    • 多态
      JavaScript也使用了对象,但是没有继承和多态,其是基于对象。

    一切皆对象(除了八个基本数据类型)

    Java对象具有唯一性,如果不被引用则会被回收。
    Java对象都是Object类的实例,都可调用该类的中定义的方法。

    封装

    隐藏对象的成员变量和实现细节,把方法暴露出来,让外部通过方法实现对成员变量的安全访问。这通过Java的访问控制符实现。

    1. 访问控制级别(由小到大)
      • private:当前类的内部可访问
      • default:同一个包内可访问
      • protected:同一个包内可访问,不同包内的子类可访问(子类可重写它)
      • public:全局范围可访问
    2. 使用原则
      • 一个类就相当于一个模块,模块设计追求高内聚、低耦合
      • 类的成员变量及辅助型的工具方法应用private修饰
      • 希望被子类重写的方法应该用protected修饰
      • 不希望被子类重写但是需要被外部类调用,可以使用final方法
      • 类的构造器及希望被外部调用的方法应该用public修饰
      • 尽量不要在构造器中调用将要被子类重写的方法
    3. Java常用包
      • Java包的声明需放在非注释行的第一行,之后是imoprt语句
        pacage test.dao;
        import test.*;
      • Java默认自动导入java.lang核心包下的所有类,比如String类,System类,Math类,Thread类
      • java.util包含Java工具类/集合框架/接口类
      • java.net包含Java网络编程相关的类/接口
      • java.io包含IO编程相关的类/接口
      • java.sql包含JDBC数据库编程的相关类/接口
      • java.awt包含了构建图形界面相关的类/接口
      • java.swing包含了Swing图形用户界面编程相关的类/接口

    继承

    1. 子类使用extends关键字继承父类。子类继承父类的成员变量和方法,也可以重写父类的方法。
    2. 重写遵循两同两小一大的原则,重写后父类方法被覆盖,如果想调用被覆盖的方法需要使用super关键字作为调用者。
    3. 特殊情况:父类的private方法不能被重写,子类只能重新定义一个相同的方法。
    4. 子类和父类也可以实现重载。
    5. 子类不能继承父类的构造器,但是可以使用super关键字调用父类的构造器。

    多态

    1. 当Java引用变量的编译时类型和运行时类型不一致时,就可能产生多态。
    2. 当把一个子类对象赋给一个父类引用变量时,无需类型转换(或者说向上转型),因子类是一种特殊的父类。这时执行父类引用变量的方法时会表现出子类对象的行为。
    3. 当把一个父类对象赋给一个子类引用变量时,就需要进行强制类型转换。
    4. 为避免ClassCastException异常,强制类型转换之前应通过instanceof运算符判断。
    5. instanceof前一个操作数为一个引用变量,后一个操作数为一个类或者接口,用于判断前面引用变量的对象是否为后面类的实例。
    public class InstanceTest {
    	public static void main(String[] args) {
    		Object obj = "astring";
    		String result = "";
    		if (obj instanceof String) {
    			result = (String) obj;
    		}
    		System.out.println(result);
    	}
    }
    

    组合

    1. 继承和组合都能实现类的复用,但是继承破坏了类的封装,而组合能提供更好的封装性。
    2. 继承表达的是is-a关系,组合表达的是has-a关系。
    class Animals{
    	public void swing() {
    		System.out.println("swing arms");
    	}
    	public void swim() {
    		System.out.println("animals-swim");
    	}
    }
    
    class Birds extends Animals{
    	public void swim() {
    		System.out.println("bird cannot swim");
    	}
    }
    
    class Arms{
    	private Animals anml;
    	public Arms(Animals anml) {
    		this.anml = anml;
    	}
    	public void swing() {
    		anml.swing();
    	}
    	public void swim() {
    		System.out.println("no swim");
    	}
    }
    public class Test {
    	public static void main(String[] args) {
    		Animals animals = new Animals();
    		animals.swing();
    		animals.swim();
    		
    		Birds birds = new Birds();
    		birds.swing();
    		birds.swim();
    		
    		Arms arms = new Arms(animals);
    		arms.swing();
    		arms.swim();
    	}
    }
    
  • 相关阅读:
    关于秒杀的系统架构优化思路
    如何设计一个秒杀系统
    RabittMQ实践(二): RabbitMQ 与spring、springmvc框架集成
    RabittMQ实践(一): RabbitMQ的安装、启动
    Java 网络IO编程总结(BIO、NIO、AIO均含完整实例代码)
    Linux 网络 I/O 模型简介(图文)
    Java 网络编程(六) 使用无连接的数据报(UDP)进行通信
    Java 网络编程(五) 使用TCP/IP的套接字(Socket)进行通信
    Java 网络编程(四) InetAddress类
    Java 网络编程(三) 创建和使用URL访问网络上的资源
  • 原文地址:https://www.cnblogs.com/pycrab/p/8729140.html
Copyright © 2020-2023  润新知