第一节:什么是对象
第二节:接口
通过简单地声明一个名字(lt),我们为 某个对象创建 了一个“句柄”。然后用 new 关键字新建类型为 Light 的一个对象。再用等号将其赋给句柄 lt。为了向对象发 送一条消息,我们列出句柄名(lt),再用一个句点符号(.)把它同消息名称(on)也可以是属性。连接起来。从中可以看 出,使用一些预先定义好的类时,我们在程序里采用的代码是非常简单和直观的。
第三节:方案的隐藏
第四节:方案的封装以及重复使用
访问权限修饰符
Java 访问权限修饰符 public,protected 和 private 位于定义的类名,属性名和方法名之前。每个访问权限修饰符只能控制它所修饰的对象。
public: 接口访问权限
当你使用关键字 public,就意味着紧随 public 后声明的成员对于每个人都是可用的,尤其是使用类库的客户端程序员更是如此。
private: 你无法访问
关键字 private 意味着除了包含该成员的类,其他任何类都无法访问这个成员。同一包中的其他类无法访问 private 成员,因此这等于说是自己隔离自己。另一方面,让许多人合作创建一个包也是有可能的。使用 private,你可以自由地修改那个被修饰的成员,无需担心会影响同一包下的其他类
public class PrivateDemo {
private PrivateDemo() {
}
public static PrivateDemo makePrivateDemo() {
System.out.println("makePrivateDemo======");
return new PrivateDemo();
}
}
因为PrivateDemo的构造函数为私有的,所以不能通过new一个对象直接创建PrivateDemo对象
// PrivateDemo中的构造函数为private 不能通过构造函数生成对象
PrivateDemo privateDemo = new PrivateDemo();
所以只能通过makePrivateDemo()方法创建对象
PrivateDemo privateDemo2 = PrivateDemo.makePrivateDemo();
protected: 继承访问权限
要理解 protected 的访问权限,我们在内容上需要作一点跳跃。首先,在介绍本书"复用"章节前,你不必真正理解本节的内容。但为了内容的完整性,这里作了简要介绍,举了个使用 protected 的例子。
在理想世界中,仅靠关键字 private 就足够了。在实际项目中,却经常想把一个事物尽量对外界隐藏,而允许派生类的成员访问。
关键字 protected 就起这个作用。它表示“就类的用户而言,这是 private 的。但对于任何继承它的子类或在同一包中的类,它是可访问的。”(protected 也提供了包访问权限)
public class PrivateDemo2 extends PrivateDemo{
public static String a = PrivateDemo.x;
public PrivateDemo2(){
System.out.println("PrivateDemo2==="+a);
}
}
类定义的其他部分看起来是一样的。
如果你创建了一个新包,并从另一个包继承类,那么唯一能访问的就是被继承类的 public 成员。(如果在同一个包中继承,就可以操作所有的包访问权限的成员。)有时,基类的创建者会希望某个特定成员能被继承类访问,但不能被其他类访问。这时就需要使用 protected。protected 也提供包访问权限,也就是说,相同包内的其他类可以访问 protected 元素。
public class PrivateDemo {
public PrivateDemo(){
}
protected static String x="protected";
}
执行代码
PrivateDemo2 privateDemo2 = new PrivateDemo2();
Demo2成功获取到了父类Demo1中由protect修饰的值
第五节:继承(重新使用接口)
继承能给我们带来的优势是,他能省去许多相似的代码,对于那些具有相同属性的类别,通过继承,我们就不需要去为每一个类单独去编写他们的属性与方法,省去了许多繁杂步骤,同时也能使得我们的代码简便易理解, 但是我们需要注意的是,继承不能是多继承的,java中的类除了继承了java本身的类之外,他只能再继承一个父类,(可以理解为亲生父亲就只有一个,不会有第二个一样就是public class 子类名 extends 父类名1 父类名2…… )这样继承的话java会报错,
第六节:多态
void doStuff(Shape s) {
s.erase();
// ... s.draw();}
Circle c = new Circle();
Triangle t = new Triangle();
Line l = new Line();
doStuff(c);
doStuff(t);
doStuff(l);
上述代码中Circle Triangle Line都是继承于Shape(形状)
doStuff()期望接受的是一个Shape类型的函数,但是Circle Triangle Line都是继承于Shape,即都是一种形状,所以doStuff()函数能够正确接受对象并进行处理。
1:动态绑定
2:抽象的基础类和接口
如果某个类继承了一个抽象类,那么这个类有两个选择——要么实现父类所有的抽象方法,要么子类本身也定义成抽象类。当然,肯定也不会是想定义成抽象类就定义成抽象类的,要满足我们我们上面所说的定义抽象类的条件——即类中提供的信息不足以描述一个对象,或者类中有无法确定的行为需要延迟到子类实现。
abstract public class Animal {
private static final String TAG = Animal.class.getSimpleName();
private int legs;
private String head;
private String body;
private String tail;
static {
System.out.println("Animal static: ");
}
public Animal() {
System.out.println("Animal 构造方法:");
}
public abstract void eat();
public abstract void move();
}
package knowledge.polymorphism.about_abstract.character;
public abstract class Food { /** 父类 : Food类 */
//记住,抽象方法没有方法体
public abstract void showNutrition();
}
class Meat extends Food { /** 子类 : Meat类 */
@Override
public void showNutrition() { /** 实现继承food类的子类共有的抽象方法 */
System.out.println("肉类是人体获取蛋白质、脂肪重要来源。");
}
public void cooking(){ /** 肉类区别于水果类新加的具体实现的方法 */
System.out.println("肉类一般搭配蔬菜一起进行烹饪");
}
}
abstract class Fruit extends Food { /** 子类 : Fruit类 */
@Override
public void showNutrition() { /** 实现继承food类的子类共有的抽象方法 */
System.out.println("水果是人体获取维生素的重要来源。");
}
}
class Test { /** 测试类 : Test类 */
public static void main(String[] args) {
Meat meat = new Meat();
meat.showNutrition();
}
}
注意!!!!如果某个类中已经出现了抽象方法,那这个类必须定义成抽象类。
拥有抽象方法的类一定是抽象类;但是抽象类不一定有抽象方法。
- 继承:继承是从已有类得到继承信息创建新类的过程
- 封装:封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口
- 多态性:多态性是指允许不同子类型的对象对同一消息作出不同的响应
- 抽象类:抽象类不能被实例化,只能被继承,拥有抽象方法的类一定是抽象类;但是抽象类不一定有抽象方法