黑马程序员--面向对象三(final、abstract、Interface、Object、内部类)
2013-06-15 23:46
435 查看
------- android培训、java培训、期待与您交流!
----------
一、final
final:最终,终态。是一个修饰符
特点:
可以修饰类、变量、函数。
被修饰的类不可以被继承。
被修饰的函数不可以被复写。
被修饰的变量是一个常量只能赋值一次。可以修饰成员变量和局部变量。挡在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都给这些值起个名字,便于阅读。而这个值不需要改变,所以加上final修饰。作为常量存在。常量的书写规范是所有字母都大写,如果有多个单词组成,用"_"连接。
内部类定义在类中的局部位置时,只能访问该剧不被final修饰的局部变量。
二、抽象类 abstract
抽象:笼统,看不懂。当多个类出现相同功能,但是主体不同,这时进行向上抽取,但是只能抽取功能的定义,抽取不了主体。这时抽取到的方法并不具体,需要被关键字abstract所修饰。
特点:
抽象方法一定在抽象类中。
抽象方法和抽象类都必须被abstract所修饰。
抽象类不可以用new创建对象,因为调用抽象方法没有意义。
抽象类中的抽象方法要被使用,必须由子类复写其所有抽象方法后建立子类对象调用。如果子类只覆盖了部分抽象类方法,那么该子类还是一个抽象类。就算建立空函数也要覆盖。
抽象类和一般类没有太大的不同
该如何描述事物,就如何描述事物,只不过该事物出现了一些看不懂的东西。这些不确定的部分,也是该事物的功能,需要明确出现,但是无法定义主体,就通过抽象方法来表示。
特殊:
抽象类中可以不定义抽象方法,作用仅仅是不让该类实例化。
抽象是可以定义构造方法,为了让其子类实例化。
抽象关键字abstract和final、private、static 不可以共同出现。
三、接口 Interface
接口:特殊的抽象类。定义规则和约束
特点:
接口中常见定义:常量和抽象方法。
接口中的成员都有固定的修饰符。
常量:public static final
方法:public abstract
就是说接口中的方法都是抽象的。缺少任意一个修饰符,系统都会自动补上,接口中的成员都是public的。
关系
A:类与类的关系:是继承关系。类与类只能单继承,可以多重继承。
B:类和接口的关系:是实现关系。类可以多实现接口;类在继承一个类的同时,可以实现多个接口。
C:接口和接口的关系:是继承关系。接口可以多继承接口。
接口是不可以创建对象的,因为有抽象方法。
需要被子类实现,子类对接口中方法全部覆盖后才可以实例化,否则子类也只是一个抽象类。
impements跟extends一样,不过是用于实现接口。
接口的优点
A:是对外暴露的规则
B:提高了功能的扩展
C:降低功能之间的耦合性。(模块化开发)
D:接口可以多实现。如:CPU和主板、笔记本的USB插口、插座.
给类另外增加功能,体系意外的功能扩展,
搞清楚什么是类的基本功能,什么是扩展功能。
不同类基本功能不同,学生类和工作这类的基本功能不一样。
接口和抽象类的区别
A:抽象类只能被单继承; 接口可以多实现,接口的出现避免了多继承的局限性。
B:
抽象类中的数据特点:
成员变量:可以是变量,也可以是常量
成员方法:可以是抽象方法,也可以是非抽象方法
构造方法:有构造方法
接口中的数据特点:
成员变量:是常量。默认修饰 public static final
成员方法:都是抽象方法。都有默认修饰 public abstract
构造方法:没有构造方法
C:抽象类中定义的是继承体系中的共性功能; 接口中定义的是继承体系中的扩展功能。
D:抽象类被继承是"is a"关系:xx是yy的一种;接口被实现是"like a"关系:xx像yy的一种
四、Object
Object:是所有对象的直接或者间接父类。Java认为所有的对象都具备一些基本的共性内容,这些内容可以不断的向上抽取,最终就抽取到了一个最顶层的类中的,该类中定义的就是所有对象都具备的功能。
常用方法:
boolean equals(Objectobj):用于比较两个对象是否相等,其实内部比较的就是两个对象地址。
而根据对象的属性不同,判断对象是否相同的具体内容也不一样。所以在定义类时,一般都会复写equals方法,建立本类特有的判断对象是否相同的依据。
String toString():将对象变成字符串;默认返回的格式:类名@哈希值 = getClass().getName()+ '@' +Integer.toHexString(hashCode());为了对象对应的字符串内容有意义,可以通过复写,建立该类对象自己特有的字符串表现形式。
Class getClass():获取任意对象运行时的所属字节码文件对象。反射的基石
int hashCode():返回该对象的哈希码值。支持此方法是为了提高哈希表的性能。应用于hash集合。
——————————————————————————————
五、内部类
访问规则:
1、内部类可以直接访问外部类中的成员,包括私有。
之所以可以直接访问外部类中的成员,是因为内部类中持有了一种外部类的引用格式:外部类名.this
2、外部类要访问内部类,必须建立内部类的对象。
访问格式:
1、当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。
可以直接建立内部类对象
格式:外部类.内部类 变量=new 外部类().new内部类()
如:Out.Inner in = new Out().new Inner();
2、但内部类在成员位置上,就可以被成员修饰符所修饰,
比如:
private:将内部类在外部类中进行封装
static:内部类就具备了static的特性
但内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限
在外部其他类中,如何直接访问static内部类的成员呢?
非静态:new Outer.Inner().function()
静态:Outer.Inner.function()
注意:
当内部类定义了静态成员时,该内部类必须是static的。
但外部类中的静态方法访问内部类时,内部类也必须是static的。
内部类编译后的文件名为:“外部类名$内部类名.java”;
内部类定义在局部时:
不可以被成员修饰符修饰
可以直接访问外部类中的成员,因为还持有外部类中的引用。但是不可以访问它所在的局部中的变量。只能访问被final修饰的局部变量
匿名内部类
匿名内部类其实 就是内部类的简写格式。
定义匿名内部类的前提:内部类必须是继承一个类或者实现接口。
匿名内部类的格式:new 父类或者接口(构造函数参数){定义子类的内容}
其实匿名内部类就是一个子类对象,理解为带内容的对象。匿名内部类是把定义类和建立对象封装为一体的表现形式。
匿名内部类中定义的方法最好不要超过3个
如:IO流中的过滤器,GUI中的监听器、代理中的InvocationHandler...
----------
一、final
final:最终,终态。是一个修饰符
特点:
可以修饰类、变量、函数。
被修饰的类不可以被继承。
被修饰的函数不可以被复写。
被修饰的变量是一个常量只能赋值一次。可以修饰成员变量和局部变量。挡在描述事物时,一些数据的出现值是固定的,那么这时为了增强阅读性,都给这些值起个名字,便于阅读。而这个值不需要改变,所以加上final修饰。作为常量存在。常量的书写规范是所有字母都大写,如果有多个单词组成,用"_"连接。
内部类定义在类中的局部位置时,只能访问该剧不被final修饰的局部变量。
二、抽象类 abstract
抽象:笼统,看不懂。当多个类出现相同功能,但是主体不同,这时进行向上抽取,但是只能抽取功能的定义,抽取不了主体。这时抽取到的方法并不具体,需要被关键字abstract所修饰。
特点:
抽象方法一定在抽象类中。
抽象方法和抽象类都必须被abstract所修饰。
抽象类不可以用new创建对象,因为调用抽象方法没有意义。
抽象类中的抽象方法要被使用,必须由子类复写其所有抽象方法后建立子类对象调用。如果子类只覆盖了部分抽象类方法,那么该子类还是一个抽象类。就算建立空函数也要覆盖。
抽象类和一般类没有太大的不同
该如何描述事物,就如何描述事物,只不过该事物出现了一些看不懂的东西。这些不确定的部分,也是该事物的功能,需要明确出现,但是无法定义主体,就通过抽象方法来表示。
特殊:
抽象类中可以不定义抽象方法,作用仅仅是不让该类实例化。
抽象是可以定义构造方法,为了让其子类实例化。
抽象关键字abstract和final、private、static 不可以共同出现。
abstract class Animal//抽象类 { public abstract void eat();//生物有吃东西的方法 //public abstract void work(); } class Cat extends Animal { public void eat()//覆盖抽象方法具体猫吃东西 { System.out.println("吃鱼"); } public void catchMouse() { System.out.println("捉老鼠"); } } class Dog extends Animal { public void eat()//覆盖抽象方法具体狗吃东西 { System.out.println("吃骨头"); } public void kanJia() { System.out.println("看家"); } }
三、接口 Interface
接口:特殊的抽象类。定义规则和约束
特点:
接口中常见定义:常量和抽象方法。
接口中的成员都有固定的修饰符。
常量:public static final
方法:public abstract
就是说接口中的方法都是抽象的。缺少任意一个修饰符,系统都会自动补上,接口中的成员都是public的。
关系
A:类与类的关系:是继承关系。类与类只能单继承,可以多重继承。
B:类和接口的关系:是实现关系。类可以多实现接口;类在继承一个类的同时,可以实现多个接口。
C:接口和接口的关系:是继承关系。接口可以多继承接口。
接口是不可以创建对象的,因为有抽象方法。
需要被子类实现,子类对接口中方法全部覆盖后才可以实例化,否则子类也只是一个抽象类。
impements跟extends一样,不过是用于实现接口。
接口的优点
A:是对外暴露的规则
B:提高了功能的扩展
C:降低功能之间的耦合性。(模块化开发)
D:接口可以多实现。如:CPU和主板、笔记本的USB插口、插座.
给类另外增加功能,体系意外的功能扩展,
搞清楚什么是类的基本功能,什么是扩展功能。
不同类基本功能不同,学生类和工作这类的基本功能不一样。
接口和抽象类的区别
A:抽象类只能被单继承; 接口可以多实现,接口的出现避免了多继承的局限性。
B:
抽象类中的数据特点:
成员变量:可以是变量,也可以是常量
成员方法:可以是抽象方法,也可以是非抽象方法
构造方法:有构造方法
接口中的数据特点:
成员变量:是常量。默认修饰 public static final
成员方法:都是抽象方法。都有默认修饰 public abstract
构造方法:没有构造方法
C:抽象类中定义的是继承体系中的共性功能; 接口中定义的是继承体系中的扩展功能。
D:抽象类被继承是"is a"关系:xx是yy的一种;接口被实现是"like a"关系:xx像yy的一种
class jiekou { public static void main(String[] args) { MainBoard mb = new MainBoard(); mb.run(); mb.usePCI(null); mb.usePCI(new NetCard()); mb.usePCI(new SoundCard()); } } interface PCI//主板上的PCI插槽,相当于规则 { public void open(); public void close(); } class MainBoard//主板 { public void run() { System.out.println("mainboard run "); } public void usePCI(PCI p)//PCI p = new NetCard()//接口型引用指向自己的子类对象。 { if(p!=null) { p.open(); p.close(); } } } class NetCard implements PCI//网卡,实现PCI { public void open() { System.out.println("netcard open"); } public void close() { System.out.println("netcard close"); method(); } } class SoundCard implements PCI//声卡,实现PCI { public void open() { System.out.println("SoundCard open"); } public void close() { System.out.println("SoundCard close"); } }——————————————————————————————
四、Object
Object:是所有对象的直接或者间接父类。Java认为所有的对象都具备一些基本的共性内容,这些内容可以不断的向上抽取,最终就抽取到了一个最顶层的类中的,该类中定义的就是所有对象都具备的功能。
常用方法:
boolean equals(Objectobj):用于比较两个对象是否相等,其实内部比较的就是两个对象地址。
而根据对象的属性不同,判断对象是否相同的具体内容也不一样。所以在定义类时,一般都会复写equals方法,建立本类特有的判断对象是否相同的依据。
String toString():将对象变成字符串;默认返回的格式:类名@哈希值 = getClass().getName()+ '@' +Integer.toHexString(hashCode());为了对象对应的字符串内容有意义,可以通过复写,建立该类对象自己特有的字符串表现形式。
Class getClass():获取任意对象运行时的所属字节码文件对象。反射的基石
int hashCode():返回该对象的哈希码值。支持此方法是为了提高哈希表的性能。应用于hash集合。
——————————————————————————————
五、内部类
访问规则:
1、内部类可以直接访问外部类中的成员,包括私有。
之所以可以直接访问外部类中的成员,是因为内部类中持有了一种外部类的引用格式:外部类名.this
2、外部类要访问内部类,必须建立内部类的对象。
访问格式:
1、当内部类定义在外部类的成员位置上,而且非私有,可以在外部其他类中。
可以直接建立内部类对象
格式:外部类.内部类 变量=new 外部类().new内部类()
如:Out.Inner in = new Out().new Inner();
2、但内部类在成员位置上,就可以被成员修饰符所修饰,
比如:
private:将内部类在外部类中进行封装
static:内部类就具备了static的特性
但内部类被static修饰后,只能直接访问外部类中的static成员,出现了访问局限
在外部其他类中,如何直接访问static内部类的成员呢?
非静态:new Outer.Inner().function()
静态:Outer.Inner.function()
注意:
当内部类定义了静态成员时,该内部类必须是static的。
但外部类中的静态方法访问内部类时,内部类也必须是static的。
class Outer { int x=10; static class Inner { private int x = 9; static void show() { int x= 8; System.out.println("Inner show="+x);//x为show方法里的x //System.out.println("Inner show="+this.x);//x为局部类的x //System.out.println("Inner show="+Outer.this.x);//x为外部类的x } } void mai() { Inner i = new Inner(); i.show(); } } class InnerDemo { public static void main(String[] args) { System.out.println("Hello World!"); new Outer().mai();//建立对象访问 Outer.Inner.show();//static直接类名调用。 //Outer.Inner oi = new Outer().new Inner();//建立其他类的内部类对象 //oi.show(); } }
内部类编译后的文件名为:“外部类名$内部类名.java”;
内部类定义在局部时:
不可以被成员修饰符修饰
可以直接访问外部类中的成员,因为还持有外部类中的引用。但是不可以访问它所在的局部中的变量。只能访问被final修饰的局部变量
class Outer { int x = 5; void show(final int a) { final int y = 7;//必须定义为final才能被局部内部类访问。 class Inner { void show2() { System.out.println("x="+Outer.this.x); System.out.println("y="+y); System.out.println("a="+a); } } new Inner().show2();//必须放在Inner类下面。 } } class InnerDemo2 { public static void main(String[] args) { Outer out = new Outer(); //虽然a被定义为final,但是a是局部变量,在栈内存运行完一次就释放 //所以可以被传入两次的值。 out.show(10); out.show(9); } }
匿名内部类
匿名内部类其实 就是内部类的简写格式。
定义匿名内部类的前提:内部类必须是继承一个类或者实现接口。
匿名内部类的格式:new 父类或者接口(构造函数参数){定义子类的内容}
其实匿名内部类就是一个子类对象,理解为带内容的对象。匿名内部类是把定义类和建立对象封装为一体的表现形式。
匿名内部类中定义的方法最好不要超过3个
abstract class abvDemo { abstract void show(); } class Outer { //普通内部类 class Inner extends abvDemo { void show() { System.out.println("Inner show"); } } public void show1() { new Inner().show(); } public void show2() { //匿名内部类:(普通内部类的简化写法) new abvDemo()//注意这里不要跟分号。 { void show()//复写抽象方法 { System.out.println("匿名内部类"); } }.show();//复写完再调用。 //--------------------------------------------------------- new abvDemo()//注意这里不要跟分号。 //这里没有出现多态可以调用子类特有方法abc。 { void show()//复写抽象方法 { System.out.println("匿名内部类"); } void abc() { System.out.println("子类方法") } }.abc();//复写完再调用。 abvDemo b = new abvDemo() //这里出现多态,new abvDemo()是子类对象,abvDemo b 是父类引用。 //所以最后不能调用子类对象的特有方法abc。 { int x = 9;//这里的成员变量是可以调用的。 void show()//复写抽象方法 { System.out.println("匿名内部类 x=="+x); } void abc() { System.out.println("子类方法") } }.show(); } } class InnerDemo3 { public static void main(String[] args) { System.out.println("Hello World!"); new Outer().show1();//普通内部类的调用 new Outer().show2();//匿名内部类的调用 } }
如:IO流中的过滤器,GUI中的监听器、代理中的InvocationHandler...
相关文章推荐
- 黑马程序员_面向对象二(继承,多态,抽象类abstract,接口Interface,内部类)
- 黑马程序员_面向对象2_(继承、多态、抽象类abstract、接口interface、内部类)
- 面向对象、类与对象、成员与局部变量、封装、private、构造函数、this、static、extends、super、final、abstract、interface、多态、内部类、异常【5】
- 黑马程序员 面向对象 Object与内部类
- 黑马程序员_<<面线对象(继承,abstract,interface,final)---02>>
- 黑马程序员-面向对象-07天-7 (接口Interface)
- 黑马程序员---面向对象中的内部类
- 黑马程序员——this,super,interface,final,abstract,static
- 黑马程序员_第五天 面向对象(二)_继承、多态、内部类
- 面向对象 final abstract与接口
- 黑马程序员-面向对象-08天-3 (Object)
- 黑马程序员_学习笔记:4) 面向对象2:继承、this、super、finally、Abstract、模板设计模式、接口
- 面向对象 Object与内部类
- 黑马程序员_Java面向对象_内部类
- 黑马程序员——Java面向对象之抽象类 接口 内部类笔记
- 黑马程序员_面向对象_内部类与枚举类
- java 面向对象学习笔记——修饰词final,static,abstract
- 黑马程序员——零基础学习iOS开发——10 Object-C 面向对象思想、OC语法简介、对象、类、
- 黑马程序员_java面向对象总结【4】(内部类、异常处理、Package)
- 黑马程序员—Java面向对象(单例设计模式、面向对象的继承、final关键字)