面向对象(二)
来源:互联网 发布:淘宝客收入 编辑:程序博客网 时间:2024/04/29 23:28
继承
主要是代码的复用(设计中意义会更多)
继承使用关键字extends
Java的继承是全部继承,除构造函数以外
继承中,子父类的构造函数的问题
子类必须调用父类的构造函数(构造函数不被继承)如果没有写调用,那子类的构造函数默认调用父类无参数的构造函数。(该句默认就在子类构造函数的第一句)—–>super(); 如果要显示调用那么要用——>super(参数列表);而且该句必须在子类构造函数的第一句。
父类子类初始化顺序
- 先父类静态,然后子类静态(跟创建对象无关,只要用到类就会先加载其静态属性,并且只加载一次
- 父类的定义初始化,父类的构造函数
- 子类的定义初始化,子类的构造函数
方法的重写
- 父类中有一个方法,到子类有重新的实现
- 访问权限必须为非private,子类中还可以放大
- super.方法() 调用父类被重写的的方法(因为如果不重写,可以直接调用)
总结:super关键字 super(参数列表)——>调用父类的构造函数必须在子类构造函数的第一句。
super.函数——>在子类中重写父类的方法调用父类的该方法
动态binding
父类的引用可以引用子类的实例对象。
如果父类的引用了子类的实例
调用该方法时,如果方法构成了重写,那么调用子类的方法,否则调用父类的方法——>动态绑定(binding)
多态
对象转型:
对象向上转型: 父类 父类对象 = 子类实例;
对象向下转型:子类 子类对象= (子类)父类实例;
- 向上转型
//对象向上转型class A{ public void fun1(){ System.out.println("A--->public void fun1(){}"); } public void fun2(){ this.fun1(); }}class B extends A{ public void fun1(){ System.out.println("B--->public void fun1(){}"); } public void fun3(){ System.out.println("B--->public void fun3(){}"); }}class PolDemo01{ public static void main(String[] args) { B b = new B(); A a = b; //发生了向上的转型的关系,子类-->父类 a.fun1(); //此方法被子类fu写过 }}
- 向下转型
//向下转型class A{ public void fun1(){ System.out.println("A-->public void fun1(){}"); } public void fun2(){ this.fun1(); }}class B extends A{ public void fun1(){ System.out.println("B-->public void fun1(){}"); } public void fun3(){ System.out.println("B-->public void fun3(){}"); }}class PolDemo02{ public static void main(String[] args) { A a = new B(); //发生了向上转型的关系,子类->父类 B b = (B)a; //此时发生了向下转型关系 b.fun1(); //调用方法被覆写的方法 b.fun2(); //调用父类的方法 b.fun3(); //调用子类自己定义的方法 }}
使用多态的好处:
//使用多态实现class A{ public void fun1(){ System.out.println("A-->public void fun1(){}"); } public void fun2(){ this.fun1(); }}class B extends A{ public void fun1(){ System.out.println("B-->public void fun1(){}"); } public void fun3(){ System.out.println("B-->public void fun3(){}"); }}class C extends A{ public void fun1(){ System.out.println("C--->public void fun1(){}"); } public void fun5(){ System.out.println("C--->public void fun5(){}"); }}public class PolDemo05 { public static void main(String[] args) { fun(new B()); fun(new C()); } /* 在fun()中使用了对象的多态性,所以可以接收任何的子类对象, 这样无论子类如何增加,fun()都不用做任何改变, 因为一旦发生对象的向上转型后,调用的方法一定是子类覆写的方法。 */ public static void fun(A a){ a.fun1(); }}
构造函数私有化——单例设计模式
//构造方法私有化public class SingleDemo02 { public static void main(String[] args) { Singleton s1 = Singleton.getInstance(); Singleton s2= Singleton.getInstance(); Singleton s3 = Singleton.getInstance(); s1.print(); s2.print(); s3.print(); }}class Singleton{ private static Singleton instance = new Singleton();//在类的内部产生本类的实例化对象 private Singleton(){ } public static Singleton getInstance() { return instance; } public void print() { System.out.println("hello world"); }}
在设计模式中将这样的设计称为单例设计模式,即无论程序怎么样运行,Singleton类永远只会有一个实例对象存在。
抽象类
抽象类的定义及使用规则如下
- 包含一个抽象类方法必须是抽象类
- 抽象类和抽象方法都要使用abstract关键字声明
- 抽象方法只需声明而不需要实现
- 抽象类必须被子继承,子类(如果不是抽象类)必须覆写抽象类中的全部抽象方法。
abstract class A{ public static final String FLAG ="CHINA"; private String name = "yuyu"; public String getName(){ return name; } public void setName(String name){ this.name=name; } public abstract void print();}class B extends A{ public void print(){ System.out.println("FLAG="+FLAG); System.out.println("姓名="+super.getName()); }}public class AbstractDemo02{ public static void main(String[] args){ B b = new B(); b.print(); }}
实际上抽象类就比普通类多定义了一个抽象方法,除了 不能直接进行对象的实例化操作之外并没有任何的不同。
接口
接口是Java中最重要的概念之一,它可以被理解为一种特殊的类,是由全局常量和公共的抽象方法所组成。
接口定义格式
interface 接口名称{ 全局变量; 抽象方法;}
在接口的抽象方法必须定义为public访问权限,这是绝对不可改变的。
/* interface 接口名称{ 全局变量; 抽象方法; }*/interface A{ public String AUTHOR="xxx"; public void print(); public String getInfo();}interface B{ public void say();}class X implements A,B{ public void say(){ System.out.println("hello world"); } public String getInfo() { return "hello"; } public void print(){ System.out.println("作者:"+AUTHOR); }}class InterfaceDemo03{ public static void main(String[] args) { X x= new X(); x.say(); x.print(); }}
子类同时继承抽象类和实现接口
/*子类同时继承抽象类和实现接口*/interface A{ public String AUTHOR = "XXX"; public void print(); public String getInfo();}abstract class B{ public abstract void say();}class X extends B implements A{ public void say(){ System.out.println("HelloWorld"); } public String getInfo(){ return "hello"; } public void print(){System.out.println("作者"+AUTHOR);}}class InterfaceDemo04{ public static void main(String[] args) { X x = new X(); x.say(); x.print(); }}
- 面向对象(二)
- 面向对象(二)
- 面向对象(二)
- 面向对象(二)
- 面向对象(二)
- 面向对象(二)
- 面向对象(二)
- 面向对象(二)
- 面向对象(二)
- 面向对象(二)
- 面向对象(二)
- 面向对象(二)
- 面向对象(二)
- 面向对象(二)
- 面向对象(二)
- 面向对象(二)
- 面向对象(二)
- 面向对象(二)
- Problem C
- kafka_2.9.2-0.8.1.1安装、测试、集群
- MONGODB范围查询
- 【Spring】【笔记】《Spring In Action》第一章 读书笔记
- Android声明和使用权限
- 面向对象(二)
- 练习011-012
- Poj 2342 Anniversary party【入门树型dp】
- OSX PHP添加gettext支持
- day5.19总结_音乐播放器_页面更新和播放
- 字符串单双引号区别
- MySQL 索引原理及慢查询优化
- java jni jbyteArray传参给c++
- 【bzoj4561】【JLOI2016】【圆的异或并】【扫描线+set】