Java学习笔记3

2018-10-28  本文已影响0人  海洋_5ad4

package关键字的概述及作用

        方案1:按照功能分
            com.heima.add
                AddStudent
                AddTeacher
            com.heima.delete
                DeleteStudent
                DeleteTeacher
            com.heima.update
                UpdateStudent
                UpdateTeacher
            com.heima.find
                FindStudent
                FindTeacher
        
        方案2:按照模块分
            com.heima.teacher
                AddTeacher
                DeleteTeacher
                UpdateTeacher
                FindTeacher
            com.heima.student
                AddStudent
                DeleteStudent
                UpdateStudent
                FindStudent

包的定义及注意事项

带包的类编译和运行

import关键字的概述和使用

四种权限修饰符的测试

                    本类   同一个包下(子类和无关类)  不同包下(子类)    不同包下(无关类)
        private             Y       
        默认          Y       Y
        protected           Y       Y                           Y
        public      Y       Y                           Y               Y

类及其组成所使用的常见修饰符

内部类概述和访问特点

A:内部类概述

class Demo1_InnerClass {
    public static void main(String[] args) {
        //Inner i = new Inner();
        //i.method();
        Outer.Inner oi = new Outer().new Inner();   //创建内部类对象
        oi.method();
    }
}

class Outer {
    class Inner {
        public void method() {
            System.out.println("Hello World!");
        }
    }
}
class Demo1_InnerClass {
    public static void main(String[] args) {
        //Inner i = new Inner();
        //i.method();
        //Outer.Inner oi = new Outer().new Inner();   //创建内部类对象
        //oi.method();
        Outer o = new Outer();
        o.print();
    }
}

class Outer {
    private int num = 10;
    private class Inner {
        public void method() {
            System.out.println(num);
        }
    }

    public void print() {
        Inner i = new Inner();
        i.method();
    }

}

静态成员内部类

class Demo1_InnerClass {
    public static void main(String[] args) {
        Outer.Inner oi = new Outer.Inner();
        oi.method();
        Outer.Inner2.print();
    }
}

class Outer {
    static class Inner {
        public void method() {
            System.out.println("method");
        }
    }

    static class Inner2 {
        public static void print() {
            System.out.println("print");
        }
    }
}
class Test_Innerclass {
    public static void main(String[] args) {
        Outer.Inner oi = new Outer().new Inner();
        oi.show();
    }
}
//要求:使用已知的变量,在控制台输出30,20,10。
//内部类之所以能获得到外部类的成员,是因为他能获取到外部类的引用 外部类名.this
class Outer {
    public int num = 10;
    class Inner {
        public int num = 20;
        public void show() {
            int num = 30;
            System.out.println(num);
            System.out.println(this.num);
            System.out.println(Outer.this.num);
        }
    }
}

局部内部类访问局部变量的问题

class Demo1_InnerClass {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.method();
    }
}
//局部内部类
class Outer {
    public void method() {
        final int num = 10;
        class Inner {
            public void print() {
                System.out.println("num");
            }
        }

        Inner i = new Inner();
        i.print();
    }

    /*public void run() {
        Inner i = new Inner();   //局部内部类,只能在其所在的方法中访问
        i.print();
    }*/
}
局部内部类.jpg

匿名内部类的格式和理解

A:匿名内部类
* 就是内部类的简化写法。

        new 类名或者接口名(){
            重写方法;
        }
class Demo1_NoNameInnerClass {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.method();
    }
}

interface Inter {
    public void print();
}

class Outer {
    /*class Inner implements Inter {
        public void print() {
            System.out.println("print");
        }
    }*/

    public void method() {
        //Inner i = new Inner();
        //i.print();

        new Inter() {               //实现Inter接口
            public void print() {   //重写抽象方法
                System.out.println("print");
            }
        }.print();
    }
}

匿名内部类重写多个方法调用

class Demo2_NoNameInnerClass {
    public static void main(String[] args) {
        Outer o = new Outer();
        o.method();
    }
}
//匿名内部类只针对重写一个方法时候使用
interface Inter {
    public void show1();
    public void show2();
}

class Outer {
    public void method() {
        /*new Inter(){
            public void show1() {
                System.out.println("show1");
            }

            public void show2() {
                System.out.println("show2");
            }
        }.show1();
        new Inter(){
            public void show1() {
                System.out.println("show1");
            }

            public void show2() {
                System.out.println("show2");
            }
        }.show2();*/
        Inter i = new Inter(){
            public void show1() {
                System.out.println("show1");
            }

            public void show2() {
                System.out.println("show2");
            }

            public void show3() {
                System.out.println("show3");
            }
        };//父类引用指向子类对象,不能调用子类特有方法,这里是show3()

        i.show1();
        i.show2();
        //i.show3();    //匿名内部类是不能向下转型的,因为没有子类类名
    }
}

匿名内部类在开发中的应用

class Test1_NoNameInnerClass {
    public static void main(String[] args) {
        //如何调用PersonDemo中的method方法?
        PersonDemo pd = new PersonDemo();
        //pd.method(new Student()); //1,通过继承实现
        pd.method(new Person(){
            public void show() {
                System.out.println("show");
            }
        });         //2,匿名内部类当作参数传递(本质把匿名内部类看作一个子类对象)
    }
}
//这里写抽象类,接口都行
abstract class Person {
    public abstract void show();
}
/*
可以这样理解
一个没有创建的子类 一个没有创建的变量 = new Person(){ //父类引用指向子类对象
            public void show() {    //重写了抽象方法
                System.out.println("show");
            }
        }); 
*/
class PersonDemo {
    public void method(Person p) {
        p.show();
    }
}

class Student extends Person {
    public void show() {
        System.out.println("show");
    }
}

匿名内部类的面试题

class Test2_NoNameInnerClass {
    public static void main(String[] args) {
        Outer.method().show();  //链式编程,每次调用方法后还能继续调用方法,证明返回的是对象
    }
}
//按照要求,补齐代码
interface Inter {
    void show();
}

class Outer {
    //补齐代码
    public static Inter method() {
        return new Inter() {
            public void show() {
                System.out.println("HelloWorld");
            }
        };
    }
}

//要求在控制台输出"HelloWorld"
上一篇 下一篇

猜你喜欢

热点阅读