java 面向对象基本知识

1.继承

  使用extends实现继承 只有单继承

  子类继承父类,可以得到父类的全部属性和方法 (除了父类的构造方法),但不见得可以直接访问(比如,父类私有的属性和方法)。

   instanceof是二元运算符,左边是对象,右边是类;当对象是右面类或子类所创建对象时,返回true;否则,返回false。

  

1 public class Test{
2     public static void main(String[] args) {
3         Student s = new Student("张三",007,"Java");
4         System.out.println(s instanceof Student);
5     }
6 }

 

2.方法的重写

  子类通过重写父类的方法,可以用自身的行为替换父类的行为。方法的重写是实现多态的必要条件。

    方法的重写需要符合下面的三个要点:

       (1).“==”: 方法名、形参列表相同。

       (2).“≤”:返回值类型和声明异常类型,子类小于等于父类。

       (3).“≥”: 访问权限,子类大于等于父类。

 1 class Vehicle { // 交通工具类
 2     public void run() {
 3         System.out.println("跑....");
 4     }
 5 }
 6 class Horse extends Vehicle { // 马也是交通工具
 7     public void run() { // 重写父类方法
 8         System.out.println("四蹄翻飞,嘚嘚嘚...");
 9     }
10 }

 

3.==和equals

  “==”代表比较双方是否相同。如果是基本类型则表示值相等,如果是引用类型则表示地址相等即是同一个对象。

  Object类中定义有:public boolean equals(Object obj)方法,提供定义“对象内容相等”的逻辑。

  Object 的 equals 方法默认就是比较两个对象的hashcode,是同一个对象的引用(内存地址相同)时返回 true 否则返回 false。但是,我们可以根据我们自己的要求重写equals方法。

  

 1 public boolean equals(Object obj) {
 2         if(obj == null){ //为空没有比较的必要
 3             return false;
 4         }else {
 5             if(obj instanceof Person) {
 6                 Person c = (Person)obj;
 7                 if(c.id==this.id) {
 8                     return true;
 9                 }
10             }
11         }
12         return false;
13     }

 

4.super

  super是直接父类对象的引用。可以通过super来访问父类中被子类覆盖的方法或属性。

  若是构造方法的第一行代码没有显式的调用super(...)或者this(...);那么Java默认都会调用super(),含义是调用父类的无参数构造方法。这里的super()可以省略。

 

5.封装

  

  

  类的属性的处理:

      1. 一般使用private访问权限。

      2.  提供相应的get/set方法来访问相关属性,这些方法通常是public修饰的,以提供对属性的赋值与读取操作

   3. 一些只用于本类的辅助性方法可以用private修饰,希望其他类调用的方法用public修饰。

 

6.多态  

   (1). 多态是方法的多态,不是属性的多态(多态与属性无关)。

      (2). 多态的存在要有3个必要条件:继承,方法重写,父类引用指向子类对象。

      (3). 父类引用指向子类对象后,用该父类引用调用子类重写的方法,此时多态就出现了。

 1 class Animal {
 2     public void shout() {
 3         System.out.println("叫了一声!");
 4     }
 5 }
 6 
 7 class Dog extends Animal {
 8     public void shout() {
 9         System.out.println("旺旺旺!");
10     }
11     public void seeDoor() {
12         System.out.println("看门中....");
13     }
14 }
15 class Cat extends Animal {
16     public void shout() {
17         System.out.println("喵喵喵喵!");
18     }
19 }
20 
21 public class TestPolym {
22     public static void main(String[] args) {
23         Animal a1 = new Cat(); // 向上可以自动转型
24         //传的具体是哪一个类就调用哪一个类的方法。大大提高了程序的可扩展性。
25         animalCry(a1);
26         Animal a2 = new Dog();
27         animalCry(a2);//a2为编译类型,Dog对象才是运行时类型。
28          
29         //编写程序时,如果想调用运行时类型的方法,只能进行强制类型转换。
30         // 否则通不过编译器的检查。
31         Dog dog = (Dog)a2;//向下需要强制类型转换
32         dog.seeDoor();
33     }
34  
35     // 有了多态,只需要让增加的这个类继承Animal类就可以了。
36     static void animalCry(Animal a) {
37         a.shout();
38     }
39  
40     /* 如果没有多态,我们这里需要写很多重载的方法。
41      * 每增加一种动物,就需要重载一种动物的喊叫方法。非常麻烦。
42     static void animalCry(Dog d) {
43         d.shout();
44     }
45     static void animalCry(Cat c) {
46         c.shout();
47     }*/
48 }

 

7.final关键字

  (1). 修饰变量: 被他修饰的变量不可改变。一旦赋了初值,就不能被重新赋值。

final  int   MAX_SPEED = 120;

  (2). 修饰方法:该方法不可被子类重写。但是可以被重载!

final  void  study(){}

  (3). 修饰类: 修饰的类不能被继承。比如:Math、String等。

final   class  A {}
posted @ 2019-01-22 21:03  北风吹沙  阅读(383)  评论(0编辑  收藏  举报