[Java] 面向对象的三个特征与含义

版权声明:请尊重个人劳动成果,转载注明出处,谢谢!

对象 
是类的一个实例(对象不是找个女朋友),有状态和行为。例如,一条狗是一个对象,它的状态有:颜色、名字、品种;行为有:摇尾巴、叫、吃等。

类 
是一个模板,它描述一类对象的行为和状态。

1 . 封装性

  将对象的状态信息尽可能的隐藏在对象内部,只保留有限的接口和方法与外界进行交互,从而避免了外界对对象内部属性的破坏。

  Java中使用访问控制符来保护对类、变量、方法和构造方法的访问。 
Java支持4种不同的访问权限。  
 
默认的,也称为default,在同一包内可见,不使用任何修饰符。 
私有的,以private修饰符指定,在同一类内可见。 
共有的,以public修饰符指定,对所有类可见。 
受保护的,以protected修饰符指定,对同一包内的类和所有子类可见。

2. 继承

   java通过继承创建分等级层次的类,可以理解为一个对象从另一个对象获取属性的过程。 
 
类的继承是单一继承,也就是说,一个子类只能拥有一个父类 
下面的做法是不合法的:

public class extends Animal, Mammal{} 

  但是我们可以用多继承接口来实现, 如: 

public class Apple extends Fruit implements Fruit1, Fruit2{}

  继承中最常使用的两个关键字是extends(用于基本类和抽象类)和implements(用于接口)。 
 
注意:子类拥有父类所有的成员变量,但对于父类private的成员变量却没有访问权限,这保障了父类的封装性。 
下面是使用关键字extends实现继承。 

public class Animal{
}

public class Mammal extends Animal{
}

public class Reptile extends Animal{
}

public class Dog extends Mammal{
}

  通过使用关键字extends,子类可以继承父类所有的方法和属性,但是无法使用 private(私有) 的方法和属性。 
我们通过使用instanceof 操作符能够确定一个对象是另一个对象的一个分类。

public class Dog extends Mammal{

   public static void main(String args[]){

      Animal a = new Animal();
      Mammal m = new Mammal();
      Dog d = new Dog();

      System.out.println(m instanceof Animal);
      System.out.println(d instanceof Mammal);
      System.out.println(d instanceof Animal);
   }
}

结果如下:

true
true
true

Implements关键字使用在类继承接口的情况下, 这种情况不能使用关键字extends。

public interface Animal {}

public class Mammal implements Animal{
}

public class Dog extends Mammal{
}

可以使用 instanceof 运算符来检验Mammal和dog对象是否是Animal类的一个实例。

interface Animal{}

class Mammal implements Animal{}

public class Dog extends Mammal{
   public static void main(String args[]){

      Mammal m = new Mammal();
      Dog d = new Dog();

      System.out.println(m instanceof Animal);
      System.out.println(d instanceof Mammal);
      System.out.println(d instanceof Animal);
   }
} 

运行结果如下:

true
true
true

3.多态

  多态是同一个行为具有多个不同表现形式或形态的能力。 
多态性是对象多种表现形式的体现 
 
比如:我到宠物店说”请给我一只宠物”,服务员给我小猫、小狗或者蜥蜴都可以,我们就说”宠物”这个对象就具备多态性。 

例子
public interface Vegetarian{}
public class Animal{}
public class Deer extends Animal implements Vegetarian{}

因为Deer类具有多重继承,所以它具有多态性。 
访问一个对象的唯一方法就是通过引用型变量 (编译时变量)。 
引用型变量只能有一种类型,一旦被声明,引用型变量的类型就不能被改变了。 
引用型变量不仅能够被重置为其他对象,前提是这些对象没有被声明为final。还可以引用和它类型相同的或者相兼容的对象。它可以声明为类类型或者接口类型。

Deer d = new Deer();
Animal a = d;
Vegetarian v = d;
Object o = d;

所有的引用型变量d,a,v,o都指向堆中相同的Deer对象。

我们来看下面这个例子:

public class Animal {
            public String name = "父类name";
            public void move(){
                System.out.println("父类move");
            }
            public void content(){
                System.out.println("父类content");
            }
}
public class Bird extends Animal{
    public String name = "子类name";
    @Override
    public void move() {
        // TODO Auto-generated method stub
        System.out.println("子类move");
    }
     public void content(){
        System.out.println("子类content");
    }

}
public class Test {
    public static void main(String[] args) {
        Animal a = new Animal();
        System.out.println(a.name);
        a.move();
        a.content();

        System.out.println("----------------------");

        Animal b = new Bird(); //向上转型由系统自动完成
        //编译时变量      运行时变量
        System.out.println(b.name);
        b.move();
        b.content();

        System.out.println("----------------------");

        Bird c = new Bird();
        System.out.println(c.name);
        c.move();
        c.content();
    }
}

运行结果:

父类name
父类move
父类content
----------------------
父类name
子类move
子类content
----------------------
子类name
子类move
子类content

说明:Bird类继承Animal并重写了其方法。 
因为Animal b = new Bird(),编译时变量和运行时变量不一样,所以多态发生了。可以从最后的运行结果中看出,调用了父类的成员变量name和子类重写后的两个方法。 
上面继承说了,子类可以调用父类所有非private的方法和属性。因为name是一个String的对象,与方法不同,对象的域不具有多态性。通过引用变量来访问其包含的实例变量时,系统总是视图访问它编译时类型所定义的变量,而不是他运行时类型所定义的变量。

  那么问题来了,如果我们把Animal的成员变量换成private,那会不会去调用Bird类的成员变量name来打印输出呢? 

也就是说 系统访问的始终是去访问编译时类型所定义的变量。 

  重写定义:子类对父类的允许访问的方法的实现过程进行重新编写!返回值和形参都不能改变。即外壳不变,核心重写!

时间: 2024-12-31 10:42:42

[Java] 面向对象的三个特征与含义的相关文章

java面向对象(三)之抽象类,接口

java类 java类分为普通类和抽象类,接口,上一节我大概讲了java类的一般格式,今天将抽象类和接口.同时讲一下它们是怎样存储的. 最重要的是理解为什么要有抽象和接口,这样学下来你猜不会迷茫,才能更好的去使用,所以多看看我写的关于抽象类和接口的目的. 抽象类 目的 为了对代码更好的维护和重用. 解析: 抽象类往往用来表征对问题领域进行分析.设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象. 1.因为抽象类不能实例化对象,所以必须要有子类来实现它之后才能使用.这样就可

java-新手求助 JAVA面向对象的题目:

问题描述 新手求助 JAVA面向对象的题目: 共有两道题目:如题: 1:使用日期类Date 编写程序创建一个Date对象,设置它的流失时间分别为10000,100000,1000000 10000000.然后使用toString()方法分别显示上述日期: 2:编写一个程序,创建种子是1000的Random对象,然后使用nextInt(100)的方法显示0到 100之间的50个随机数. 刚学,连题目都看不懂.大家有时间的话.麻烦多指教一下.谢谢啦! 解决方案 新手java面向对象(一)新手java

面向对象的三个基本特征

面向对象的三个基本特征(讲解) 面向对象的三个基本特征是:封装.继承.多态. 封装 封装最好理解了.封装是面向对象的特征之一,是对象和类概念的主要特性. 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏. 继承 面向对象编程 (OOP) 语言的一个主要功能就是"继承".继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. 通过继承创建的新类称为"子类"

Java面向对象的三大特征_java

java面向对象的三大特征:"封装.继承.多态".更多Java技术知识,请登陆疯狂软件教育官网.微信搜索微信号:疯狂软件,参加2015年优惠活动,有机会获得优惠劵和代金劵. 以本文为例,User类中的变量为私有变量,只能通过创建对象(此时构造方法自动调用)来赋值. 外界只能通过公有方法api()来访问User类. Admin类继承了User类,调用了其构造方法,还重写了method_1方法,增加了一个特有方法power(). User文件 public class User { /**

JavaSE学习总结(四)——Java面向对象十分钟入门

 面向对象编程(Object Oriented Programming,OOP)是一种计算机模拟人类的自然思维方式的编程架构技术,解决了传统结构化开发方法中客观世界描述工具与软件结构的不一致性问题.Java是一种纯面向对象的语言,与C语言不一样他是面向过程的语言.通俗说Java程序主要是由类组成的,而C是由函数组成的. 面向对象非常重要,恰当的使用面向对象会使我们开发的系统拥有"可复用"."可扩展"."可维护"的特点.面向对象的概念和应用已超越了

JAVA面向对象之对象和类

Java是一种面向对象的编程语言,面向对象在整个Java的学习中属于重中之重,从这一篇博客开始,将逐步为大家介绍Java面向对象的相关知识,这一偏将为大家介绍对象和类的概念以及如何定义类和创建对象. 一.对象和类的概念 1.对象 以一个人为例,对于人,我们可以从他所具有的特征和所具有的行为来进行分析. 特征:体重.身高.性别.年龄...... 行为:吃饭.睡觉.说话...... 上面的例子就是对现实世界中的具体事物进行的描述,这些具体的事务就是对像,比如一个人.一辆车.从以上的分析还可以看出,人

关于JAVA面向对象的问题

问题描述 关于JAVA面向对象的问题 在JAVA中,万事万物皆对象,现在我有一个问题:JAVA中的执行语句是对象吗?如果是,它的class是什么? 解决方案 施主,你着相了...你说的东西确实不是对象. 所有编程语言的基础都是过程.因为所有编程语言最终目的是 [去做一件事]. java就是以对象为单位封装了过程,过程可以看作是对象的动作,过程操作的数据可以看作对象的属性. Java中你只能通过对象来操作过程,这就是处处都是对象的真意. 那么,所有过程操作的数据都是对象吗?是的. 那么,操作对象数

JAVA面向对象之构造方法

一.构造方法 在上一篇博客<JAVA面向对象之对象和类>中用到了Box box = new Box();语句来创建一个对象,new可以理解成创建一个对象的关键字,通过new关键字为对象分配内存,初始化实例变量,并调用构造方法.Box()在形式上和调用方法的形式相同,这个Box()就是一个特殊的方法叫构造方法.但是我们在代码中并没有看到这个方法的定义,是因为在没有定义构造方法的时候,JAVA会隐式的创建一个无参的默认构造方法,构造方法有以下特征: 具有和类相同的名称. 不含有返回值 不能在方法中

JAVA面向对象之多态

多态(Polymorphism)按字面的意思就是"多种状态".在面向对象语言中,接口的多种不同的实现方式即为多态.引用Charlie Calverts对多态的描述--多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自"Delphi4 编程技术内幕"). 多态指同一个实体同时具有多种形式.它是面向对象程序设计(OOP)的一个重要特征.如果一个语言只支持类而不支持多态,只能说明它是