黑马程序员--面向对象三(final、abstract、Interface、Object、内部类)
来源:互联网 发布:梦里花落知多少意义 编辑:程序博客网 时间:2024/04/30 09:56
------- android培训、java培训、期待与您交流! ----------
一、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:接口和接口的关系:是继承关系。接口可以多继承接口。
A:类与类的关系:是继承关系。类与类只能单继承,可以多重继承。
B:类和接口的关系:是实现关系。类可以多实现接口;类在继承一个类的同时,可以实现多个接口。
C:接口和接口的关系:是继承关系。接口可以多继承接口。
接口是不可以创建对象的,因为有抽象方法。
需要被子类实现,子类对接口中方法全部覆盖后才可以实例化,否则子类也只是一个抽象类。
impements跟extends一样,不过是用于实现接口。
接口的优点
A:是对外暴露的规则
B:提高了功能的扩展
C:降低功能之间的耦合性。(模块化开发)
D:接口可以多实现。如:CPU和主板、笔记本的USB插口、插座.
A:是对外暴露的规则
B:提高了功能的扩展
C:降低功能之间的耦合性。(模块化开发)
D:接口可以多实现。如:CPU和主板、笔记本的USB插口、插座.
给类另外增加功能,体系意外的功能扩展,
搞清楚什么是类的基本功能,什么是扩展功能。
不同类基本功能不同,学生类和工作这类的基本功能不一样。
接口和抽象类的区别
A:抽象类只能被单继承; 接口可以多实现,接口的出现避免了多继承的局限性。
B:
A:抽象类只能被单继承; 接口可以多实现,接口的出现避免了多继承的局限性。
B:
抽象类中的数据特点:
成员变量:可以是变量,也可以是常量
成员方法:可以是抽象方法,也可以是非抽象方法
构造方法:有构造方法
接口中的数据特点:
成员变量:是常量。默认修饰 public static final
成员方法:都是抽象方法。都有默认修饰 public abstract
构造方法:没有构造方法
C:抽象类中定义的是继承体系中的共性功能; 接口中定义的是继承体系中的扩展功能。
D:抽象类被继承是"is a"关系:xx是yy的一种;接口被实现是"like a"关系:xx像yy的一种
成员变量:可以是变量,也可以是常量
成员方法:可以是抽象方法,也可以是非抽象方法
构造方法:有构造方法
接口中的数据特点:
成员变量:是常量。默认修饰 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
常用方法:
boolean equals(Objectobj):用于比较两个对象是否相等,其实内部比较的就是两个对象地址。
而根据对象的属性不同,判断对象是否相同的具体内容也不一样。所以在定义类时,一般都会复写equals方法,建立本类特有的判断对象是否相同的依据。
String toString():将对象变成字符串;默认返回的格式:类名@哈希值 = getClass().getName()+ '@' +Integer.toHexString(hashCode());为了对象对应的字符串内容有意义,可以通过复写,建立该类对象自己特有的字符串表现形式。
Class getClass():获取任意对象运行时的所属字节码文件对象。反射的基石
——————————————————————————————
五、内部类
访问规则:
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...
- 黑马程序员--面向对象三(final、abstract、Interface、Object、内部类)
- 黑马程序员_面向对象二(继承,多态,抽象类abstract,接口Interface,内部类)
- 黑马程序员_面向对象2_(继承、多态、抽象类abstract、接口interface、内部类)
- 黑马程序员--面向对象(接口,内部类,包,Object类)
- 黑马程序员 面向对象 Object与内部类
- NO8.java笔记【面向对象、抽象类、abstract、接口、interface、多态 、内部类、匿名内部类、异常、Object类】
- 黑马程序员_学习笔记:5) 面向对象3:多态、Object、内部类、匿名内部类
- 黑马程序员面试题面向对象二(多态,抽象类abstract,接口Interface,内部类,异常Exception,包package,String类,StringBuffer)
- 黑马程序员-面向对象 多态,内部类
- 黑马程序员-day09-面向对象(内部类)
- 黑马程序员---面向对象中的内部类
- 黑马程序员——java面向对象(三)多态、内部类、包
- 黑马程序员——java基础----面向对象(三)内部类
- 黑马程序员_面向对象(继承、多态、内部类)
- 黑马程序员-面向对象(下)--内部类和异常
- 黑马程序员 面向对象(下) 内部类
- 黑马程序员-----面向对象_内部类(学习日记)
- 面向对象、类与对象、成员与局部变量、封装、private、构造函数、this、static、extends、super、final、abstract、interface、多态、内部类、异常【5】
- 序列化机制(1)
- PhoneGap API介绍:Notification
- 21岁-我的青春之旅
- 分卷压缩知识
- 打印字符串的全排列
- 黑马程序员--面向对象三(final、abstract、Interface、Object、内部类)
- eclipse安装svn插件
- VC初学者入门系列之一:窗口类的诞生
- 禁止被继承的类【3】
- 事实再次证明,拉不下脸皮,伤的是自己。
- 【king 选 太子 154】
- 正则表达式30分钟入门教程
- Java的集合框架学习笔记
- NHibernate Criteria中的And, Or