接口不是类
接口中都是静态常量,没有成员变量,接口的属性实际上被public static final 修饰,因为有static修饰所以可以用接口名直接调用
package cn.tedu.Inter2; //本类用于进一步测试接口的使用 public class TestUserInter { public static void main(String[] args) { System.out.println(UserInter.age); } } interface UserInter{ int age=10; } 运行结果: 10
接口中的方法都是抽象方法,没有普通方法,也没有构造方法;且接口中的方法可以省略public abstract
public abstract void eat(); void eat();
接口可以用多态的方法生成对象
package cn.tedu.inter; //本类用于接口测试 public interface Inter { public abstract void eat(); public abstract void play(); } package cn.tedu.inter; //本类是inter接口的实现类 public class InterImpl implements Inter{ @Override public void eat() { System.out.println("吃火锅"); } @Override public void play() { System.out.println("打代码"); } } public class InterTest { public static void main(String[] args) { Inter i=new InterImpl(); i.eat(); i.play(); } } 运行结果: 吃火锅 打代码
接口可以用接口实现类生成对象
package cn.tedu.inter; //本类用于接口测试 public interface Inter { public abstract void eat(); public abstract void play(); } package cn.tedu.inter; //本类是inter接口的实现类 public class InterImpl implements Inter{ @Override public void eat() { System.out.println("吃火锅"); } @Override public void play() { System.out.println("打代码"); } } public class InterTest { public static void main(String[] args) { InterImpl i1=new InterImpl(); i1.eat(); i1.play(); } } 运行结果: 吃火锅 打代码
接口实现类中有构造方法,父类为顶级父类object
接口和实现类建立关系后,有两种方案:
1.不实现接口中的抽象方法,将自己变成抽象类
abstract public class InterImpl implements Inter{}
2.实现接口中的所有抽象方法,将自己变成普通子类
public class InterImpl implements Inter{ @Override public void eat() { } @Override public void play() { } }
针对Java的类,一个类只能有一个父类,及单继承;但是一个类可以实现多个接口,及多实现\
接口是先天设计的结果,抽象是后天重构的结果
抽象类有构造方法,接口都没有构造方法,都不可以实例化
内部类对象的创建
package cn.tedu.innerclass; import cn.tedu.inter.Inter; //测试内部类的入门案例 public class TestInner1 { public static void main(String[] args) { //成员内部类对象的创建 Outer.Inner oi = new Outer().new Inner(); System.out.println(oi.sum); oi.delete(); } } class Outer{ String name; private int age; public void find(){ System.out.println("外部类...find()方法"); } //成员内部类...... class Inner{ int sum=10; public void delete(){ System.out.println("内部类的delete()方法"); } } } 运行结果: 10 内部类的delete()方法
内部类可以直接使用外部类的资源,包括私有资源
package cn.tedu.innerclass; import cn.tedu.inter.Inter; //测试内部类的入门案例 public class TestInner1 { public static void main(String[] args) { //成员内部类对象的创建 Outer.Inner oi = new Outer().new Inner(); System.out.println(oi.sum); oi.delete(); } } class Outer{ String name; private int age; public void find(){ System.out.println("外部类...find()方法"); } //成员内部类...... class Inner{ int sum=10; public void delete(){ System.out.println("内部类的delete()方法"); System.out.println(name); System.out.println(age); find(); } } } 运行结果: 10 内部类的delete()方法 null 0 外部类...find()方法
外部类可以通过创建对象调用内部资源
package cn.tedu.innerclass; import cn.tedu.inter.Inter; //测试内部类的入门案例 public class TestInner1 { public static void main(String[] args) { //成员内部类对象的创建 Outer.Inner oi = new Outer().new Inner(); System.out.println(oi.sum); oi.delete(); } } class Outer{ String name; private int age; public void find(){ System.out.println("外部类...find()方法"); //通过对象调用内部资源 Inner in=new Inner(); System.out.println(in.sum); in.delete(); } //成员内部类...... class Inner{ int sum=10; public void delete(){ System.out.println("内部类的delete()方法"); } } } 运行结果: 10 内部类的delete()方法
成员内部类被private修饰,可以创建外部类的对象,间接访问内部类的资源
package cn.tedu.innerclass; //本类测试成员内部类被private修饰 public class TestInner2 { public static void main(String[] args) { new Outer2().getInner2Eat(); } } class Outer2{ public void getInner2Eat(){ Inner2 in=new Inner2(); in.eat(); } private class Inner2{ public void eat(){ System.out.println("内部类的eat()方法"); } } } 运行结果: 内部类的eat()方法
成员内部类被static修饰时的调用
package cn.tedu.innerclass; //测试内部类被static修饰 public class TestInner3 { public static void main(String[] args) { Outer3.Inner3 oi = new Outer3.Inner3(); oi.show(); } } class Outer3{ static class Inner3{ public void show(){ System.out.println("内部类的show()方法"); } } } 运行结果: 内部类的show()方法
成员内部类和内部类中的方法被static修饰
package cn.tedu.innerclass; //测试内部类被static修饰 public class TestInner3 { public static void main(String[] args) { Outer3.Inner3.show2(); } } class Outer3{ static class Inner3{ public void show(){ System.out.println("内部类的show()方法"); } public static void show2(){ System.out.println("我是静态内部类的静态方法"); } } }
局部内部类的调用需要在局部内部类的下面
package cn.tedu.innerclass; import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput; //用来测试局部内部类 public class TestInner4 { public static void main(String[] args) { new Outer4().show(); } } class Outer4{ public void show(){ System.out.println("我是外部类的show()方法"); class inner4{ String name; int age; public void eat(){ System.out.println("我是局部内部类的eat()"); } } inner4 in = new inner4(); System.out.println(in.age); System.out.println(in.name); in.eat(); } } 运行结果: 我是外部类的show()方法 0 null 我是局部内部类的eat()
匿名内部类没有名字,通常与匿名对象结合在一起使用。匿名对象只能使用一次,一次只能调用一个功能
package cn.tedu.innerclass; //用于测试匿名内部类 public class TestInner5 { public static void main(String[] args) { new Inter1() { @Override public void save() { System.out.println("实现保存方法"); } @Override public void get() { } }.save(); new Inter2() { @Override public void eat() { System.out.println("eat()方法"); } }.eat(); new Inter3().study(); } } interface Inter1{ void save(); void get(); } abstract class Inter2{ public void play(){ System.out.println("玩代码"); } public abstract void eat(); } class Inter3{ public void drink(){ System.out.println("什么是快乐星球"); } public void study(){ System.out.println("学习赚钱"); } } 运行结果: 实现保存方法 eat()方法 学习赚钱