【Java】Java面向对象

来源:互联网 发布:淘宝什么店铺女装好看 编辑:程序博客网 时间:2024/05/04 06:59
//=================面向对象知识======================public class OOBase {private static final long LEVEL = 20150701;/* * 使用继承时父类成员将被子类继承,如子类中未定义同名变量,父子类将共享该成员。 * 此时super和this访问的是内层中的同一个变量 * 只有子类覆盖父类成员时,super和this才访问不同变量。 * 注意:只要有使用父类成员的情况都应明确指定super或this * 防止出现后期添加变量时时出现命名分歧 */@Testpublic void test2() {Eg_2 eg_2 = new Eg_2_1();eg_2.print();}class Eg_2 {int a = 1;int b = 2;public void print() {}}class Eg_2_1 extends Eg_2 {int a = 3;public void print() {System.out.println(super.a == this.a);// falseSystem.out.println(super.b == this.b);// true}}/* * static变量的调用要看类型,而不是看对象 */// @Testpublic void test3() {FOO foo = new FOO();Sub sub = new Sub();System.out.print(FOO.FOO);// fooSystem.out.print(Sub.FOO);// subSystem.out.print(foo.FOO);// fooSystem.out.print(sub.FOO);// subSystem.out.print(((FOO) sub).FOO);// foo}class FOO {public static final String FOO = "foo";}class Sub extends FOO {public static final String FOO = "sub";}/** * 接口中可以定义静态内部类 */interface MyInterface {static class Inner {int i, j, k;public Inner() {}void f() {}}}}/* * 继承内部类 */class WithInner {abstract class Inner {abstract void f();}}class InheritInner extends WithInner.Inner {// ! InheritInner() {} // Won't compile// 构造器必须使用这样的语法去显示的调用外部类的构造方法InheritInner(WithInner wi) {wi.super();}public static void main(String[] args) {WithInner wi = new WithInner();InheritInner ii = new InheritInner(wi);}@Overridevoid f() {}}// 如果重写方法的返回值类型是基本数据类型,那么返回值类型必须相同class AA {protected Number method(int a, int b) {return 2;}}class CC extends AA {public Integer method(int a, int b) {short s = 1;return 1;}}class AAA {protected int method(int a, int b) {return 2;}}class CCC extends AAA {public int method(int a, int b) {// 返回值类型为short则报错,只要不同就报错short s = 1;return 1;}}/** * 创建过程描述: * 1、加载Son类字节码文件,为其实例变量i开辟空间(开辟空间就可以为其赋值为默认值,原因见二进制示例)并不会为其赋值2 * 2、判断Son是否有父类,没有则调用Son的构造方法,为其实例变量赋值并执行其他初始化代码 * 3、如果有父类,则按照1-2的步骤初始化其父类,其父类再有父类仍按照该步骤执行 * 程序输出:0 2 3   输出0的原因:注意this真正所指代的对象,如果把所有默认的this都加上,就会明白(详见程序中注释) * @author soft01 * */class Son extends Parent {int i = 2;//1、i = 0Print a = new Print("子类参数初始化");public Son() {//2、this.super();//5、i=2;Print a = new Print("子类构造函数");this.print();i = 3;}void print() {System.out.println("子类方法调用");System.out.println(i);}public static void main(String[] args) {System.out.println(new Son().i);}}class Parent {int j = 4;//3、j= 0Print a = new Print("父类参数初始化");public Parent() {//4、j=4Print a = new Print("父类构造函数");/*  * 由于第二步,调用对象为Son,这里的this也为Son, * 所以调用了Son中的方法,而这一时刻Son的i还未赋值2,其值为0 */this.print();int j = 5;}void print() { System.out.println("父类方法调用"); System.out.println(j);}}class Print {public Print(String i) {System.out.println(i);}}/* * 方法中的语句一定是按照顺序执行的 */class Try{@Testpublic void test(){new Beta().testFoo();}}interface Foo {int bar();}class Beta {class A implements Foo {public int bar() {return 1;}}public int fubar(Foo foo) {return foo.bar();}public void testFoo() {// 这里下面的类A还没有加载,所以创建的是上面类A的对象A a  = new A();System.out.println(a.bar());//输出:1 class A implements Foo {public int bar() {return 2;}}System.out.println(fubar(new A()));//输出:2 就近原则,使用最近的内部类}}

0 0
原创粉丝点击