zoukankan      html  css  js  c++  java
  • 【Java】instanceof、abstract、final、interface、内部类、Object类

    instanceof 关键字

    对象引用名  instanceof  类名 ,来判读引用的对象和类名是否兼容(是否继承该类,或爷爷辈的类)
    
    例子:
    		Team team = new Team();
    		team.addMember(new Magicer("jwnming",6));
    		team.addMember(new Soldier("dogee",4));
    		team.addMember(new Magicer("wanggl",7));
    		System.out.print("
    " + "团队成员:");
    		for(int i = 0;i < team.allRole.length;i++){
    			if (team.allRole[i] instanceof Role ) {
    				System.out.print(team.allRole[i].getName() + "  ");
    			}
    		}
    		System.out.println("
    " + "
    " +"这个团队的总伤害值:" + team.attackSum());
    

    abstract修饰符、及其他修饰符的修饰对象

    public			可以修饰属性、方法、构造方法、类
    protected			可以修饰属性、方法、构造方法
    default			可以修饰属性、方法、构造方法、类
    private			可以修饰属性、方法、构造方法(如果修饰构造方法全为私有,则该类不支持被继承)
    abstract			可以修饰方法、类
    final 			可以修饰属性、方法、类
    
    1.	abstract修饰类时,这个类只能声明引用、不能创建对象,可供子类继承(多态)
    2.	abstract修饰方法,抽象方法没有实现({}),只有声明(abstract void method();),供子类去覆盖实现
    3.	总结:
    a)	如果一个类具有抽象方法,那么这个类就必须是抽象类,但抽象类不一定有抽象方法
    b)	如果一个类继承抽象类,但若这个类不希望成为抽象类,这个类就必须实现父亲类中所有的抽象方法
    c)	抽象类也拥有构造方法,供子类用super()调用
    d)	抽象方法可以使方法的声明和实现部分分离,声明提取到父类,实现留在子类,则更好的体现子类的共性放在父类的设计思想
    17 -static修饰符、类加载
    1.	修饰属性:静态的属性不属于任何对象,全类及其对象共用,可以用类名直接调用
    2.	修饰方法:静态的方法可以直接用类名调用,和对象无关。静态方法只能访问静态成员和静态方法,非静态方法可以调用静态方法
    3.	静态方法只能被子类的的静态方法覆盖,而且没有多态(因为对引用调用静态方法,等价于对引用的类型调用静态方法),静态修饰符和抽象修饰符不能在一起使用
    4.	静态初始代码块在类加载的时候执行一次
    a)	类加载:当JVM第一次使用一个类的时候,需要提取这个类的字节码文件,获取类的信息并保存起来
    b)	类加载过程(顺序):	①如果需要先加载父类的静态代码块,再加载子类的静态代码块;	
    ②再加载父类的初始化代码块进行初始化和调用构造方法;
    ③最后加载子类的初始化代码块进行初始化和调用构造方法 
    (总结:创建类时、先递归的从基类到派生类加载静态代码块,再依次初始化属性和调用构造方法)
    c)	加载类的时机:①当第一次创建对象时;②第一次访问类的静态成员时
    

    final修饰符

    1.	final修饰方法:用final修饰的方法不能被子类覆盖,但可以被继承
    2.	final修饰类:用final修饰的类不能被继承
    3.	final修饰变量:
    a)	修饰局部变量:一旦赋值就不能更改(常量)
    b)	修饰成员变量:用final修饰的类的成员变量,没有默认值,可以通过初始化赋值一次。如果只声明而没有初始化赋值,就必须在所有构造方法里赋值或用static修饰的代码块
    

    接口interface

    接口:接口是一个特殊的抽象类
    
    	注意:
    )接口中所有的方法都是公开抽象方法(public abstract 方法名,可以省略不写) 
    (在jdk8后接口中可以有default、static方法. jdk9后几口中可以有private方法) 变态不?
    )接口中的属性都是公开静态常量(public static final 常量名 ,可以省略不写)
    )接口中没有构造方法,而抽象类中有构造方法
    )一个类实现一个接口,如果这个类不希望成为一个抽象类,则就必须实现接口中的所有方法
    
    	接口的特性:
    		)接口之间可以定义多继承关系(接口之间的继承仍然是用extends,用“,”分隔)
    		)一个类在继承另外一个类的同时,还能实现多个接口此时多个接口之间用“,”隔开
    
    	接口的作用:
    	)实现多继承(注意不全是多继承,例如一个类不可能有两个方法名相同、参数表相同、放回值类型相同
    	   的两个方法,所有就要求继承多个父类时,父类如果有相同方法时,就会出错)
    	)接口是一个标准(提高编程的弱耦合性)
    	   定义接口就是定义一个标准,就把标准的实现者和标准的使用者分离,从而形成弱耦合关系
    

    内部类

    例如:
    	class A {					//外部类
    		class B {  }			//内部类
    }
    	上面的类编译之后会生成两个独立的类:A.class     A$B.class
    
    	内部类可以访问外部类的私有成员
    
    	集中内部类:
    1、	成员内部类:在一个类里面有一个类,例如上面的例子
    创建内部类对象:先创建外部类对象,再创建内部类对象(A a = new A(); A.B b = a.new B();)
    
    2、	静态内部类:内部类的修饰符为static
    特点:①只能访问外部类的静态成员②可以直接创建内部类对象
    创建内部类对象:A.B b = new A.B();
    
    3、	局部内部类:在外部类的成员方法里面定义一个类
    作用范围:从定义开始,到所在代码块结束
    特点:①把创建对象语句写在方法里,当外部类调用方法时创建局部内部类②局部内部类不仅可以访问外部类的成员,还能访问外部类的局部变量,但必须加上final(常量),(1.8以上可以不写,虚拟机会根据代码默认加上)
    main:A a = new A(); 
    a.method();  //注意,应将局部类的创建在方法内
    
    class A { 
    public void method() {
    	class B {  	}
    }
    }
    4、	匿名内部类:是一种特殊的内部类
    条件:①实现一个接口或是继承一个类时②只会创建这个类的一个对象时
    例如:在main函数内实现一个接口IA:
    IA a = new IA(){     //直接实现该几口,没有要实现该接口的类名
    		@Override
    		public void method() { }//实现该接口的方法
    }
    

    Object类

    Object 是java中所有类的父类,Object o = 任何对象。Object 类中的方法是所有类对象都具有的方法

    Object 类的方法:
    
    1.	getClass():获得对象的实际类型,例如getClass(animal)和getClass(dog) 的类型不同(dog extends animal)
    2.	finalize():在对象被垃圾回收的时候,由垃圾收集器自动调用。当内存资源即将耗尽,不得不回应时,才会启动垃圾回收(垃圾回收不应该在finalize()里执行)
    3.	toString():返回对象的字符串形式,打印一个对象就是打印对象的toString()方法的返回值
    4.	equals():判断两个对象(引用,例如String类型)内容是否相同
    “==” 是判断两个引用是不是指向同一对象。
    基本属性(如int,long)可以用“==”比较值是否相等;对象类型用equals比较引用的地址内的内容是否相同
    equals方法覆盖:
    public boolean equals(Object o) {
    			if(this == o) return true; //自反
    			if(o == null) return false; //空对象
    			if(this.getClass() != o.getClass()) return false; //判断实际类型不同
    			T t = (T) o; //T代表当前对象类型
    			逐一比较属性,若全部相等和相同,返回true; 		   在逐一属性比较时注意字符串要判断是否为空,如下:
    			return false ;   //根据以上筛选返回true或false;
    		 }
    5.	hashCode():哈希码(public int hashCode())
    public int hashCode() { //简单覆盖
    	将字符串属性的hashCode与其他数值类型属性的值相加,返回
    }
    6.	wait(),notify(),线程的等待(进入阻塞,释放锁标记和CPU)与通信(将其他线程从阻塞状态进入可执行状态,当执行完当前线程后,将锁标记归还给其他使用wait的线程),在线程加锁的代码块内使用
    
    还有wait(),notify() 在多线程一节的线程通信讲解
    
  • 相关阅读:
    苹果是如何做到快速发货的?
    亚马逊危险了!面临创业公司和科技巨头的颠覆
    We are writing to let you know we have removed your selling privileges
    亚马逊获20亿美元信用额度:有助新业务投资
    亚马逊与美国邮政合作试营快递生鲜服务
    2013下半年(11月)信息系统项目管理师考试题型分析(综合知识、案例分析、论文)
    SQL Server Profiler参数说明
    SQL2005查询所有表的大小
    SQL中EXISTS的用法和效率
    在线生成APK
  • 原文地址:https://www.cnblogs.com/jwnming/p/13633969.html
Copyright © 2011-2022 走看看