面向对象基础知识整理

浅笑_Kang'

贡献于2015-08-03

字数:0 关键词:

面向对象基础概念 目录 TU final关键字UT ......................................... 2 TU StaticUT ............................................... 3 TU 多态UT ................................................. 4 TU 构造函数UT ............................................. 5 TU 重载UT ................................................. 5 TU 重写UT ................................................. 6 TU 抽象类UT ............................................... 6 TU 接口(Interface)UT ...................................... 8 1 final 关键字 final 关键字表示'终态的','无法改变的', 它可以修饰非抽象类,非抽象方法及变量 final 类不能被继承,没有子类,final 类中的方法默认是 final 的 final 方法不能被子类覆盖,但可以继承 final 变量只能一次赋值,不可更改 final 不能修饰构造函数 1. final 类 final 类不能被继承,没有子类,final 类中的方法默认是 final 的。如果这个类不 需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final 类 2. final 方法 final 方法不能被子类重写,但可以继承,可以重载 第一、 把方法锁定,防止任何继承类修改它的意义和实现。 第二、高效。编译器在遇到调用 final 方法时候会转入内嵌机制,大大提高执行效 率。 例: public class FinalTest2 { public final void test(){ System.out.print("这是一个最终方法!"); } public final void test(String name){ System.out.print("重载final方法!"); } } public class FinalTest2Sub extends FinalTest2{ // Cannot override the final method from FinalTest2 // public final void test(){ // System.out.print("final方法不能被重写!"); // // } public static void main(String[] args) { FinalTest2Sub test=new FinalTest2Sub(); test.test();//这是一个最终方法!final方法可以继承 test.test("guo");//重载final方法!final方法可以被继承 } } 3. final 变量/常量 用 final 修饰的成员变量表示常量,值一旦给定就无法改变。 final 变量定义的时候,可以先声明,而不给初值,这中变量也称为 final 空白, 无论什么情况,编译器都确保空白 final 在使用之前必须 被初始化 例: 2 public class FinalTest { // 定义final变量 private final String s="final 变量"; // final空白,必须初始化 private final int i; public FinalTest(int i){ this.i=i; } public static void main (String[] args){ FinalTest finaltest=new FinalTest(100); // The final field FinalTest.s cannot be assigned // (finaltest.s="改变";) FinalTest finaltest2=new FinalTest(10); System.out.print(finaltest.i);//输出100 System.out.print(finaltest2.i);//输出10 //可以看出final空白随对象的不同而不同 //(finaltest.i=90;)出错,final空白赋值后也不能被修改 } } 1. final 参数 当函数参数为 final 类型时,你可以读取使用该参数,但是无法改变该参数的值 例: public class FinalTest1 { public int test(final int i){ // The final local variable i cannot be assigned. It must be blank and not using a compound assignment // (i=i+1;)出错,final参数不能被修改 return i;//final参数能调用 } public static void main(String[] args) { // TODO Auto-generated method stub FinalTest1 test=new FinalTest1(); System.out.print(test.test(2)); } } 整理者:郭巍巍 2010-7-1 Static static 表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形 3 成静态 static 代码块。但是 Java 语言中没有全局变量的概念。 被 static 修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类 特定的实例,被类的所有实例共享。只要这个类被加载,Java 虚拟机就能根据类名在运行 时数据区的方法区内定找到他们。因此,static 对象可以在它的任何对象创建之前访问, 无需引用任何对象。 1、static 成员 被 static 修饰的成员变量和成员方法独立于该类的任何对象。 按照是否静态的对类成员变量进行分类可分两种:一种是被 static 修饰的变量,叫静 态变量或类变量;另一种是没有被 static 修饰的变量,叫实例变量。两者的区别是: 对于静态变量在内存中只有一个拷贝(节省内存),JVM 只为静态分配一次内存,在加 载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象 来访问。 对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中 有多个拷贝,互不影响。 2、静态方法 静态成员是属于类的, 调用一个静态方法就是“类名.方法名”,调用一个静态成员 就是“类名.变量名”, 静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用 this 和 super 关键字,不能直接访问所属类的实例变量和实例方法(就是不带 static 的成 员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特 定的对象关联! 因为 static 方法独立于任何实例,因此 static 方法必须被实现,而不能是抽象的 abstract。 静态方法可以被重载,但在子类中不能被重写(看上去可以重写),也就不支持多态 3、static 代码块 static 代码块也叫静态代码块,是在类中独立于类成员的static 语句块,可以有 多个,位置可以随便放,它不在任何的方法体内,JVM 加载类时会执行这些静态的代码块, 如果 static 代码块有多个,JVM 将按照它们在类中出现的先后顺序依次执行它们,每个代 码块只会被执行一次。例如: public class Sample{ private static int a=100; private static int b; static{ b=100; } public static void main(String[]args){ System.out.println("两个常量的值分别为:"+a+""+b); } } 整理者:郭巍巍 2010-7-2 多态 知识点: 4 1.对象多态定义:同一个对象对于同样的消息,能有不同的响应。 2 多态是展现在‘方法’ 而不是在字段 3 多态现象源自“在父类中定义的对象,能够引用子类建立的实例,而且子类能覆盖父类的 方法”。 4 多态现象不只由于运用接口而产生,一般类也会形成多态 5 父类原始定义的若不是 abstract 方法,则必须是子类 Override 该方法,对象使用该方 法时才可能有多态。 整理者:张海浪 2010-7-2 构造函数 构造函数是创建对象并初始化对象内部的成员变量的。 构造函数说明: 1)构造函数的方法名和类名相同 2)构造函数没有返回值 3)构造函数的内部逻辑基本只与类的成员变量赋初值有关 4)构造函数的调用只能是接在 new 关键字之后的 构造函数的继承与重载: 1) 默认字段初始化:如果构造函数中没有明确的给某个字段赋值,那么此字段会被自 动地赋值以一个默认值 2) 默认构造函数:如果编写了一个没有构造函数的方法,系统会自动的为此方法提供 一个默认构造函数,字段初始化为默认值。例:Person(){} 3) 用 this 关键字调用另一个构造函数! 其他知识点: 1) 子类不能从父类继承构造函数,只能继承属性和方法 2) 构造函数不能被重写,能被重载 3) 不能有抽象的构造函数 整理者:王长伟 2010-7-1 重载 知识点: 1. 重载:即在原有的方法在做一些逻辑的补充,重载的方法与原有的方法:(1)方法名一 样,(2)参数不同(个数,顺序,类型),(3)返回值类型不考虑,(4)方法修饰符不 考虑 2. 重载可以发生在同一个类中,也可以发生在父类与子类中 ‹ 在同个类中使用: Public Employee(String name){ this.name = name; } //重载构造函数 Employee 5 Public Employee(String name,double salary){ this(name); this.salary = salary(); } ‹ 在父类与子类中: 使用 static 函数 或 final 函数 3. 构造函数不能再子类中重载,只能在当前类重载 Static 函数可以在当前类重载,也可以在子类中重载 final 函数可以在当前类重载,也可在子类中重载 整理者:倪燕 2010-7-1 重写 知识点: 1. 重写(override):方法名,参数,返回值都一样 2. 重写只发生在父类与子类中 3. 父类中 static 函数,子类 override 时写成 final 函数;X 父类中普通函数,子类 override 时写成 final 函数; √ 父类中static函数,子类override时(虽然满足重写条件,但次处不是重写)写成static final 函 数; (因为当你在该方法上方写上@Override验证时,出现错误) 4. 构造函数不能被重写 整理者:倪燕 2010-7-1 抽象类 知识点: 1. 抽象类用 abstract 标识类 抽象类如:public abstract class AbsFather {} 2. 类中声明了方法的存在,但没有对其实现 3. 抽象方法后面不可加{} 抽象方法如:public abstract String getName(); 4. 抽象类有构造函数,但不能被实例化 5. 当声明一个子类的引用指向子类的对象时,先调用父类的构造函数,再调用子类的构造 函数 6. 抽象类的构造函数不能声明为 abstract,原因有: (1) 若构造函数是抽象的,则子类中必须实现它,即重写它,但构造函数是不能被 重写的; (2) 因为构造函数需要实现,而声明抽象方法是不需要被实现的,两者矛盾。比如: 一个构造函数的声明是这样的 public AbsFather(){} 而声明一个抽象方法 后不可加{} 7. 抽象类中可以没有抽象方法 8. 抽象方法的修饰符为:public,protected 举例说明: 6 主类 TestAbs 类中: 1. AbsFather af = new AbsImplement(); af.getName(); //调用(3)中的方法 af.getSex(); //调用(3)中的方法 若(3)中没有 getSex 方法,则 af 调用(2)中的 getSex()方法; 若(2)(3)中都没有 getSex 方法,则 af 调用(1)中的 getSex()方法 若(3)中没有 getName()方法,则 af 调用(2)中的 getName()方法; 若(2)(3)中都没有 getName()方法,则出现编译错误,因为父类中的抽象方法 必须在子类中实现。 2. AbsSon as = new AbsImplement(); as.getName(); //调用(3)中的方法 as.getSex(); //调用(3)中的方法 结果同上 3. AbsImplement ai = new AbsImplement(); as.getName(); //调用(3)中的方法 as.getSex(); //调用(3)中的方法 结果同上 4.若(2)(3)中没有 getSex 方法,而需调用(1)中的 getSex()方法,解决方法如 下: z AbsFather ap = new AbsFather(){public String getName(){return "";}}; ap.getSex(); z 在 AbsFather 类中定义一个方法: public static AbsFather getInstanceInfo(){ 7 return new AbsImplement(); } 在主方法中调用: AbsFather.getInstanceInfo().getSex(); z AbsFather af = new AbsImplement(); af.getSex(); 整理者:倪燕 2010-7-1 接口(Interface) 接口是用来实现类间多重继承功能的结构,接口是抽象方法和常量值的定义的集合。 从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变 量和方法的实现。 可以理解为是由常量和抽象方法组成的一种特殊类; 接口定义举例: public interface Runner { public static final int id = 1; public void start(); public void run(); public void stop(); } 注:public static final 可以不写,其可默认 知识点:1)多个无关的类可以实现同一个接口。 2)一个类可以实现多个无关的接口。 3)与继承关系类似,接口与实现类之间存在多态性。 4)可以使用 instanceof 运算符来确定对象的类是否实现接口。 接口特性(参考资料:尚学堂教程): 1)接口可以多重实现。如:public class Student implements Person,Study {} 同时实现了接口 Person 和 Study 2)接口声明的属性默认为 public static final 的;也只能是 public static final 的。 3)接口中只能定义抽象方法, 这些方法默认为 public 的 也只能是 public 的。 4)接口可以继承其他的接口,并添加新的属性和抽象方法。 接口的使用(参考资料:博睿软件工程师课程): 1)声明方法,该方法将由一个或多个类实现。 2)显示对象的编程接口而不怕暴露类的实际主体(再向其他开发人员发布类包时, 这很有用)。 3)捕获无关联类之间的相似性,而无需强加类关系。 4)通过声明一个实现若干接口的类来模拟多重继承。 附:接口和抽象类的联系与区别: 接口 抽象类 8 功能 实现多继承 作为直接父类被继承 全局属性 必须是 public,static,fina 类型的常量 没有要求 内部方法 必须是 public 的抽象方 法 没有要求 抽象方法 子类如果是接口,或实现 类是抽象类就不需要实 现抽象方法 相同 是否有实例对象 没有 没有 子类对父类 implements extends 整理者:王长伟 2010-7-1 9

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档

相关文档