JAVA学习记录day4

今日主要内容:包,修饰符总结,内部类

所谓包,可以说就是一个文件夹。通过定义包,可以管理字节码文件,也产生了不同的访问权限。
包的定义:在源文件的第一个可执行语句中用package 声明。一般通过域名的反写命名,如package com.gdut.java;
在定义的包之后,在控制台执行编译的语句也发生了变化,在源文件所在目录下打开控制台输入javac -d . filename.java,运行则要输入文件的全名,即要包括包名
java com.gdut.java.filename
包的产生,也产生了protected访问权限。说到访问权限,之前说private是对类的封装,因为限制了其他类访问该类内部成员的方式。但并不是说封装就是private,而只能说private是封装的一种形式,封装是相对的,在不同包下,用默认权限修饰符修饰的类就不允许其他包的类对其访问,也是一种封装形式。
视频中老师说了一个例子,生动形象hhhhh,教室的学生要访问他的钱包是不允许的,这是违法,他的钱包对学生就是封装的,当他回到家,他老婆要访问他的钱包是可以的,不然就是作死,他的钱包对他老婆就不是封装的,所以说封装是相对的。

修饰符总结

权限修饰符权限表

修饰符 本类 同一报下(子类与无关类) 不同包下(子类) 不同包下(无关类)
private Y
(默认) Y Y
protected Y Y Y
public Y Y Y Y
  • 修饰符
  • 权限修饰符:private,默认,protected,public
  • 状态修饰符:final,static
  • 抽象修饰符:abstract
  • 权限修饰符:默认,public
  • 状态修饰符:final
  • 抽象修饰符:abstract
  • 成员变量
  • 权限修饰符:private,默认,protected,public
  • 状态修饰符:final,static
  • 构造方法
  • 权限修饰符:private,默认,protected,public
  • 成员方法
  • 权限修饰符:private,默认,protected,public
  • 状态修饰符:final,static
  • 抽象修饰符:abstract

内部类

内部类,顾名思义就是定义在类内部的类。按照内部类所在的区域可以分为成员内部类和局部内部类。局部内部类就是定义在方法中的内部类。

  • 成员内部类
    内部类可以直接访问外部类的变量,包括私有变量,但外部类要访问内部类成员必须要创建对象
    其他类创建内部类对象的方法:外部类名.内部类名 = new 外部类名() .new 内部类名();其实,只要把内部类当做外部类的成员就很好理解,new 外部类名()就是创建外部类对象,用点表示引用其成员,由于该成员是个类,所以要创建对象,new 内部类名();于是上面的语句可以理解为外部类名.内部类名 = 外部类对象.内部类对象
class Demo_InnerClass {
    public static void main(String[] args) {
        //外部类名.内部类名 = 外部类对象.内部类对象
        Outer.Inner io = new Outer().new Inner();   
        io.print();                                 
        new Outer().new Inner().print();            //匿名引用
    }
}
class Outer{
    private int num = 10;                   //外部类要访问内部类成员必须创建对象
    class Inner{
        public void print(){
            System.out.println(num);        //内部可以访问外部类成员变量,即使私有
        }   
    }
}
  • 静态内部类
class Outer{
          private int num = 10;                 
          static class Inner2{                  //静态成员内部类
                 public void print(){
                 System.out.println("inner2");
           }
    }

在创建静态内部类对象时,不用创建外部类对象,即Inner i =Outer.new Inner2();
但由于书写习惯,编译器不允许这样的语句,要将new提前,于是变成
Inner i =new Outer.Inner2()

  • 局部内部类
    局部内部类与普通内部类大致相同,但有一个应特别注意的地方,内部类所在方法的局部变量必须用final修饰,即要变成常量,否则编译会报错,但在jdk1.8版本中取消了该机制,个人理解这应该是个bug。采用这种机制的原因如下:
    当调用这个方法时,不用final修饰,局部变量的声明周期和该方法时一致的,当方法弹栈,这个局部变量也会消失,如果局部内部类对象没有马上消失,仍想调用该局部变量,该局部变量就没有了,用final修饰的变量会进入常量池,即使方法弹栈,常量池中的变量依然存在,仍然可以使用。
    通过内存图理解这一原因


    局部内部类内存图

    练习代码

class Demo_InnerClass3 {                        //局部内部类(方法内部类)
    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();
    }
}
  • 匿名内部类
    可能很多人在匿名内部类这里会很晕。其实,只要看到它的实质就很容易理解他的用法。他的实质就是将:1、创建一个类继承或实现某接口2、重写其抽象方法3、创建对象 三个步骤融合到一个语句中进行简化。本质是一个继承了该类或者实现了该接口的子类匿名对象
    从上面的本质也看出了其存在的前提:在一个方法内,有可以继承的父类或可以实现的接口。
    从下面的题目理解
class Demo_NonameClass2 {
    public static void main(String[] args) {
        //如何调用PersonDemo中的method方法
        PersonDemo pd = new PersonDemo();
        }
}
abstract class Person{
    public abstract void show();
}
class PersonDemo{
    public void method(Person p){       //父类引用指向子类对象
        p.show();
    }
}

题目中要求用Person为参数,但Person是接口,无法创造实例,只能通过创建他的子类来实现。
方法一:创建有名字的类,实现Person接口,重写里面的show()方法,再创建该类的对象作为参数传入pd中的method方法。创建了Student类实现接口,创建Student类作为method的方法。

class Demo_NonameClass2 {
    public static void main(String[] args) {
        //如何调用PersonDemo中的method方法
        PersonDemo pd = new PersonDemo();
        //写有名字的类
        pd.method(new Student());               //showname
        }
}
abstract class Person{
    public abstract void show();
}
class PersonDemo{
    public void method(Person p){       //父类应用指向子类对象
        p.show();
    }
}
class Student extends Person{
    public void show(){
        System.out.println("showname");
    }
}

方法而:通过匿名内部类,省略创建一个新的有名字的类的过程。

class Demo_NonameClass2 {
    public static void main(String[] args) {
        //如何调用PersonDemo中的method方法
        PersonDemo pd = new PersonDemo();
        //用匿名内部类
        pd.method(new Person(){                 //匿名内部类当做参数传递           
            public void show (){
                System.out.println("shownoname"); //showname
            }
        });
    }
}
abstract class Person{
    public abstract void show();
}

new Person()可以看做是创建一个匿名的Person的接口并创建对象,之后的大括号就是对接口的实现,即重写方法。就省略了创建新类的过程。

  • 弊端:上面的例子看到了匿名内部的好处,但也是有弊端的,就是显然,每次使用匿名内部类要重写全部的抽象方法,当其继承的类或者接口的抽象方法很多时,直接写有名的类效率更高。而且,由于匿名内部类没有名字,不能进行向下转型,故无法调用其特有的方法。

到目前为止大致学完了JAVA有关面向对象的所有概念,接下来转向JAVA标准类库用法的学习,即API的学习。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,873评论 4 370
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,483评论 1 306
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,525评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,595评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,018评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,958评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,118评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,873评论 0 208
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,643评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,813评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,293评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,615评论 3 262
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,306评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,170评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,968评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,107评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,894评论 2 278

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,298评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,111评论 18 139
  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,584评论 0 11
  • Advanced Language Features 知识点:一. static修饰符 static修饰符可以用来...
    风景凉阅读 391评论 0 0
  • 刻开始
    我家耿宝阅读 119评论 0 0