`
wangjie2013
  • 浏览: 173816 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java笔记(09,多态与内部类)

    博客分类:
  • JAVA
阅读更多

 

        Last modified:2013-06-12 16:51:55

        ***********************************************

 

多态:

多态:可以理解为事物存在的多种体现形态。

人:男人,女人。

职员:CEO,CFO,普通员工。

 

1,多态的体现

   父类的引用指向了自己的子类对象。人 x=new 男人();

   父类的引用也可以接受自己的子类对象。

 

2,多态的前提

   必须是类与类之间有关系,要么继承要么实现。

   通常还有一个前提:存在覆盖

 

3,多态的好处

   多态的出现大大的提高了程序的扩展性

 

4,多态的弊端

   提高了扩展性,但是只能使用父类的引用访问父类中的成员。

public static void function(Animal a){
   //Animal a = new Cat();
   a.eat();//这个方法是父类中的。不能是子类中的。
}

    

       5,多态的应用

 

Animal a = new Cat();//类型提升;向上转型

a.eat();

//如果想要调用猫的特有方法时,如何操作?强制将父类引用转成子类类型。向下转型

Cat c = (Cat)a;

c.catchMouse();

//千万不要出现这样的操作:就是将父类对象转成子类型。

//我们能转换的是父类引用指向了自己的子类对象时,该应用可以被提升,也可以被强制转换。

//多态自始自终都是子类对象在做着变化。

 

6,多态的在代码中的特点(多态使用的注意事项) 

在多态中(非静态)成员函数的特点:

在编译时期:参阅引用变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。

在运行时期:参阅对象所属的类中是否有调用的方法。

 

简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。

 

在多态中,静态成员函数的特点:无论编译和运行都参考左边。(实际操作中没有人会去覆盖静态)

在多态中,成员变量的特点:无论编译和运行,都参考左边(引用型变量所属的类。)

 

class fu {
   	int i = 1;
   	static String j = "a";
   }
   
   class zi extends fu{
   	int i = 2;
   	int k = 3;
   	static String j = "b";
   }
   class MainClass{
   	public static void main(String[] args){
   		fu obj = new zi();
   		System.out.println("i="+obj.i+" ,j="+obj.j);
   		zi obj1 = (zi)obj;
   		System.out.println("i="+obj1.i+",j="+obj1.j+",k="+ obj1.k);
   	}
   }
    

 

 运行结果:

 

i=1 ,j=a

i=2 ,j=b,k=3

多态时,成员属性不存在覆盖的一说。多态时到底访问的是父类还是子类的成员属性由声明的变量类型决定。

 

 

内部类:

内部类:将一个类定义在另一个类的里面,对里面那个类就称为内部类(内置类,嵌套类)。

内部类的访问规则:

1,内部类可以直接访问外部类中的成员,包括私有

   之所以可以直接访问外部类中的成员,是因为内部类中持有一个外部类的引用,格式:外部类名.this

 

2,外部类要访问内部类,必须建立内部类对象。

 

访问格式:

1,当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中直接建立内部类对象。

如果想要将内部类封装,有两种方法:用private修饰或者定义在函数中。这样就不能在类外部建立内部类的对象了。

 

格式:外部类名.内部类名 变量名 外部类对象.内部类对象;(要指明外部类名!)

outer.Inner in = new Outer().new Inner();

 

2,当内部类在成员位置上,就可以被成员修饰符修饰。比如:private,将内部类在外部类中进行封装。

static:内部类就具备了static的特性。

当内部类被静态修饰后,只能直接访问外部类中的静态成员了。出现了访问局限。(静态内部类只能访问静态成员)

 

在外部其他类中,如何直接访问static内部类的非静态成员呢?

new Outer.Inner().function();

(非静态的成员要用对象去调用。)

 

在外部其他类中,如何直接访问static内部类的静态成员呢?

Outer.Inner.function();

  

注意:

如果内部类在成员位置:

1当内部类中定义了静态成员,该内部类必须是静态的,并且只能直接访问外部类中的静态成员了。

2当外部类中的静态方法访问内部类时,内部类也必须是静态的。

 

访问方式:Inner.function();外部类访问静态内部类中的静态成员)

访问方式:new Inner2().show();外部类访问静态内部类中的非静态方法)

 

当描述事物时,事物的内部还有事物,该事物用内部类来描述。

因为内部事物在使用外部事物的内容。

 

内部类定义在局部时:

1,不可以被成员修饰符修饰 privatestatic 

2,可以直接访问外部类中的成员,因为还持有外部类中的引用outer.this。但是不可以随便访问它所在的局部中的变量(生命周期问题)。只能访问被final修饰的局部变量。

 

匿名内部类:

1,匿名内部类其实就是内部类的简写格式;

2,定义匿名内部类的前提:内部类必须是继承一个类或者实现接口。

3,匿名内部类的格式:new 父类或者接口( ){定义子类内容}

4,其实匿名内部类就是一个匿名子类对象,而且这个对象有点胖,可以理解为带内容的对象。

5,匿名内部类中定义的方法最好不要超过3个。

注意:匿名内部类实际上运用了多态的知识,所以:   

 

Object obj = new Object(){
   void function(){
   System.out.println("nihao");
   }
  }    // .function();  这是可以的!
   obj.function();
   //这是不能调用的,因为多态中你只能调用父类中的方法!
 

 

 

 思考如果某个类要继承另一个类的内部类(非静态),如何实现?

class Outer
{
	static class Inner
	{
		Inner(String str){
			System.out.println("Inner run...");
		}
	}
}

class Other extends Outer.Inner
{
	Other(){
		//new Outer().super("nihao");//Inner非静态时的实现方式。
		super("nihao");//Inner静态时的实现方式。
	}
}
public class MainClass
{
	public static void main(String[] a){
		new Other();
	}
}

 

 

 

 

 

 

0
4
分享到:
评论

相关推荐

    Java学习笔记(多态封装)

    - **信息隐藏**:通过封装,我们能够隐藏类的内部实现细节,只暴露必要的接口,如属性的getter和setter方法,这样外部代码只能通过这些接口与对象交互,而不能直接访问对象的内部状态。 - **类、方法和属性的封装*...

    java笔记 java笔记

    - **内部类分类**:成员内部类、局部内部类、静态内部类、匿名内部类。 - **成员内部类**:作为外部类的成员。 - **局部内部类**:定义在方法或代码块中。 - **静态内部类**:静态成员内部类,不依赖于外部类实例。 ...

    尚硅谷JAVA基础笔记吐血整理

    “尚硅谷JAVA基础笔记”涵盖了Java语言的基础知识,包括语言概述、基本语法、面向对象概念、封装、继承和多态,以及一些关键概念如形参与实参、属性与局部变量、构造器、this关键字、包和MVC设计模式的使用。...

    毕向东Java笔记

    ### 毕向东Java笔记知识点总结 #### 第一章:编程基础 1. **Java的特性和优势**: - **简单性**:Java的设计哲学是“使编程变得简单”。 - **面向对象**:Java完全支持面向对象编程概念如封装、继承和多态。 - ...

    个人整理java笔记

    - 内部类有两种主要类型:非静态内部类和静态内部类。 - 非静态内部类只能定义非静态成员,而静态内部类可以定义静态成员。 - 局部内部类是在方法内部定义的类,只能访问该方法中的`final`变量。 ### 六、异常...

    Java基础尚硅谷宋红康学习笔记

    内部类(包括成员内部类、局部内部类、匿名内部类)是Java特有的特性,允许在类内部定义其他类。 【Java高级】 Java高级部分涵盖了更复杂的特性和技术,包括: 1. **反射**:Java反射机制允许在运行时检查类的信息...

    黑马java教程知识点笔记整理

    Java支持类的继承、封装和多态。继承允许子类继承父类的属性和方法;封装是将数据和操作数据的方法绑定在一起;多态使得不同类型的对象能响应相同的消息。 【接口与内部类】 接口是完全抽象的类,只包含常量和抽象...

    java学习笔记markdown

    2. **面向对象编程**:深入讲解Java的面向对象特性,包括类、对象、封装、继承、多态等概念。这部分内容是Java的核心,有助于理解如何构建可维护和可扩展的软件系统。 3. **集合框架**:详细解释ArrayList、...

    JAVA学习笔记达内内部使用,保证你没有看过

    【Java学习笔记达内内部使用,保证你没有看过】 这篇笔记是针对Java初学者和有一定经验的开发者设计的,由达内教育内部使用的资源,涵盖了从基础到进阶的全面内容,确保提供了一些鲜为人知的见解和深入理解。笔记...

    【笔记式】Java快速入门77课时--多态接口内部类篇(含200条笔记+60个实例)

    多态与接口 4.内部类 课程亮点: 笔记加案例详细讲解Java入门知识!!!提供详细的笔记作为辅助工具,2000多条笔记帮助学员快速掌握Java150多个知识点 课程特色: 笔记JAVA:用200条笔记串连所有知识点,让学员从...

    达内Java培训-CoreJava全程笔记(WORD唐亮版)

    CoreJava DAY06 类的加载过程、实例化、继承、多态 20 CoreJava DAY07修饰符 26 CoreJava DAY08 常用类 29 CoreJava DAY09 高级语言特征 30 CoreJava DAY10 主方法,静态导入,包装类,枚举 32 CoreJava DAY11 内部...

    Java学习笔记(必看经典).pdf

    本知识点的标题为“Java学习笔记(必看经典)”,意味着所整理的内容是针对Java初学者的一系列核心概念和原理的总结。 首先,面向对象编程是Java语言的核心,它与传统的面向过程编程有显著的不同。面向对象编程强调的...

    继承和多态笔记.docx

    ### 继承与多态知识点总结 ...总结而言,接口和抽象类都是为了提高代码的可重用性和可扩展性而设计的,它们共同支撑起了Java面向对象编程中的多态特性。正确理解和使用这些概念对于开发高质量的Java应用程序至关重要。

    java笔记以及案例

    此外,Java笔记中可能还会涵盖基本语法,如变量、常量、运算符、流程控制语句(如if-else、switch、for、while)、方法定义与调用等。这些是编写任何Java程序的基础。深入理解这些概念,能够写出结构清晰、逻辑严谨...

    java笔记(精华集锦)

    封装隐藏了对象的内部细节,提供了公共接口与外界交互;继承允许子类从父类继承属性和方法,减少了代码重复;多态则是同一个方法在不同对象上表现出不同的行为。 文件中可能还会涉及异常处理,Java使用try-catch-...

    java面向对象、类与对象的定义笔记

    理解类与对象以及面向对象编程的这些基本概念,对于学习Java语言以及开发高质量的应用程序至关重要。通过类和对象,我们可以组织和管理代码,使其结构更加清晰,易于理解和维护。而封装、继承和多态这三大特性,不仅...

    达内java笔记

    "达内java笔记"涵盖了Java的基础概念,如类、对象、封装、继承、多态等核心特性。 1. 类与对象:Java是面向对象的语言,一切皆为对象。类是创建对象的模板,包含了对象的状态(属性)和行为(方法)。通过定义类,...

    小码哥-任小龙Java笔记-面向对象的全部笔记

    - 当方法参数名与类中的成员变量名称冲突时,可以使用`this`关键字明确指定使用成员变量。 - 调用当前类中的另一个构造方法。 **7. 构造器重载互调中使用this** - 在同一个类中,一个构造方法可以调用另一个构造...

    java笔记(细节问题讲的很细)

    这份"java笔记(细节问题讲的很细)"很可能包含了Java语言的核心概念、类库使用、编程技巧以及常见问题的解决方案。 一、Java基础 1. 变量与数据类型:Java提供了八种基本数据类型,包括整型、浮点型、字符型和...

    java上课笔记

    在“java上课笔记”中,我们主要探讨了几个核心概念,这些概念构成了Java编程的基础。 1. **面向对象**:面向对象编程(Object-Oriented Programming, OOP)是一种编程范式,它基于“对象”的概念,每个对象都有...

Global site tag (gtag.js) - Google Analytics