继承是从已有的类创建新类的过程
语法:
[访问权限] class 子类名 extends 父类名{
类体定义;
}
示例:
public class Dog{
private String name;
private String sex;
public void eat(){System.out.println(“吃饭”);}
}
public class HomeDog extends Dog{
//类的定义
}
public class HuskyDog extends Dog{
//类的定义
}
protected(受保护的访问权限修饰符,用于修饰属性和方法,使用protected修饰的属性和方法可以被子类继承)
继承的限制约定:
继承的好处:
继承的缺点:
在子类进行实例化操作的时候,首先会先让其父类进行初始化操作。之后子类再自己进行实例化操作。
子类的实例化过程:
结论:
方法重写(overriding method)
关于方法重写的一些特性:
为什么要重写方法?或者方法重写的目的是什么?
面试题 :overloading与overriding的区别?
super可以完成以下的操作:
this表示当前对象
使用super来调用父类的属性,方法,和构造方法
实现一个化妆品商城中的化妆品管理
使用final关键字完成以下的操作:
final应用:
public static final int NUM = 10;
//常量类:在该类中只有常量,通常是应用程序中公共的常量或标记
public final class Constant{
public static final String SERVER_ROOT_URL = "http://www.baidu.com";
public static final String CACHE_PATH = "data_cache";
//....
}
抽象类的基本概念
定义一个抽象类
abstract class Animal{
public abstract void move();
}
abstract class Person extends Animal{
private String name;
//...
public abstract void eat();//抽象方法
}
//具体类
class Man extends Person{
public void eat(){
System.out.println("我是男人,我爱吃肉");
}
public void move(){
System.out.println("我爱跑步");
}
}
class Women extends Person{
public void eat(){
System.out.println("我是女人,我爱吃香蕉");
}
public void move(){
System.out.println("我喜欢逛街");
}
}
抽象类的规则:
接口的概念
接口的定义格式:
interface 接口名称{
全局常量 ;
抽象方法 ;
}
示例:
interface IEat{
//public abstract void eat();
void eat();
//public static final int NUM = 10;
int NUM = 10; }
interface ISleep extends IEat{
void sleep();
}
//实现接口的类
class Girl implements IEat,ISleep{
private String name;
public Girl(String name){
this.name = name;
}
public void eat(){
System.out.println("我是"+name+"的女票,我爱吃香蕉");
}
public void sleep(){
System.out.println("我爱睡觉");
}
}
接口的使用规则:
面向对象设计原则:
多态是面向对象三大特性之一
什么是多态性?
//用父类的引用指向子类对象(用大的类型去接受小的类型,向上转型、自动转换)
Chicken home = new HomeChicken();
结论:
对象的多态性:
向上转型: 将子类实例转为父类引用
格式:父类 父类对象 = 子类实例 ;-> 自动转换
以基本数据类型操作为例:int i = ‘a’ ;
(因为char的容量比int小,所以可以自动完成)
向下转型: 将父类实例转为子类实例
格式:子类 子类对象 = (子类)父类实例 ;强制转换
以基本数据类型操作为例:char c = (char)97;
因为整型是4个字节比char 2个字节要大,所以需要强制完成
多态性小结:
instanceof 是用于检查对象是否为指定的类型,通常在把父类引用强制转换为子类引用时要使用,以避免发生类型转换异常(ClassCastException)。
if(homeChicken instanceof Chicken){
//...
}
该语句一般用于判断一个对象是否为某个类的实例,是返回true,否返回false
父类的设计法则
通过instanceof关键字,我们可以很方便 的检查对象的类型,但如果一个父类的子类过多,这样的判断还是显得很繁琐,那么如何去设计一个父类呢?
模板方法模式(Templete Method):定义一个操作中的算法的骨架,而将一些可变部分的实现延迟到子类中。模版方法模式使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定的步骤。
策略模式(Strategy Pattern),定义了一系列的算法,将每一种算法封装起来并可以相互替换使用,策略模式让算法独立于使用它的客户应用而独立变化。
OO设计原则:
Object类 是类层次结构的根类
public String toString()方法
public boolean equals(Object obj)
protected void finalize()throws Throwable
public final Class> getClass()
其它方法在后续章节中详解。
简单工厂模式是由一个工厂对象决定创建出哪一种产品类的实例。简单工厂模式是工厂模式家族中最简单实用的模式。
代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问。
代理模式说白了就是“真实对象”的代表,在访问对象时引入一定程度的间接性,因为这种间接性可以附加多种用途。
适配器模式( Adapter ):将一个类的接口转换成客户希望的另外一个接口。适配器模式使原本由于接口不兼容而不能一起工作的那些类可以一起工作。
OO设计原则:
内部类就是在一个类的内部定义的类。
成员内部类格式如下:
class Outer {
class Inner{}
}
编译上述代码会产生两个文件:Outer.class和Outer$Inner.class。
在外部创建内部类对象
Outer out = new Outer() ;// 产生外部类实例
Outer.Inner in = null; // 声明内部类对象
in = out.new Inner() ; // 实例化内部类对象
方法内部类
内部类可以作为一个类的成员外,还可以把类放在方法内定义。
class Outer {
public void doSomething(){
class Inner{
public void seeOuter(){}
}
}
}
静态内部类
在一个类内部定义一个静态内部类:静态的含义是该内部类可以像其他静态成员一样,没有外部类对象时,也能够访问它。静态嵌套类仅能访问外部类的静态成员和方法。
class Outer{
static class Inner{}
}
class Test {
public static void main(String[] args){
Outer.Inner n = new Outer.Inner();
}
}
匿名内部类
匿名内部类就是没有名字的内部类。
匿名内部类的三种情况:
在使用匿名内部类时,要记住以下几个原则:
问题:局部内部类访问局部变量必须用final修饰,为什么?
内部类的作用
成员
成员内部类
静态内部类
局部
方法内部类
匿名内部类
依赖外部类对象的:成员内部类,方法内部类,匿名内部类
静态内部类不依赖外部类的对象。所以,我们在项目中优先考虑选择静态内部类(不会产生内存泄露)
我们项目开发中如何选择?
链表(Linked list)一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到是下一个节点的指针(Pointer)
在链表数据结构中,我们需要使用到递归算法。
递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解
在Java中有一个设计的原则“一切皆对象”,Java中的基本数据类型就完全不符合这种设计思想,因为八种基本数据类型并不是引用数据类型,所以Java中为了解决这样的问题,JDK1.5以后引入了八种基本数据类型的包装类。
八种包装类分为两大类型:
装箱及拆箱操作
将一个基本数据类型转换为包装类,那么这样的操作称为装箱操作。将一个包装类转换为一个基本数据类型,这样的操作称为拆箱操作。
转型操作
注意:转型操作时,字符串必须由数字组成,否则会出现错误
享元模式(Flyweight Pattern) 它使用共享对象,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似对象;它适合用于当大量对象只是重复因而导致无法令人接受的使用大量内存。通常对象中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。
运用共享技术有效的支持大量细粒度的对象。
包用于对多个java源文件的管理,就像我们的文件目录一样。
定义一个包:
package com.vince;
该语句只能出现在代码中的第一句。