Java三大特性(封装,继承,多态)
Java中有三大特性,分别是封装继承多态,其理念十分抽象,并且是层层深入式的.
一.封装
概念:封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。在电子方面,封装是指把硅片上的电路管脚,用导线接引到外部接头处,以便与其它器件连接。(来自百度)
在将成员属性封装之后,我们应该提供相应的get/set方法进行访问此成员属性.
封装的好处是:属性进行了隐藏,不再是暴露在外的数据,使数据更加的安全可靠.
class A{
private int a;//此变量进行了封装
//提供给外部访问的接口,实现了只读和只写
public int getA(){
return a;
}
public void setA(int a){
this.a=a;
}
}
提到封装就必须要提到private关键字,如上代码,private是一个权限修饰符,它可以将成员方法和成员属性私有化,使其只有类内部能够访问到.
权限修饰符有4种,分别是public->protected->default->private 其中private权限最严格
public:可以在全工程访问到 protected:只有这个类的子类可以访问 defaule:为默认,无须写出,类所在包下可以访问 private:仅仅只有本省类可以访问
提到了封装就不得不提到this关键字
概念:this关键字指这个当前对象的引用
this关键字有三种用法:
1.this.成员方法,这种方法用于给成员变量的赋值.
class A{
private int a;//此变量进行了封装
//提供给外部访问的接口,实现了只读和只写
public int getA(){
return a;
}
public void setA(int a){
this.a=a;
}
}
因为就近原则,所以直接a=a;实际上并没有对成员属性进行赋值,所以需要使用this关键字对其进行访问.
2.调用构造方法,如:可以在空参构造方法中调用有参构造方法
class A{
private int a;//此变量进行了封装
//提供给外部访问的接口,实现了只读和只写
public int getA(){
return a;
}
public void setA(int a){
this.a=a;
}
//空参构造
public A(){
this(1);
}
//全参构造
public A(int a){
this.a=a;
}
}
这个例子使用this在空参构造中调用了全参构造
使用this调用构造方法时需要注意:
1.this()必须在构造方法中的第一行,且只能够使用一次
2.this()不能够互相调用,因为会陷入死循环,如下:
class A{
private int a;//此变量进行了封装
//提供给外部访问的接口,实现了只读和只写
public int getA(){
return a;
}
public void setA(int a){
this.a=a;
}
//空参构造
public A(){
this(1);
//this();错误
}
//全参构造
public A(int a){
//this();错误
this.a=a;
}
}
3.this可以当作返回值使用,this是当前对象的引用,所以返回的同样是一个A类型,可以使用一个新的A类型对象b进行接受,b会继承所有a的属性值,使用方法如下:
class A{
private int a;//此变量进行了封装
//提供给外部访问的接口,实现了只读和只写
public int getA(){
return a;
}
public void setA(int a){
this.a=a;
}
//使用this当作返回值
A b(){
return this;
}
//空参构造
public A(){
this(1);
}
//全参构造
public A(int a){
this.a=a;
}
}
二.继承
概念:继承即从已有的类中派生一个新的类,已有的类成为父类(基类,超类),而派生的类成为子类(派生类).若类B继承了类A,则我们把类A称为类B的子类,反之同理,子类可以拥有自己本身的特有方法以及特有属性,而父类则必须是子类的共性抽取.如动物都有颜色,年龄,其颜色和年龄就是其共性
class A{
int a;
void a(){}
}
class B extends A{
//子类特有方法
void b(){
}
}
1. 继承需要注意的点
(1)继承是类在继承,而不是对象在继承
(2)子类无条件继承父类的所有成员属性及成员方法
(3)若方法出现重写,属性出现重复,则优先使用子类的方法和属性(就近原则).
(4)继承不继承父类的构造方法
2.java中继承的特点
(1).java不支持多继承,但是可以通过接口实现多继承 多继承,即子类继承自多个父类
(2).java支持多重继承 多重继承,即子类继承父类,父类继承他的父类,即子类相当于其孙子辈
class A{
int a;
public A(){
//super();这里有一个默认的super()方法
}
public A(int a){
//super();这里有一个默认的super()方法
}
void a(){}
}
class B extends A{
//子类的特有属性
int b;
//子类特有方法
void b(){
//调用父类的成员属性
System.out.println(super.a);
//调用父类的成员方法
super.a();
}
public B(){
//调用父类的有参构造
super(1);
}
}
提到继承就必须提到super关键字,super关键字指父类的引用,super关键字最重要的是每个类的构造方法都有其默认的一个super()方法,我们知道所有的类都是继承自Object类,而super()这个方法其实是调用到Object处进行空间的申请.
super关键字的使用
1.访问父类成员方法和成员属性 super.成员方法() super.成员属性
2.访问父类的构造方法 super(参数)
abstract class Animal{
private String color;
private int numOfLegs;
abstract void eat();
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getNumOfLegs() {
return numOfLegs;
}
public void setNumOfLegs(int numOfLegs) {
this.numOfLegs = numOfLegs;
}
public Animal(String color, int numOfLegs) {
super();
this.color = color;
this.numOfLegs = numOfLegs;
}
public Animal() {
super();
} }
class Dog extends Animal{
Dog(){
super();
}
Dog(String color,int numOfLegs){
super(color,numOfLegs);
}
@Override
void eat(){
System.out.println(super.getNumOfLegs()+"条腿"+super.getColor()+"的狗在啃骨头");
}
void lookHome(){
System.out.println(super.getNumOfLegs()+"条腿"+super.getColor()+"的狗在看家");
}
}
class Porrot extends Animal{
Porrot(){
super();
}
Porrot(String color,int numOfLegs){
super(color,numOfLegs);
}
@Override
void eat(){
System.out.println(super.getNumOfLegs()+"条腿的"+super.getColor()+"鹦鹉在吃小米");
}
void say(){
System.out.println(super.getNumOfLegs()+"条腿的"+super.getColor()+"鹦鹉在说你好,丑八怪");
}
}
提到继承当然也不能不提到抽象类,定义一个抽象类使用是这样的:public abstract class Animal(){}
当你想要创建一个动物类时,你知道动物都会吃,但是你不知道动物的子类吃是如何具体实现的,如:猫吃鱼,但是狗吃的是骨头同样的子类,但是其方法的实现却是不同的,这个时候就需要使用抽象类了.
抽象类的注意点:
1.抽象类必须在类中使用abstract关键字进行修饰,
2.抽象类中可以没有抽象方法,
3.抽象类不能够实例化,如果想要实例化的话则需要子类将其所有的抽象方法重写
interface A{
int b=0;//默认有public static final;
void a(){}//默认有public abstract;
}
interface B{
}
class Father{
}
class Son extends Father implements A,B{
//方法的实现
public void a(){
}
}
提到抽象类就一定要提到接口
接口:接口其实相当于一个规范,当你定义一个接口时,实现接口的类必须实现接口中的所有的方法.举个现实中的例子,比如我们的手机充电借口,基本很少发生改变,因为他已经是规定死了的,使用接口等于制定一个规范,等于是所有的实现此接口的类都必须实现此规范,这样就可以用接口来实现不同类的比较等操作.
接口的注意点:
1.接口中的成员属性必须都是public static final的,不修饰会自动加上,接口中的成员方法必须都是public static修饰的,且不可以使用其他的权限修饰符
2.接口不可以被实例化,必须使用子类 explements 接口,然后实现接口中的方法.
3.一个类可以实现多个接口,可以在实现抽象类的同时实现多个接口或单个接口
三.多态
概念:同一个行为,对于传入不同的对象,实现不同的动作 多态需要记住的一个概念:父类引用指向子类对象
多态的好处:提高了代码的可复用性.
多态的坏处:无法使用子类所特有的方法.因为编译时看的是右边.
多态的实现必须有三要素 1.继承(实现) 2.重写 3.向上转型(缺一不可!!!)
public class Test{
public static void main(String[] args){
show(new Dog());
show(new Cat());
}
public static void show(Animal a){
a.eat();
}
}
abstract class Animal{
abstract void eat(){
}
}
class Dog extends Animal{
public void eat(){
System.out.println("在吃骨头");
}
}
class Cat extends Animal{
public void eat(){
System.out.println("在吃鱼");
}
}
多态基于继承的实现如上.
public class Test01{
public static void main(String[] args){
show(new Dog());
show(new Cat());
}
public static void show(Animal a){
a.eat();
}
}
interface Animal{
abstract void eat();
}
class Dog implements Animal{
public void eat(){
System.out.println("在吃骨头");
}
}
class Cat implements Animal{
public void eat(){
System.out.println("在吃鱼");
}
}
接口的实现如上
提到多态就需要提到一个例子:
public class Test01{
public static void main(String[] args){
A a1=new A();
A a2=new B();
B b=new B();
C c=new C();
D d=new D(); a1.show(b);// a and a
a1.show(c);//a and a
a1.show(d);//a and d
a2.show(b);//b and a
a2.show(c);//b and a
a2.show(d);//a and d
}
/*public static void show(Animal a){
a.eat();
}*/
}
class A{
void show(A a){
System.out.println("a and a");
}
void show(D d){
System.out.println("a and d");
}
}
class B extends A{
void show(A a){
System.out.println("b and a");
}
void show(B b){
System.out.println("b and b");
}
}
class C extends B{
}
class D extends C{
}
我们先看a2.show(c),首先a2是一个a类型的引用类型,在a2种寻找show(c)参数为c类型的方法,没有找到c类型的方法,于是到a2的超类寻找其方法,由于a类的超类是Object,也并没有show(c)这个方法,于是将c类型进行了提升,变成了b类型,b类型在a中也不存在,于是便转换成了a类型,a类型与A类中找到了方法,并由于A类型的show方法于B类型中进行了重写,于是便输出了b and a
其寻找的顺序是:this.show(O) super.show(O) this.show(super(O)) super.show(super(O))
当使用了上述方法进行了多态的实现之后,其子类就会自动将其的特有方法给丢弃掉了,然而我们现在想调用这个对象的特有方法怎么办?
答案是使用使用强制类型转换,而使用强制类型转换则会有可能出现类型转换异常,这个时候就需要使用instanceof运算符,使用方法:父类对象 instanceof 子类,若父类引用时子类类型时返回true,则可以使用强制类型转换
这种实现过程叫做向下转型
Java三大特性(封装,继承,多态)的更多相关文章
- C++三大特性 封装 继承 多态
C++ 三大特性 封装,继承,多态 封装 定义:封装就是将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成类,其中数据和函数都是类的成员,目的在于将对 ...
- 深入理解Java面向对象三大特性 封装 继承 多态
1.封装 封装的定义: 首先是抽象,把事物抽象成一个类,其次才是封装,将事物拥有的属性和动作隐藏起来,只保留特定的方法与外界联系 为什么需要封装: 封装符合面向对象设计原则的第一条:单一性原则,一个类 ...
- Java 三大特性——封装、继承、多态
一.封装 封装,实际就是把属于同一类事物的共性(包括属性与方法)归到一个类中,以方便使用. 概念:在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节 ...
- 浅析Java三大特性封装、继承、多态,及作业分析
前言 本次博客衔接上次博客,作为这一阶段Java学习的分析.上一篇博客着重介绍了Java的OO编程思维,面向对象与面向过程的区别.本篇博客重心在Java的三大技术特性,附带作业分析. Java三大特性 ...
- java面向对象(封装-继承-多态)
框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...
- Java基础——面向对象(封装——继承——多态 )
对象 对象: 是类的实例(实现世界中 真 实存在的一切事物 可以称为对象) 类: 类是对象的抽象描述 步骤: 1.定义一个类 (用于 描述人:) ( * 人:有特征和行为) 2.根据类 创建对象 -- ...
- OOP三大核心封装继承多态
OOP支柱 3 个核心:封装 继承 多态 封装就是将实现细节隐藏起来,也起到了数据保护的作用. 继承就是基于已有类来创建新类可以继承基类的核心功能. 在继承中 另外一种代码重用是:包含/委托,这种重用 ...
- java 三大特性_继承、封装、多态_day005
一.继承: java的三大特性之一.两个类之间通过extends关键字来描述父子关系,子类便可拥有父类的公共方法和公共属性.子类可以继承父类的方法和属性,子类也可以自己定义没有的方法或者通过覆盖父类的 ...
- JAVA的三大特征 封装继承多态- 简单总结
简单总结一下 封装-即从很多类的抽取相同的代码 写在一个类里. 好处是 代码的重用,安全. 继承-减少代码的书写. 其好处也是 代码的重用. 多态- 把不同的子类对象都当作父类来看,可以屏蔽不同子类对 ...
随机推荐
- JS的for循环小例子
1.输出1-100的和 var sum = 0; for(var i=1;i<=100;i++){ sum = sum + i; } document.write(sum); 2.输出1-100 ...
- Web Magic设计思想
1.1 设计思想 1. 一个框架,一个领域 一个好的框架必然凝聚了领域知识.WebMagic的设计参考了业界最优秀的爬虫Scrapy,而实现则应用了HttpClient.Jsoup等Java世界最成熟 ...
- git clone代码时候出现的报错
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px "Andale Mono"; color: #28fe14; backgr ...
- 微信支付JSAPI公众号支付授权目录
详情 http://yangjunwei.com/a/1815.html
- Linux下MongoDB安装和配置详解
1.下载安装包 将解压到/usr/local/mongodb 文件夹下 # mkdir /usr/local/mongodb # tar zxvf mongodb-linux-x86_64-3.2.9 ...
- jsp中 scope="application" 表示
jsp中 <jsp:useBean id="countbean" scope="application" class="count.counte ...
- Css3:transform变形
transform 语法: transform 向元素应用 2D 或 3D 转换. transform : none | <<span class="title&quo ...
- Spring 4.x (二)
1 静态代理 PersonDAO.java package com.xuweiwei.staticproxy; public interface PersonDAO { public void sav ...
- js 判断一个文本框是否获得焦点
1.js 判断一个文本框是否获得焦点 // 可以用document.activeElement判断 // document.activeElement表示当前活动的元素 // 查找你要判断的文本框 ...
- ubuntu下进入root错误解决方法
1.进入root用户提示su: Authentication failure roots@ubuntu:~$ su - Password: su: Authentication failure 2.通 ...