面向对象的特征有哪些方面?
继承
- 继承是从已有类(接口)得到继承信息创建新类(接口)的过程。
- 提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。
- 派生类可以从它的基类那里继承public、protexted修饰的方法和实例变量,并且子类可以修改或增加新的方法使之更适合特殊的需要,
- 实体类是单继承,但支持多重继承,可以实现多个接口;接口只能是继承,而且是多继承。
- 子类继承父类中friendly修饰的方法或者变量时,必须在同一个包
- 子类不继承父类构造方法,因为构造方法名必须与类名一致!
- 如果父类是抽象类,当子类不为抽象类时,必须实现父类中的所有抽象方法;当子类未实现父类的抽象方法时,子类也必须为抽象类
- 抽象类可以实现(implements)接口,抽象类可以继承实体类
/**
* Created by Administrator on 2018/6/6 0006.
* 1.抽象类可以可以继承实体类,实现(implements)接口
*/
public abstract class OX extends Animal implements List {
public abstract void print();
}
封装
- 通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口(通俗意义上的方法)。
- 面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。
- 在类中编写的方法就是对实现细节的一种封装;编写一个类就是对数据和数据操作的封装。
- 封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口方法。
多态性
- 多态性是指允许不同子类型的对象对同一消息作出不同的响应。
- 简单的说就是用同样的对象引用调用同样的方法但是做了不同的事情。
- 实现多态需要两个前提:
- 方法重写:子类继承父类<包括实现接口>并重写父类中已有的或抽象的方法
- 父类的引用指向子类的生成:用父类型引用引用子类型对象,这样同样的引用调用同样的方法就会根据子类对象的不同而表现出不同的行为。(实际开发中JDBC的数据源被不同的数据源提供商提供实现就是典型的例子)
/**
* Created by Administrator on 2018/6/6 0006.
* 动物类:将一类对象的共同特征总结出来构造类的过程叫抽象
* 提供继承信息的类被称为父类(超类、基类)
* 同理可以设计成抽象类或者接口
*/
public class Animal {
public void food() {
System.out.println("test.polymorphicTest.Animal.food");
}
public void eat(){
System.out.println("test.polymorphicTest.Animal.eat");
}
}
/**
* Created by Administrator on 2018/6/6 0006.
* 狗类---继承动物类
* 从已有类(接口)得到继承信息创建新类(接口)的过程叫继承
* 得到继承信息的类被称为子类(派生类)
*/
public class Dog extends Animal {
/** 多态的两个要点之一:方法重写(重写父类的方法)
* 这里只重写了food,没有重写eat方法
*/
@Override
public void food() {
System.out.println("test.polymorphicTest.Dog.food");
}
}
/**
* Created by Administrator on 2018/6/6 0006.
* 猫类----同样继承动物类
*/
public class Cat extends Animal {
/** 多态两个要点之一:方法重写
* 同样只重写了food,没有重写eat方法
*/
@Override
public void food() {
System.out.println("test.polymorphicTest.Cat.food");
}
/** 把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口(通俗意义上的方法)叫封装
* 这个类是Cat子类自己的方法
*/
public void sound() {
System.out.println("test.polymorphicTest.Cat.sound");
}
}
public class Test {
public static void main(String[] args) {
/** 多态两个要点之二:父类的引用指向子类的生成
* 所以同样的对象引用调用同样的方法但是做了Dog与Cat两者不同的事情
*/
Animal animal = new Dog();
/** 因为Dog重写了food方法,所以这里调用的是Dog类自己的*/
animal.food();
animal = new Cat();
/** 因为Cat重写了food方法,所以这里调用的是Cat类自己的*/
animal.food();
/**因为Dog、Cat都没有重写eat,所以这里调用的是父类Animal的*/
animal.eat();
/**因为sound方法是Cat自己独有的,所以上面的animal对象引用是调用不了的
* 只能子类自己的对象引用才可以*/
Cat cat = new Cat();
cat.sound();
}
}
四大访问作用域
修饰符 |
当前类 |
同 包 |
子 类 |
其他包 |
public |
√ |
√ |
√ |
√ |
protected |
√ |
√ |
√ |
× |
default |
√ |
√ |
× |
× |
private |
√ |
× |
× |
× |
public
/**
* Created by Administrator on 2018/6/6 0006.
* 一个.java源文件中,只能有一个类被修饰为public,且其类名必须与文件名一致。
* 可以修饰类、成员变量、方法。
*/
public class User {
public String name;
public void show() {
System.out.println("Hello");
}
}
protected
/**
* Created by Administrator on 2018/6/6 0006.
* 可以修饰成员变量、方法。
*/
public class User {
protected String name;
protected void show() {
System.out.println("Hello");
}
}
default
/**
* Created by Administrator on 2018/6/6 0006.
* 1、defatule可以修饰类、成员变量、方法。
* 2、default不要写出来,修饰时,不写则表示为default
* 3、default修饰时,只有同一个包中类可以访问
*/
class User {
String name;
void show() {
System.out.println("Hello");
}
}
private
/**
* Created by Administrator on 2018/6/6 0006.
* 1、private可以修饰成员变量、方法。
* 2、private修饰时,只有自己能使用
*/
public class User {
private String name;
private void show() {
System.out.println("Hello");
}
}
String 是最基本的数据类型吗?
- 不是。Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;
- 除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type)