面向对象
四种权限修饰符
1,其中private的权限最小,只能在本类中访问
2,其次是默认,类名,构造方法前什么都不打,
可以在本类中和同一个包下(子类和无关类)中访问
3,然后是protected,可以在可以在本类,
同一个包下(子类和无关类),不同包下的子类中访问
4,最后是public,public的访问权限最大,
可以在可以在本类,同一个包下(子类和无关类),
不同包下的子类与不同包下的无关系类中访问
类及其组成所使用的常见修饰符
修饰符
权限修饰符:private,默认的,protected,public
状态修饰符:static,final
抽象修饰符:abstract
类
权限修饰符:默认修饰符,public
状态修饰符:final
抽象修饰符:abstract
用的最多的是:private
成员变量
权限修饰符:private,默认的,protected,public
状态修饰符:static,final
用的最多的是:private
构造方法
权限修饰符:private,默认的,protected,public
用的最多的是:public
成员方法
权限修饰符:private,默认的,protected,public
状态修饰符:static,final
抽象修饰符:abstract
用的最多的是:public
除此之外的组合规则
成员变量:public static final 接口
成员方法:
public static
public abstract
public final
内部类的概述
在类中定义类,这就是叫做内部类
内部类的访问特点
1,内部类可以直接访问外部类的成员,包括私有
2,外部类要访问内部类的成员,必须创建对象
3,外部类名.内部类名 对象名 = 外部类对象.内部类对象;
如:Outer.Inter oi = new Outer().new Inter();
1 class demo1_innerclass { 2 public static void main (String args []) { 3 //外部类访问内部类时一定要创建对象 4 outer.inner oi=new outer().new inner(); 5 oi.method(); 6 } 7 } 8 class outer { 9 private int num=20; 10 class inner { //内部类可以直接访问外部类 11 public void method() { 12 System.out.println(num); 13 } 14 } 15 }
成员内部类私有使用
class Demo_Inner { public static void main(String[] args) {
Outer o = new Outer(); o.method(); } } class Outer { private int numb = 20; private class Inner { public void print() { System.out.println(numb); } } public void method() { Inner i = new Inner(); i.print(); } }
内部类私有,在外部类创建一方法,在方法里创建一个对象进行调用。
注://outer.inner oi=new outer().new inner();
//oi.method();
这种情况下就不能使用这种方法
静态成员内部类
1 class demo2_Inner { 2 public static void main (String args []) { 3 //外部类名.内部类名 对象名 = 外部类名.内部类对象 4 Outer.Inner oi = new Outer.Inner(); 5 oi.method(); 6 7 Outer.Inner2.print(); 8 } 9 } 10 class Outer { 11 static class Inner { 12 public void method() { 13 System.out.println("啦啦啦"); 14 } 15 } 16 static class Inner2{ 17 public static void print(){ 18 System.out.println("哇哈哈"); 19 } 20 } 21 }
注:Outer.Inner oi = new Outer.Inner();
其次是外部类名. new内部类名,
只是我们习惯把new放在最前面,
所以是 new Outer.Inner();
局部内部类
1 class demo1_Innerclass { 2 public static void main (String args []) { 3 Outer o = new Outer(); 4 O.print(); 5 } 6 } 7 class Outer {
final int a = 10; 8 public void print() { 9 class Inner{ 10 public void method() { 11 System.out.println("喵喵喵?"); 12 } 13 } 14 Inner i = new Inner(); 15 I.method(); 16 } 17 }
注:局部内部类只能在本类方法去访问,运行完就会被弹栈,
所以局部内部类在访问他所在的方法中的局部变量必须用final修饰,使其变为常量,
方法弹栈后,常量会存在方法区的常量池
为什么局部内部类在访问他所在方法中的局部变量必须用final修饰?
因为当调用这个方法时,局部变量如果没有用final修饰,
他的生命周期和方法的生命周期是一样的,当方法弹栈,
这个局部变量也会消失,那么如果局部内部类对象还没有马
上消失想用这个局部变量,就没有了,如果用final修饰会在类加载
的时候进入常量池,即使方法弹栈,常量池的常量还在,也可以继续使用
注:但是jdk1.8取消了这个事情,所以我认为这是个bug,虽然取消,
但是如果在书写代码的时候,没有手动添加,系统底层也会默认给你final
匿名内部类就是内部类的简化写法(没有名字的内部类)
前提:必须存在在一个类或者接口
这里的类视具体类也可以是抽象类
格式
new 类名或者接口名(){
重写方法:
}
new一个类 ,就代表是继承这个接口,
而new一个接口,那就是实现这个接口
本质就是一个继承了该类或者实现了该接口的子类匿名对象
1 class Demo_NoNameInner { 2 public static void main(String[] args) { 3 Outer o = new Outer(); 4 o.method(); 5 } 6 } 7 8 interface Inter { 9 public void print(); 10 } 11 12 class Outer { 13 class Inner implements Inter { 14 public void print() { 15 System.out.println("哇哈哈"); 16 } 17 } 18 19 public void method() { 20 new Inner().print(); //这个其实跟以下的整一块差不多 21 new Inter() { //实现Inter接口 22 public void print() { //重写抽象方法 23 System.out.println("喵喵喵"); 24 } 25 }.print(); //调用子类对象里面的方法 26 //这一块整个代表Inter的子类对象 27 28 } 29 30 }