Qingquan-Li / blog

My Blog
https://Qingquan-Li.github.io/blog/
132 stars 16 forks source link

Java 面向对象三大特性以及抽象类和接口 #34

Open Qingquan-Li opened 7 years ago

Qingquan-Li commented 7 years ago

封装

作用域 / 修饰符 Public Protected 无修饰符(default) Private
同一个类
同一个包 ×
(不同包的)子类 × ×
不同包 × × ×


封装类 < POJO ≈ entity实体类 < JavaBean



继承

[访问修饰符] class Pet {
    //公共的属性和方法
}
[访问修饰符] class Dog extends Pet {
    //子类特有的属性和方法
}


方法重写

比较项 位置 方法名 参数表 返回值 访问修饰符
方法重写 子类 相同 相同 相同或是其子类 不能比父类更严格
方法重载 同类 相同 不相同 无关 无关

附:方法重载的作用(只能重载构造方法) 提高了程序的可读性。使得程式设计人员能较少苦恼于方法名称的设计。如果我们只需要执行一个操作,同名的方法将增加程序的可读性。 在编程过程中,是要遵守编程规范的,这就要求方法的命名是要有意义的,而有的方法可能面临着:会有不用的参数列表。这时会用到重载,这样,既可以表示方法的意义,又表示这些方法是相关方法,方便调用。所以,方法重载,很大程度是为了程序的可读性,即使不用,也是不会妨碍程序运行的。


Object 类

方法 说明
toString() 返回当前对象本身的有关信息,按字符串对象返回
equals() 比较两个对象是否是同一个对象,是则返回 true
hashCode() 返回该对象的哈希代码值
getClass() 获取当前对象所属的类信息,返回 Class 对象

Object 类的 equals() 方法与==没区别 当有特殊需求,如认为属性相同即为同一对象时,需要重写 equals() Java.lang.String 重写了 equals() 方法, 把 equals() 方法的判断变为了判断其值



多态


类型转换

向上转型

向上转型:父类的引用指向子类对象( Pet pet = new Dog() )。自动进行类型转换

//测试方法
Pet pet = new Dog();
pet.setHealth(20); 
Master master = new Master(); 
master.cure(pet); 

向下转型

向下转型:将一个指向子类对象的父类引用赋给一个子类的引用,即:父类类型转换为子类类型。需强制类型转换。

Dog dog=(Dog)pet;   //将 pet 转换为 Dog 类型
dog.catchingFlyDisc();  //执行 Dog 特有的方法

instanceof



抽象类

抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。 通常在编程语句中用 abstract 修饰的类是抽象类。含有抽象方法的类称为抽象类,它不能生成对象。 抽象类是不完整的,它只能用作基类(用于被继承)。在面向对象方法中,抽象类主要用来进行类型隐藏和充当全局变量的角色。 参考: http://www.runoob.com/java/java-abstraction.html

public abstract class Base {
    //抽象类中可以没有抽象方法,但包含了抽象方法(没有方法体)的类就必须被定义为抽象类
    public abstract void method1();
    public abstract void method2();
    public void method3(){}
    //没有抽象的构造方法。
    //public abstract Base(){}
    //没有抽象的静态方法。
    //static abstract void method4();
    public Base(){
        System.out.println("父类的无参构造方法");
    }
    static void method4(){
        System.out.print("静态方法表示类所特有的功能,这种功能的实现不依赖于类的具体实例,也不依赖于它的子类。因此,当前类必须为静态方法提供实现");
    }
}
//如果子类没有实现父类的所有抽象方法,子类必须被定义为抽象类
public abstract class Sub1 extends Base {
    public void method1() {
        System.out.println("重写父类的method1");
    }
}
//否则就必须实现父类的所有抽象方法
public class Sub2 extends Base {
    public Sub2(){
        System.out.println("子类的无参构造方法");
    }
    @Override
    public void method1() {
        System.out.println("重写父类的抽象方法method1");
    }
    @Override
    public void method2() {
        System.out.println("重写父类的抽象方法method2");
    }
}
public class Test {
    public static void main(String[] args) {
        //抽象类不允许实例化
        //Base base=new Base();
        //抽象类中可以有非抽象的构造方法,创建子类的实例时可能调用
        //抽象类不能被实例化(不能生成对象),但可以创建一个引用变量,其类型是一个抽象类,指向非抽象的子类实例(多态)
        Base sub=new Sub2();//输出:父类的无参构造方法 <br /> 子类的无参构造方法
        sub.method1();    //输出:重写父类的抽象方法method1
        sub.method4();    //输出:静态方法表示类所特有的功能,这种功能的实现不依赖于类的具体实例,也不依赖于它的子类。因此,当前类必须为静态方法提供实现
    }
}


抽象类与接口的区别:



接口 interface

接口(英文:Interface),在 Java 编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。 接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。 除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。 接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。 参考: http://www.runoob.com/java/java-interfaces.html

public class UsbFan implements UsbInterface {
    @Override
    public void service() {
        System.out.println("USB风扇连接 USB 口,开始转动。");
    }
}
public class UsbTest {
    public static void main(String[] args) {
        //U盘
        UsbInterface UDisk = new UDisk();
        UDisk.service();
        //风扇
        UsbInterface UsbFan = new UsbFan();
        UsbFan.service();
    }
}
syncwt commented 7 years ago

接口和抽象类都必须被实现其中的所有方法。

这一句应该是有问题的,抽象类中只需被实现其抽象方法。