1、访问控制权限(public,private,protected,default)
public>protected>default>private
java中用来控制类及类的方法和变量访问权限。
(1)public :公共的 表示包(package)内及包外的任何类(包括子类和普通类)都可以访问。—最开放
(2)protected:受保护的 表示包内的任何类及包外继承了该类的子类才能访问,突出继承。
(3)default:默认的 表示包内的任何类都可以访问,但是包外的任何类都不能访问。
(4)private:私有的 只有本类可以访问,包内外的任何类均不能访问。—封装
访问控制修饰符 | 同类 | 同包 | 子类 | 不同的包 |
public | 1 | 1 | 1 | 1 |
protected | 1 | 1 | 1 | 0 |
default | 1 | 1 | 0 | 0 |
private | 1 | 0 | 0 | 0 |
2、多态定义
多态分为编译时的多态和运行时多态。其中编译时多态 也可称为静态多态
运行时的多态为动态多态,主要通过动态绑定来实现,常说默认的多态
多态 为了应对不同的变现形式
3、静态多态
其实就是 方法的重载,主要根据参数列表的不同来区分不同的函数
静态多态 不需要继承
4、动态多态
例如:品酒大师
三个杯子 倒了 3杯酒
酒 a= 五粮液;
酒 b= 茅台酒;
酒 c= 二锅头。
声明一个 酒的类,三种不同的酒 相当于不同的子类。
只有在运行时 才能知道 喝的什么酒。
所谓动态多态就是指 引用在不同的情况下所表现的实际对象。
(1)继承(实现接口)。在多态中必须存在 父类与子类的关系。
(2)重写。子类必须对父类的某些方法进行重新定义,在调用这些方法时 就会调用子类的方法。
(3)向上转型:父类引用指向子类的对象
5、向上转型
向上转型:子类的对象转换为父类类型
例如:
Wine wine=new WLY();—向上转型
Wine wine=new Wine();–正常实例化对象
子类的单独定义的方法会丢失,能访问子类重写父类的方法
6、动态多态小案例–动物喂食
养了一堆宠物 有狗 有猫。宠物喜欢吃什么 也要根据宠物的类型 来选择喂食
狗–骨头
猫–鱼
if(animal is dog ){
food=bone;
eat food;
}else if(animal is cat){
food= fish;
eat fish.
}
可否写一个方法 来实现所有宠物的喂食
7、向下转型
向下转型是把父类对象转换为子类对象
Animal animal=new Animal();
Cat cat = (Cat)animal —-不对的
把一个动物强制转换为 猫,如果这个动物是只狗,狗是变不成猫的
向下转型必须得有向上转型作为前提。因为只有子类相对应的才可以转换
代表这个动物是 猫,之后 把动物再变回为猫。—打回原形
8、.内部类定义
在Java当中的一个类中在声明一个类 就叫 内部类。
例如:
class Outter{
成员变量;
class Inner{
}
成员方法;
}
9、内部类分类
(1)(普通)成员内部类:与成员level一样,内部类中不能存在 static 关键字,不能够声明静态的方法、属性、静态代码块;
最普通的内部类
(2)静态(成员)内部类:使用static修饰的成员内部类
(3)(普通)局部内部类:局部范围内有效的内部类(例如:方法里面)
(4)匿名(局部)内部类:没有名字的局部内部类
3.成员内部类定义
(1)定义:与我们的成员变量一样,可以声明类名,在成员内部类中可以声明属性和方法
(2)作用:a、成员内部类可以无限制访问外部类的变量和方法(包括private修饰的)
b、内部类可以有多个
c、成员内部类与外部类如果存在同名的成员变量或方法,优先是内部的。如果访问外部类的
需要 Outter.this.(变量或方法名)
10、成员内部类与外部类的访问
(1)成员内部类访问外部类 无限制
(2)外部类访问内部类的成员,不是无限制的。
首先要传建一个内部类的对象,然后通过对象来访问
11、成员内部类的初始化
不是在类里面操作,如果是其他类要访问时,要访问内部类,首先实现外部类的实例化之后再实例化内部类
(1)在外部类对象初始化基础之上初始化内部类,调用内部类的构造函数
Outter.Inner inner=outter.new Inner();
(2)通过外部类的成员方法获得成员内部类的对象,然后访问其变量和方法
12、静态内部类
使用 static修饰的成员内部类叫做静态内部类
定义格式如下:
class Outter{
static
class inner{
}
}
外部类不是静态也可以声明静态内部类
静态内部类 要类比 静态成员变量
静态内部类可以通过外类直接调用 new Outter.Inner();
静态内部类内部可以直接访问外部类中所有的静态变量和方法(包含private)
13、局部内部类
定义在代码块、方法体等的类叫局部内部类。
—局部变量 类比
不能够有 public protected private 以及 static 修饰
class Outter{
public void
func(){
class inner{
}
}
}
局部内部类只是在一个方法或区域里起作用
14、匿名内部类
没有名字的局部内部类
必须要继承一个父类或者实现一个接口
定义形式:
正常初始化对象:
类名 对象名=
new
类名();
匿名内部类:
new
父类构造方法(){
//重写一个函数
修饰符 返回参数类型 方法名(参数列表){
}
};
局部内部类的区别 局部的位置不同
匿名内部类当中不能够有静态属性和静态方法
匿名内部类 不需要新建一个类 而是通过匿名的形式吧 实现方法的重写
匿名内部类尤其针对 Android开发 例如 监听 鼠标事件 键盘 触屏输入
Lisenter(){
@override
MouseMoniter(){
}
};
15、总结内部类
(1)成员内部类
(2)静态内部类
(3)局部内部类
(4)匿名内部类
a、每个内部类都可以独立的继承或实现一个接口,而外部类也可以继承一个直接父类。 —多继承的一种表现
b、通过内部类可以实现对外界的隐藏。–封装
c、内部类可以无限制的使用外部类的成员变量(包括私有),不用生成外部类的对象
d、匿名内部类可以简化代码的编写,方便编写事件驱动的程序、线程程序。
e、成员内部类 静态内部类 可以对比 成员变量和静态变量
局部内部类 匿名内部类 可以对比局部变量
16、面向对象总结
封装 继承 多态
面向对象的思路去设计程序