`

面向对象相关概念 & Java Tips

阅读更多
类:一类对象的模板
对象:类的一个具体实例

面向对象的三个基本特征是:封装、继承、多态。



继承:
http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
A subclass inherits all the members (fields, methods, and nested classes) from its superclass. Constructors are not members, so they are not inherited by subclasses, but the constructor of the superclass can be invoked from the subclass.
Java是单继承的。除了Object类外,每个类有且只有一个基类。没有明确(explicit)指定基类的类(定义时没有extends),其基类被隐式地(implicitly)指定为Object类。
所以,如果Father implicitly extends Object,Son extends Father,我们不能说Object是Son的基类。但因为继承是Object为根的树状层级关系,Son类“间接继承”了Object类的members。


多态:
定义
引用
多态(动态绑定/运行时绑定/后期)是指“在执行期间(而非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法”。

多态存在的三个必要条件:
引用
1 要有继承
2 要有重写
3 父类引用指向子类对象
注意多态定义中的方法二字!只有类的方法有多态,类的成员变量不存在多态!如下面的例子:
public class AttributeNoPolymorphism {
	public static void main(String[] args) {
		Animal a = new Cat();
		
		//下俩输出说明成员变量不存在多态
		System.out.println(a.i); //10
		System.out.println(a.si);//100 (Dont access the static fields in this way)
		
		//正确的对成员变量的访问是是通过get方法(子类重写了父类的getI()方法)
		System.out.println(a.getI()); //20,这几个sysout中唯一正确的多态体现
		
		//getSi()方法不是重写(static方法无重写这一说!),所以不存在多态
		System.out.println(a.getSi()); //100 (Dont access the static methods in this way)
	}
}

class Animal {
	int i =10;
	static int si = 100;
	
	public int getI() {
		return i;
	}

	public static int getSi() {
		return si;
	}
}

class Cat extends Animal {
	int i = 20;
	static int si = 200;
	
	public int getI() {
		return i;
	}
	
	public static int getSi() {
		return si;
	}
}




重写与重载
重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.8.3
http://docs.oracle.com/javase/tutorial/java/IandI/override.html
关于重写override:
在子类中可以根据需要对从基类中继承来的方法进行重写。
1 子类中重写方法必须和父类中被重写方法具有一样的方法签名(相同的方法名称、参数列表(参数数量一致,对应位置参数类型完全一样))。
2 子类中重写方法的返回类型必须是父类被重写方法的返回类型或其子类型。
3 The overriding method must NOT throw checked exceptions that are new or broader than those declared by the overridden method. For example, a method that declares a FileNotFoundException cannot be overridden by a method that declares a SQLException, Exception, or any other non-runtime exception unless it's a subclass of FileNotFoundException.
4 重写方法不能使用比被重写方法更严格的访问修饰符;private 方法不能被重写。
引用
http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.4.8.3
Note that a private method cannot be hidden or overridden in the technical sense of those terms. This means that a subclass can declare a method with the same signature as a private method in one of its superclasses, and there is no requirement that the return type or throws clause of such a method bear any relationship to those of the private method in the superclass.
5 构造方法不能被继承,因此不能重写。
6 子类不能用 静态方法 重写父类的非静态方法(或者这样表述:子类不可以定义这样的静态方法:1 和父类中方法名相同且参数相同;2 父类中的该方法为非静态的),否则会报“the static method cannot hide instance method from ParentClassXXX
7 子类不能用 非静态方法 重写父类的静态方法(或者这样表述:子类不可以定义这样的非静态方法:1 和父类中方法名相同且参数相同;2 父类中的该方法为静态的),否则会报“This instance method cannot override the static method from First     ParentClassXXX
8 你可以在父类和子类中都定义方法名、参数、返回值均相同的静态方法,但严格的说这不是重写!因为重写体现的是父类对象与子类对象间的多态性;而这个所谓“重写静态方法”,并不会体现出多态性,因为静态方法是类级的;调用的是父类对象的静态方法(当然,并不推荐通过类实例去调类的静态方法),执行的就是父类里的;调用的是子类对象的静态方法,执行的就是子类里的!
Why static method can't be overridden in Java ?
http://en.allexperts.com/q/Java-1046/Static-method-override.htm
引用
Static means one per class, not one for each object no matter how many instance of a class might exist.
This means that you can use them without creating an instance of a class.Static methods are implicitly final, because overriding is done based on the type of the object, and static methods are attached to a class, not an object.
A static method in a superclass can be shadowed by another static method in a subclass, as long as the original method was not declared final. However, you can't override a static method with a nonstatic method. In other words, you can't change a static method into an instance method in a subclass.
import java.util.AbstractMap;
import java.util.HashMap;

public class OverrideTest {
	public static void main(String[] args) {
		Son son = new Son(); 
        Father father = son;
        
        son.aMethod(null);
        father.aMethod(null);
	}
}

class Father {
	protected AbstractMap aMethod(AbstractMap param) {
		System.out.println("Father");
		return null;
	}  
}  

class Son extends Father {
	/***
	 * 访问修饰符:子类的重写方法不能比被重写方法更严格。如这里可以是protected和public,但不能是private和无访问修饰符。
	 * 返回类型:子类重写方法的返回类型必须是父类被重写方法的返回类型或其子类型。如这里就是被重写方法返回类型AbstractMap的子类型HashMap
	 * 方法名:重写肯定需要相同
	 * 参数列表:必须严格相同:参数数量一致,对应位置参数类型完全一样!如这里被重写方法的参数为AbstractMap类型,则重写方法的参数也必须是AbstractMap类型!既不能更宽泛(如Object)也不能更严格(如HashMap)
	 * 
	 */
	@Override
    public HashMap aMethod(AbstractMap param) {
        System.out.println("Son");
        return null;
    }    
}  

关于重载Overloade:
http://docs.oracle.com/javase/tutorial/java/javaOO/methods.html
http://www.java-samples.com/showtutorial.php?tutorialid=284
方法的重载是指一个类中可以定义有相同的名字,但参数不同的多个方法。
方法的名称及其参数类型构成方法的签名,如下面是calculateAnswer方法的签名:
      calculateAnswer(double, int, double, double)
Java是通过方法的签名来区分方法的,这正是重载的理论基础。这里需要注意的是,方法签名是不包含返回值类型的,所以你不可以在代码中声明方法签名一样,只是返回值不同的两个方法,否则编译报错,因为JVM不知道该去调哪个。当然,返回值类型只是不能用来作为方法重载的评判标准,并不是说重载方法就必须具有相同的返回值类型!如下面的也是重载:
	public String m(String s) {
		return s;
	}
	public double m(int i) {
		return i;
	}
另外需要注意的是,父类方法也是可以重载的。如:
//Object类里的equals()方法:
    public boolean equals(Object obj) {
	return (this == obj);
    }

//在自己写的类里这样写不是对Object equals的重写,而是重载,因为你更改了参数类型
    public boolean equals(String obj) {
    	return true;
    }




接口中的成员变量默认是public static final的,即使这三个修饰符你都不加;因为默认是final的原因,所以必须对其进行显式的赋值(http://wuaner.iteye.com/admin/blogs/994819)。


接口和抽象类都是不能实例化的。
如果一个类里包含至少一个抽象方法,这个类必须声明为抽象类
反之不然:抽象类不一定包含抽象的方法,可以全都是具体的方法。
  • 大小: 4.9 KB
  • 大小: 65.1 KB
  • 大小: 14.4 KB
分享到:
评论

相关推荐

    330 Java Tips(330 JAVA 小技巧)

    - **面向对象编程**:深入了解Java的面向对象特性,如封装、继承、多态等。 - **集合框架**:掌握Java集合框架的核心类和接口,如`List`、`Set`、`Map`等。 - **异常处理**:理解Java异常处理机制,包括异常的捕获、...

    1000 Java Tips

    此外,深入理解类的封装、继承和多态性是面向对象编程的基础。 2. **异常处理**:Java的异常处理机制允许程序员捕获并处理运行时错误,使用try-catch-finally语句块和特定的异常类可以有效地控制程序流程,提高程序...

    java学习流程java基础语法学习

    * 面向对象编程:面向对象编程是Java语言的核心概念,包括封装、继承、多态等特性。 * Java基础语法:包括基本数据类型、运算符、控制流、数组定义等。 Java学习Tips *掌握类和对象的概念是学习Java的关键。 *学习...

    500 JAVA Tips

    这是针对Java基础知识的系列教程,覆盖了语言基础、面向对象编程、异常处理等多个方面,适合Java初学者入门学习。 #### 10. Java Hardware 讲解了Java程序如何与硬件设备进行交互,包括串口通信、网络接口卡操作等...

    330 个 有用的Java Tips

    Java是一种广泛使用的面向对象的编程语言,以其跨平台性、高效性和强大的库支持而闻名。这里我们将探讨"330个有用的Java Tips"这个主题,它涵盖了Java编程的各种技巧和最佳实践,旨在帮助开发者提高代码质量,提升...

    500 Java Tips

    2. **类与对象**:深入理解面向对象编程,如封装、继承和多态,以及如何设计和实现类。 3. **接口与抽象类**:学习如何使用接口来定义行为规范,以及何时使用抽象类来实现代码复用。 4. **集合框架**:熟悉...

    Java学习Tips330个

    - **基础知识**:包括Java语法、面向对象编程原则等。 - **高级特性**:如泛型、注解、Lambda表达式等新特性。 #### 2.8 Java Hardware - **硬件交互**:介绍了Java如何与硬件设备交互,如串口通信、USB设备等。 - ...

    1000_Java_Tips_low.pdf

    3. **面向对象编程**:Java是面向对象的语言,可能会介绍如何进行类的设计,包括封装、继承、多态等概念,以及如何使用接口和抽象类来实现设计模式。 4. **集合框架**:Java的集合框架提供了丰富的数据结构,文档...

    java面试tips 支付宝面试要求.zip

    - **类与对象**:理解面向对象编程的基本概念,包括封装、继承、多态。 - **异常处理**:熟悉try-catch-finally语句,理解Checked异常和Unchecked异常的区别。 - **集合框架**:了解List、Set、Map接口及其实现类...

    SUN-JAVA-SCJP认证考试

    这个考试主要针对Java编程语言的基础知识,包括语法、面向对象概念、异常处理、多线程、输入/输出、集合框架以及数据库连接等内容。通过SCJP认证,证明了考生具备编写高质量、可维护的Java程序的能力。 模块5...

    难得的英文java技巧汇总

    - **面向对象编程**:如类的设计、继承、多态性等。 - **异常处理**:如何正确地处理运行时异常。 - **集合框架**:Java中的集合类及其使用方法。 - **并发编程**:多线程编程的基础和最佳实践。 - **性能优化**:...

    ways-to-java-study.rar_site:www.pudn.com

    Java是一种广泛使用的面向对象的编程语言,以其跨平台兼容性和强大的功能而闻名。"ways-to-java-study.rar"这个压缩包文件显然包含了帮助学习Java的资源,特别是"1000 Java Tips翻译",这可能是一个包含了一千个Java...

    学java该看的一些书~

    作者 Bruce Eckel 用通俗易懂的语言讲解了 Java 的核心概念,包括面向对象编程、泛型、异常处理等内容。 - **O'Reilly 出版社的《Java 系列丛书》**:这一系列书籍涵盖了 Java 的各个方面,包括基础知识、高级特性...

    21天学通java(英文版)

    - **第二周**:深入探讨类和对象、继承、封装、多态等面向对象编程的核心概念。 - **第三周**:讲解更高级的主题,包括异常处理、输入/输出操作、图形用户界面(GUI)开发等。 #### 特色与辅助工具 为了帮助读者更好...

    tips

    2. **面向对象编程**:Java是纯面向对象的语言,支持类、对象、继承、封装、多态等概念。类是对象的蓝图,对象则是类的实例。继承允许一个类(子类)继承另一个类(父类)的属性和方法。封装是将数据和操作这些数据...

    在哪里可以获取视频或在Java编码上进行项目的一些技巧? 请提供一些有关此查询的详细信息。

    - Java是高级面向对象的语言,具有垃圾回收机制,而C是更底层的编程语言,需要手动管理内存。 - Java更适合大型企业级应用,C则在嵌入式系统和高性能计算中占据一席之地。 8. **社区与论坛**: - 加入Java开发者...

    SCJP 065 题库

    - **类与对象**:介绍面向对象编程的基本概念,包括类的定义、对象的创建与销毁、封装、继承和多态。 - **异常处理**:讲解如何使用try-catch-finally语句块进行异常处理,以及不同类型的异常类和自定义异常。 - ...

    techtips:一个存储我打算发布的技术技巧的地方。 希望

    2. **面向对象编程**:封装、继承、多态是Java的核心特性,理解并能熟练应用这些概念是成为合格Java开发者的关键。 3. **异常处理**:Java中的异常处理机制允许程序员优雅地处理运行时错误,确保程序的稳定性和可靠...

Global site tag (gtag.js) - Google Analytics