第五章 -- 类的修饰符和内部类

1:形式参数和返回值的问题(理解)

(1)形式参数:

类名:需要该类的对象

抽象类名:需要该类的子类对象

接口名:需要该接口的实现类对象

(2)返回值类型:

类名:返回的是该类的对象

抽象类名:返回的是该类的子类对象

接口名:返回的是该接口的实现类的对象

(3)链式编程

对象.方法1().方法2().......方法n();

这种用法:其实在方法1()调用完毕后,应该一个对象;

      方法2()调用完毕后,应该返回一个对象。

  方法n()调用完毕后,可能是对象,也可以不是对象。

 

2:(理解)

(1)其实就是文件夹

(2)作用:

A:区分同名的类

B:对类进行分类管理

a:按照功能分

b:按照模块分

(3)包的定义(掌握)

package 包名;

多级包用.分开。

(4)注意事项:(掌握)

A:package语句必须在文件中的第一条有效语句

B:在一个java文件中,只能有一个package

C:如果没有package,默认就是无包名

(5)带包的编译和运行

A:手动式

B:自动式(掌握)

javac -d . HelloWorld.java

3:导包(掌握)

(1)我们多次使用一个带包的类,非常的麻烦,这个时候,Java就提供了一个关键字import

(2)格式:

import 包名...类名;

另一种:

import 包名...*;(不建议)

(3)package,import,class的顺序

package > import > class

4:权限修饰符(掌握)

(1)权限修饰符

本类 同一个包下    不同包下的子类 不同包下的无关类

private Y

默认 Y   Y

Protected Y Y Y

public Y Y Y Y

(2)这四种权限修饰符在任意时刻只能出现一种。

public class Demo {}

 

例子:

--------------------------------------------------------------------------------

/*

    修饰符:

        权限修饰符:private,默认的,protected,public

        状态修饰符:static,final

        抽象修饰符:abstract

        

    类:

        权限修饰符:默认修饰符,public

        状态修饰符:final

        抽象修饰符:abstract

        

        用的最多的就是:public

        

    成员变量:

        权限修饰符: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

        

*/

//此处不允许使用修饰符private

//此处不允许使用修饰符protected

//此处不允许使用修饰符static

public class Demo {

    //成员变量

    private int x = 10;

    int y = 20;

    protected int z = 30;

    public int a = 40;

    public final int b = 50;

    public static int c = 60;

    public static final int d = 70;

    //此处不允许使用修饰符abstract

    //abstract int e = 80;

    

    //构造方法

    private Demo(){}

    

    Demo(String name){}

    

    protected Demo(String name,int age) {}

    

    public Demo(String name,int age,String address) {}

    

    //此处不允许使用修饰符static

    //public static Demo(){}

    //此处不允许使用修饰符final

    //public final Demo() {}

    //此处不允许使用修饰符abstract

    //public abstract Demo(){}

    

    //成员方法

    //static void show() {}

    //abstract void show();

    //final void show(){}

}

--------------------------------------------------------------------------------

5:常见的修饰符(理解)

(1)分类:

权限修饰符:private,默认,protected,public

状态修饰符:static,final

抽象修饰符:abstract

(2)常见的类及其组成的修饰

类:

默认,public,final,abstract

常用的:public

成员变量:

private,默认,protected,public,static,final

常用的:private

构造方法:

private,默认,protected,public

常用的:public

成员方法:

private,默认,protected,public,static,final,abstract

常用的:public

(3)另外比较常见的:

public static final int X = 10;

public static void show() {}

public final void show() {}

public abstract void show();

 

6:内部类(理解)

(1)把类定义在另一个类的内部,该类就被称为内部类。

举例:把类B定义在类A中,类B就被称为内部类。

(2)内部类的访问规则

A:可以直接访问外部类的成员,包括私有

B:外部类要想访问内部类成员,必须创建对象

(3)内部类的分类

A:成员内部类

B:局部内部类

(4)成员内部类的访问方式

A:private 为了数据的安全性

--------------------------------------------------------------------------------

案例:我有一个人(人有身体,身体内有心脏。)

class Body {

private class Heart {

public void operator() {

System.out.println("心脏搭桥");

}

}

 

public void method() {

if (如果你是外科医生) {

Heart h = new Heart();

h.operator();

}

}

}

 

按照我们刚才的讲解,来使用一下

Body.Heart bh = new Body().new Heart();

bh.operator();

//加了private后,就不能被访问了,那么,怎么玩呢?

Body b = new Body();

b.method();

--------------------------------------------------------------------------------

 

B:static 为了访问的方便性

--------------------------------------------------------------------------------

class Outer {

    private int num = 10;

    private static int num2 = 100;

    

    //内部类用静态修饰是因为内部类可以看出是外部类的成员

    public static class Inner {

        public void show() {

            //System.out.println(num);

            System.out.println(num2);

        }

 

        public static void show2() {

            //System.out.println(num);

            System.out.println(num2);

        }       

    }

}

 

class InnerClassDemo4 {

    public static void main(String[] args) {

        //使用内部类

        // 限定的新静态类

        //Outer.Inner oi = new Outer().new Inner();

        //oi.show();

        //oi.show2();

        

        //成员内部类被静态修饰后的访问方式是:

        //格式:外部类名.内部类名 对象名 = new 外部类名.内部类名();

        Outer.Inner oi = new Outer.Inner();

        oi.show();

        oi.show2();

        

        //show2()的另一种调用方式

        Outer.Inner.show2();

    }

}

--------------------------------------------------------------------------------

成员内部类不是静态的:

外部类名.内部类名 对象名 = new 外部类名.new 内部类名();

成员内部类是静态的:

外部类名.内部类名 对象名 = new 外部类名.内部类名();

 

(5)成员内部类的面试题(填空)

面试题:

要求请填空分别输出 30,20,10

注意内部类和外部类没有继承关系

--------------------------------------------------------------------------------

 

class Outer {

            public int num = 10;

            class Inner {

                public int num = 20;

                public viod show() {

                    int num = 30;

                    System.out.println(num);

                    System.out.println(this.num);

                    System.out.println(Outer.this.num);

      //System.out.println(new Output.num);

                }

            }

        }

 

--------------------------------------------------------------------------------

(6)局部内部类  面试题

A:局部内部类访问局部变量必须加final修饰。

 

B:为什么呢?

因为局部变量使用完毕就消失,而堆内存的数据并不会立即消失。

所以,堆内存还是用该变量,而改变量已经没有了。

为了让该值还存在,就加final修饰。

通过反编译工具我们看到了,加入final后,堆内存直接存储的是值,而不是变量名。

局部内部类也是在堆中的声明周期长所以访问外部变量需要将外部的变量修饰成final 常量

 

(7)匿名内部类(掌握)

 

A:是局部内部类的简化形式

B:前提

存在一个类或者接口

C:格式:

new 类名或者接口名() {

重写方法;

}

D:本质:

其实是继承该类或者实现接口的子类匿名对象

 

(8)匿名内部类在开发中的使用

 

我们在开发的时候,会看到抽象类,或者接口作为参数。

而这个时候,我们知道实际需要的是一个子类对象。

如果该方法仅仅调用一次,我们就可以使用匿名内部类的格式简化。

--------------------------------------------------------------------------------

 

        interface Person {

            public abstract void study();

        }

        

        class PersonDemo {

            public void method(Person p) {

                p.study();

            }

        }

        

        class PersonTest {

            public static void main(String[] args) {

                PersonDemo pd = new PersonDemo();

                pd.method(new Person() {

                    public void study() {

                        System.out.println("好好学习,天天向上");

                    }

                });

            }

        }

--------------------------------------------------------------------------------

(9)匿名内部类的面试题(补齐代码)

--------------------------------------------------------------------------------

        interface Inter {

            void show();

        }

        

        class Outer {

            //补齐代码

            public static Inter method() {

                return new Inter() {

                    public void show() {

                        System.out.println("HelloWorld");

                    }   

                };

            }

        }

        

        class OuterDemo {

            public static void main(String[] args) {

                Outer.method().show(); //"HelloWorld"

            }

    }

--------------------------------------------------------------------------------

/*

Test类,测试

 

导包:

格式:import 包名;

这种方式导入是到类的名称。

注意:我们用谁就导谁。

面试题:

package,import,class有没有顺序关系?

有。

package > import > class

Package:只能有一个

import:可以有多个

class:可以有多个,以后建议是一个

*/

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值