Java面向对象的三大特性
2017-06-06 18:52
225 查看
封装
概念:将一组逻辑相关的属性或方法封装在类中,通过访问权限修饰符来隐藏内部细节,公开访问的接口的技术称之为类的封装技术。
封装的好处:
隐藏内部实现细节;保护其不受外部影响
方便内部修改
降低外部使用的复杂度
良好的封装可降低耦合
属性的封装方式
用private修饰属性
提供set方法和get方法来分别为属性设置值或者取得属性值
setter、getter方法是public(公开的),命名遵守setter属性名与getter属性名的规则,boolean的get方法使用is属性名
构造器的封装(单例模式使用私有构造器)
当然方法也能封装,使用访问权限修饰符来实现
继承
概念:一个类的定义基于另一个已存在的类(即子类基于父类),可实现代码的重用,子类能够获得已有类(父类)的属性和方法(非私有),并能扩展其它属性或方法的能力。
使用关键字extends实现继承
继承与构造器
子类继承父类,父类的构造器先执行,子类的构造器后执行
默认情况下,子类会调用父类的默认无参构造器
子类调用父类的非默认构造器,需使用super关键字并且指定正确的参数类型
super调用父类的构造器必须在子类的构造器第一行
SeaFish(int index)–>Fish(int index)–>Animal(int x,int y)。子类有义务先去执行父类构造方法则会先去构造父类,super关键字指明了使用父类的那个构造器。输出结果如下:
继承中构成方法重写的条件
方法名相同
形参相同
同返回值类型
子类方法的访问权限控制符不能缩小
final修饰符
final修饰类,则该类不可被继承;
final修饰属性,该属性不可变;
final修饰方法,该方法不可被重写;
接口可以继承多个接口,类是单继承的
多态
面向对象三大特性之一;
含义:对外一种表现形式,对内多种具体实现;
典型用法:
体现
方法重载
方法重写
多态参数(依赖关系”use-a”)
方法的参数为父类或者接口时,可传入父
b244
类的子类或者接口的实现类
扩展性强
转换
隐式转换:把子类转换为父类;
强制转换(类型兼容):用(类型)强制转换(需注意编译期类型与运行期类型);
如果强制转换的两个类型没有父子关系,编译正常,运行报错;
运行期类型与编译期类型(运用多态时需注意)
Animal animal = new Cat();
运行期Cat,编译期Animal;
同名属性,与类型名相同;
多态环境下的属性和方法
静态方法,与类型名相同;
成员方法,由于重写,会先去执行子类方法;
同名属性,与类型名相同 ;
概念:将一组逻辑相关的属性或方法封装在类中,通过访问权限修饰符来隐藏内部细节,公开访问的接口的技术称之为类的封装技术。
封装的好处:
隐藏内部实现细节;保护其不受外部影响
方便内部修改
降低外部使用的复杂度
良好的封装可降低耦合
属性的封装方式
用private修饰属性
提供set方法和get方法来分别为属性设置值或者取得属性值
setter、getter方法是public(公开的),命名遵守setter属性名与getter属性名的规则,boolean的get方法使用is属性名
private String name; private int age; private boolean result; public void setName(String name){ this.name=name; } public String getName(){ return name; } public void setAge(int age) { this.age=age; } public int getAge() { return age; } public void setResult(boolean result) { this.result=result; } public boolean isResult(){ return true; }
构造器的封装(单例模式使用私有构造器)
public class InstanceTon { private static InstanceTon instanceTon = new InstanceTon(); private InstanceTon(){} public static InstanceTon getInstance(){ return instanceTon; } }
当然方法也能封装,使用访问权限修饰符来实现
继承
概念:一个类的定义基于另一个已存在的类(即子类基于父类),可实现代码的重用,子类能够获得已有类(父类)的属性和方法(非私有),并能扩展其它属性或方法的能力。
使用关键字extends实现继承
继承与构造器
子类继承父类,父类的构造器先执行,子类的构造器后执行
默认情况下,子类会调用父类的默认无参构造器
子类调用父类的非默认构造器,需使用super关键字并且指定正确的参数类型
super调用父类的构造器必须在子类的构造器第一行
public class Animal { public Animal() { System.out.println("构造Animal"); } public Animal(int index){ System.out.println("构造Animal@"); } public Animal(int x,int y){ System.out.println("构造Animal@@"); } } public class Fish extends Animal { public Fish() { System.out.println("构造Fish"); } public Fish(int index){ super(12,23); System.out.println("构造Fish&"); } } public class SeaFish extends Fish { public SeaFish(){ System.out.println("构造SeaFish"); } public SeaFish(int index){ super(23); System.out.println("构造SeaFish%"); } public static void main(String[] args) { SeaFish seaFish = new SeaFish(23); System.out.println("======**======"); } }
SeaFish(int index)–>Fish(int index)–>Animal(int x,int y)。子类有义务先去执行父类构造方法则会先去构造父类,super关键字指明了使用父类的那个构造器。输出结果如下:
构造Animal@@ 构造Fish& 构造SeaFish% ======**======
继承中构成方法重写的条件
方法名相同
形参相同
同返回值类型
子类方法的访问权限控制符不能缩小
public class Shape { public void draw() { System.out.println("正在画图形"); } public double area(double x) { System.out.println("计算面积"); return x; } } public class Crcle extends Shape { private double radius; private double area; public void draw() { System.out.println("正在画圆"); } public double area(double x) { area = x*x*Math.PI; return area; } } public class App { public static void main(String[] args) { Crcle crcle = new Crcle(); crcle.draw(); Square square = new Square(); square.draw(); } }
final修饰符
final修饰类,则该类不可被继承;
final修饰属性,该属性不可变;
final修饰方法,该方法不可被重写;
接口可以继承多个接口,类是单继承的
多态
面向对象三大特性之一;
含义:对外一种表现形式,对内多种具体实现;
典型用法:
//父类变量指向子类实现 Parent = new Child(); //接口的变量指向实现类的实现 Interfacei = new Implementation();
体现
方法重载
方法重写
多态参数(依赖关系”use-a”)
方法的参数为父类或者接口时,可传入父
b244
类的子类或者接口的实现类
/** * 限额对象 * @author Administrator * */ public class Quota { private double amount; private String type; public double getAmount() { return amount; } public void setAmount(double amount) { this.amount = amount; } public String getType() { return type; } public void setType(String type) { this.type = type; } } /** * 限额加载器 * @author Administrator * */ public interface QuotaLoader { Quota load(String userId); } /** * 业务限额加载器 * @author Administrator * */ public class BusinessQuotaLoader implements QuotaLoader { @Override public Quota load(String userId) { return null; } } /** * 央行政策性限额 * @author Administrator * */ public class PolicyQuotaLoader implements QuotaLoader{ @Override public Quota load(String userId) { return null; } } public class CalcService { private static final QuotaLoader[] QUOTA_LOADERS = {new PolicyQuotaLoader(),new BusinessQuotaLoader()}; public static void main(String[] args) { List<Quota> quotas = new ArrayList<>(); for(QuotaLoader ql : QUOTA_LOADERS){ Quota q = ql.load("xxxx"); quotas.add(q); } //quotas排序,得到最小的限额 } }
扩展性强
转换
隐式转换:把子类转换为父类;
强制转换(类型兼容):用(类型)强制转换(需注意编译期类型与运行期类型);
//父类强转子类(子类名)父类实例 //运行报错Animal不能强转为Cat Animal animal = new Animal(); Cat cat = (Cat)animal; //能转 Animal anim = new Cat(); Cat c = (Cat)anim; //把子类转为父类,隐式转换(自动转换) //运行报错Dog不能强转为Cat Animal anima = new Dog(); Cat ca = (Cat)anima; //编译报错 Dog dog = new Dog(); //Cat cat2 = (Cat)dog;
如果强制转换的两个类型没有父子关系,编译正常,运行报错;
运行期类型与编译期类型(运用多态时需注意)
Animal animal = new Cat();
运行期Cat,编译期Animal;
同名属性,与类型名相同;
多态环境下的属性和方法
静态方法,与类型名相同;
成员方法,由于重写,会先去执行子类方法;
同名属性,与类型名相同 ;
public class Animal { public String age = "3"; public void bark(){ System.out.println("动物叫"); } public static void sf(){ System.out.println("父类静态方法"); } } public class Cat extends Animal { public int age = 5; public void bark(){ System.out.println("喵~喵~"); } public void catchMice(){ System.out.println("抓老鼠"); } public static void sf(){ System.out.println("子类静态方法"); } } public class Dog extends Animal { public void bark(){ System.out.println("汪汪"); } } public class App2 { public static void main(String[] args) { Animal a = new Cat(); //对于成员方法调用,因为方法覆盖的问题,导致运行期调用的是子类的方法 a.bark(); //对于同名的静态方法调用,声明为何类型则调用该类型的方法 a.sf(); //对于同名的属性,实际为声明类型的属性 System.out.println(a.age); } }
相关文章推荐
- Java学习第六课--面向对象的三大特性(封装、继承和多态)
- 深入理解Java面向对象三大特性 封装 继承 多态
- Java面向对象三大特性的理解
- Java之面向对象的三大特性:封装,继承,多态讲解
- I学霸官方免费教程十四:Java面向对象三大特性之继承
- java面向对象三大特性之继承
- 黑马程序员-java面向对象三大特性
- 面向对象的三大特性?(java面试题)
- 深入理解Java面向对象的三大基本特性
- java笔记—封装、继承、多态[面向对象的三大特性]
- java面向对象三大特性
- 智渔课堂官方免费教程十三:Java面向对象三大特性之封装
- I学霸官方免费教程十三:Java面向对象三大特性之封装
- 黑马程序员之面向对象的三大特性(JAVA)
- java面向对象的三大特性(一)
- Java面向对象的三大特性
- Java面向对象三大特性
- java面向对象的三大特性
- Java中的基础----面向对象的三大特性
- 深入理解Java面向对象的三大基本特性