final,abstract还有接口の初体验 十年饮冰 难凉热血田林哥哥复习:toString方法:任何类都是Object的子类,toString是在Object里面定义的,所以没重写的对象都是用toStr`ing方法来返回有关该对
十年饮冰 难凉热血 田林哥哥 复习: toString方法: 任何类都是Object的子类,toString是在Object里面定义的,所以没重写的对象都是用toStr`ing方法来返回有关该对象信息的字符串(类型和地址); 简单类型的封装类对象一旦调用toString,那就把封装的基本数据转换为字符串输出; 注意:当一个对象调用toString方法时,实际上是先调用一个静态方法valueOf()来判断该对象是否为Null,如果不为null,再调用toString方法 equals方法: equals也是在object里面定义的喔,所以每个类都有equals方法喔;如果没有重写equals,那就直接通过 == 来判断,就是先判断是否为同一类型,再判断是否为同一对象,必须完全相同才为true; 那就让我来教你重写sb.equals(obj)吧! 1.if(obj == null) return false; //如果比较对象为Null,那么就肯定是false 2.if(sb == obj) return true;//多态比较:拿到父类引用类型变量 所指的 子类对象的实际地址 //如果这两个指向同一个对象,那就肯定是true呀 3.if(sb.getClass().getName() != sb.getClass().getName()) Return false; //如果两个对象的类型不一样,那就是false哟 4.Somebody sob = (Somebody) obj;//把父类的引用型变量强制转换为子类,下转型,这样才能获取子类新增的属性嘛 5.(sb.name)==(sob.name)&&((sb.sex)==(sob.sex)).... //最后把两对象的属性都比较一次就好了,简单吧! static关键字: static修饰的东西都是跟类关联的哦 所以如果static跟属性关联,那就是 静态全局变量,每个对象的属性里都有一个属性存放对该静态全局变量的引用,所以对它进行的任何操作都会影响到整个类的对象,所以慎用; 如果static修饰初始化块,那就是 静态初始化块,它在加载类为静态全局变量开辟了空间,立即为静态全局变量初始化;一个类允许有多个静态初始化块,但每个静态初始化块只能执行一次; 如果用static修饰方法,那就是静态方法,静态方法由类来调用,用于操作静态全局变量,就算被对象调用,也不会接收对象的地址。 PS:可以用初始化块为静态全局变量设置,因为初始化块接收的对象地址,对象的属性中也有对该静态全局变量的引用,但是尽量别用。一般静态全局变量就用静态初始化块赋值一次就好了。 单例: 一个类只能有一个对象,多个线程同时访问同一个对象; 优点是:数据共享和配合同步保证项目安全 缺点是:降低了项目的并发性,还增加了耦合性 三大特点: 私有静态全局变量+私有构造方法+用静态方法获取/创建对象 懒汉模式:Singleton s1 = null;//等到需要时,再创建对象 饥汉模式:Singleton s2 = new Singleton();//一加载类就创建对象 新姿势: final(不可变的)关键字: final修饰的类 是不能被继承的 被阉了 final修饰的变量 在初始化后,值就不可再变了 final修饰的方法 可以被子类继承,但绝对不能被覆盖 final静态全局变量:只能初始化,不能被赋值 final基本类型的实例全局变量:也只能初始化,不能赋值 final引用类型的实例全局变量:不能改变它所指的对象,但是能改变它所指对象里的内容 final局部变量:如果没有确切的初值,那就就能赋值一次,如果初始化了,那也就不能变了 方法中的形参可以为final的,这样该局部变量就只能被赋值一次 PS:接口不能有构造方法,接口里的属性都是public static final修饰的,所以也不能有初始化块 abstract(抽象的)关键字: 抽象方法:只有声明,没有实现; 语法:访问权限 abstract 方法名(); 抽象类: 语法:访问权限 abstract class 类名(){} 有抽象方法的类必须是抽象类; 继承了抽象类的子类必须对抽象类的抽象方法进行覆盖,不然他也变成抽象类了 抽象类可以有属性,必须有构造方法,但是不能创建对象,它的构造方法是为了当子类创建对象的时候调用抽象类的构造方法为继承的属性进行初始化 PS:如果一个类实现了某个接口,却没有实现接口中的所有方法; 只要有一个方法是抽象方法,那这个类就是抽象类 子类对继承抽象类的方法重写叫覆盖,对接口的抽象方法的重写叫实现 银行例子: 子类通过从父类继承的set方法对父类的私有属性设值; 然后子类再通过从父类继承的get方法来获取父类私有属性的值; 子类对象.父类的抽象方法();//会调用子类覆盖父类的方法,还可以通过这个方法调用从父类继承的其他方法从而操作父类的私有属性 父类的构造方法可以调用子类继承父类并重写的方法; 多态:父类同一个方法在子类中有不同的实现 适配器Adapter:用一个适配器把多个类的对象转换为同一种类型来处理 把用户不同的需求,通过适配器转换为统一的一段代码来实现(拥抱需求,降低耦合性) 静态联编:在编译的时候就知道调用哪个重载方法 动态联编:在执行的时候才知道调用哪个对象的方法,又叫动态多态 PS:适配器模式:使接口不兼容的类可以一起工作 接口の初体验: 接口是final类型变量(只能赋值一次)和方法的集合。 接口的访问权限只能为public或者default(默认),一个类中只有一个接口用public修饰,其他只能默认 接口的定义: public interface 接口名{ int 属性;//省略了,其实是public final int 属性; 返回值类型 方法();//也省略了public } 一个类只能继承一个抽象类,一个子接口却可以继承多个父接口。 不问过往 只奔将来