【Java学习】代码块|内部类|继承|多态

心得感悟

感觉今天仍然是需要多加理解的一天,不过经过一次布置的程序编写作业后,自己的理解加深了。我自己也有在网上各种搜索,多看别人的文章,看看别人的理解,几百个答案里面总会有一个是让人满意的。


1.目的

  • 一、了解代码块的用法
  • 二、了解内部类的用法
  • 三、了解继承的用法
  • 四、了解多态的用法

2.内容简概

  • 一、代码块的定义及用法
  • 二、静态内部类的定义及用法
  • 三、静态内部类改成普通内部类
  • 四、普通内部类的使用
  • 五、继承的定义及用法
  • 六、多态的定义及用法

3.具体内容

  • 一、代码块的定义及用法

1. 定义:
代码块是一种常见的代码形式,即用大括号“{}”将多行代码封装在一起,形成一个独立的代码区。

2. 为什么要用代码块?
当我们想在创建一个对象之前先做点准备工作,我们可以使用构造函数、静态变量或者静态方法,除此之外,我们还可以使用代码块,代码块会在对象创建之前就优先被调用。

3. 代码块的类型
(1)静态代码块:指用static关键字修饰的代码块,方法中不能存在静态代码块
(2)构造代码块:直接写在类中的代码块
(3)普通代码块:直接写在方法体中的代码块

4.执行顺序:静态代码块>构造代码块>构造方法>普通代码块
 同类型的代码块若出现多次,则按出现的先后顺序执行

5. 代码块和构造方法的书写格式
  (修饰符){
    预先执行的内容
   }

(1)静态代码块
静态代码块里面不能调用成员变量和实例方法,且只运行一次。

static {
        System.out.println("静态代码块");
}

(2)构造代码块
构造代码块在创建对象时被调用,每次创建对象都会调用一次(和静态代码块的区别是少了static修饰)

{
        System.out.println("构造代码块");
}

(3)普通代码块
普通代码块最常见,即在方法中用{}括起来的代码的集合。

class Person{
    public void Student(){
            System.out.println("普通代码块");
    }
}

(4)构造方法
构造函数的命名必须和类名完全相同,它没有返回值,也不能用void来修饰。构造函数不能被直接调用,必须通过new运算符在创建对象时才会自动调用。

class Person{
    public Person(){
            System.out.println("无参构造方法");
     }
}
  • 二、静态内部类的定义及用法

1. 什么是静态内部类?
Java语言允许在类中再定义类,这种在其它类内部定义的类就叫内部类。而静态内部类就是用static修饰的内部类。

2. 什么时候用内部类?
当我们想把一个类的部分功能抽离除来,但是抽出来后,程序的可读性又变差了,这时候我们就需要内部类来解决这种情况。

3. 静态内部类的编写
在此,我们写一个管理界面视图的类,在界面中各个图标的相对位置的计算是比较复杂的,故我们可以把它抽出来成为内部类。

class RelativeLayout{
    String view;
    LayoutParams layoutParams;//存视图方法一

   //在显示这个视图前,必须告诉系统这个视图的具体位置
    public void show(LayoutParams layout){
        System.out.println("视图"+view+"显示出来了");
        System.out.println("left:"+layout.leftMergin+"top:"+layout.topMergin+"right:"+layout.rightMergin+"botton"+layout.bottonMergin);}

    //定义一个内部类 用于管理相对布局的具体布局属性
    public static class LayoutParams{
        float leftMergin;
        float topMergin;
        float rightMergin;
        float bottonMergin;

        public  LayoutParams(float leftMergin,float topMergin,float rightMergin,float bottonMergin){
            this.leftMergin = leftMergin;
            this.topMergin = topMergin;
            this.rightMergin = rightMergin;
            this.bottonMergin = bottonMergin;
        }
    }
}
//外部调用
class testLayout{
   public static void main(String[] args){
       //创建一个相对布局 容器视图
       RelativeLayout rl = new RelativeLayout();

       rl.view = "分享按钮";

        //显示这个视图
        //使用匿名对象 只需要使用一次
        rl.show(new RelativeLayout.LayoutParams(1,2,3,4));

        System.out.println();

        TestInner ti = new TestInner();
        ti.test();
   }
}
  • 三、静态内部类改成普通内部类

1. 为什么要改成普通内部类?
内部类其实主要就是给内部使用的,如果要给外部使用,就用static修饰,但是若加上有时倒不如直接写出来,定义成内部类反而不利于外部的使用了。

2. 如何操作?
这里的LayoutParams类和上面的相比,上面的布局对象是外部创建的,而这里是内部创建的,只提供给内部使用,封装性更好。

class RelativeLayout{
    String view;
    LayoutParams layoutParams;
    
    public void show(float left,float top,float right,float botton){
        layoutParams = new LayoutParams(left,top,right,botton);
        System.out.println("视图"+view+"显示出来了");
        System.out.println("left:"+left+"top:"+top+"right:"+right+"botton"+botton);
    }

    //定义一个内部类 用于管理相对布局的具体布局属性
    public class LayoutParams{
        float leftMergin;
        float topMergin;
        float rightMergin;
        float bottonMergin;

        public  LayoutParams(float leftMergin,float topMergin,float rightMergin,float bottonMergin){
            this.leftMergin = leftMergin;
            this.topMergin = topMergin;
            this.rightMergin = rightMergin;
            this.bottonMergin = bottonMergin;
        }
    }
}

class testLayout{
   public static void main(String[] args){
       //创建一个相对布局 容器视图
       RelativeLayout rl = new RelativeLayout();

       rl.view = "分享按钮";
       rl.show(20,20,20,20);

        System.out.println();

        TestInner ti = new TestInner();
        ti.test();
   }
}
  • 四、普通内部类的使用

1.普通内部类和静态内部类的区别
普通内部类在非静态类内部可以访问外部类的成员,而静态内部类不能访问外面的方法和成员。下面为普通内部类的使用例子:

class TestInner{
    int a;
    static int b;
    Inner inner;

    class Inner{
        //非静态的内部类 可以访问外部类的属性和方法
        public Inner(){
            a = 20;
            b = 30;
            show();
        }
    }
    public void test(){
        inner = new Inner();
    }

    public void show(){
        System.out.println("a = "+ a +"b = "+ b);
    }
}

  • 五、继承的定义及用法

1. 定义
继承就是子类继承父类的对象和方法

2. 什么时候用继承?
当你想要获得父类的方法和属性,并且需要添加自己的属性和方法时,用继承可以简化程序的编写。

3. 类的继承书写格式
class 父类 {
}
class 子类 extends 父类 {
}

4. 继承的一些关键字
虽然Java中只能单继承,但我们可以变相地多继承,即使A继承B,C继承B,D继承C,实际上他们都是在继承A(若不添加其他属性和方法)

关键字 作用
extends 继承,一个子类只能拥有一个父类
this 指向自己的引用
super 实现对父类成员的访问,用来引用当前对象的父类。
final 可以把类定义为不能继承的,即最终类,不能被子类重写。

5. 继承的实例
下面就来举一个实际的例子,我们定义一个Person类,而学生、老师等都属于Person,即编写学生、老师的类时,可以继承Person类。首先,我们先编写一个父类Person,定义一些基本的属性个方法。

class Person {
    public String name;
    protected int age;

    public  Person(String name,int age){
        this.name = name;
        this.age = age;
    }

    public void walk() {
        System.out.println(name+":人走路");
    }

    public void eat() {
        System.out.println(name+":人吃饭");
    }
}

然后我们再来编写子类Student。额外的属性用this关键字修饰。

class Student extends Person{
    int id;
    String school;

    public  Student(String name,int age,int id,String school){
        super(name,age);
        //额外的属性
        this.id = id;
        this.school = school;
    }
    public void show() {
        System.out.println("name:"+name);
    }

    //方法的重写
    @Override
    public void walk(){
        super.walk();
        System.out.println("学生优雅地走路");
    }

    @Override
    public void eat(){
        System.out.println("学生小口吃饭");
    }
    //打印的方法二
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", id=" + id +
                ", school='" + school + '\'' +
                '}';
    }
}

  • 六、多态的定义及用法

1. 定义
即同一个方法不同的实现,或者说在不同的子类中,有不同的实现。

2. 多态的使用
如果有继承关系:子类的对象可以使用父类变量接收。结合下面的输出理解。

class TestExtends{
    public static void main(String[] args){
        C testc = new C();
        A testc2 = new C();
        //上面两种输出均为“in C”
        testc2.info();
    }
}
class A{
    public void info()
    {
        System.out.println("in A");
    }
}

class B extends A{
    @Override
    public void info(){
        System.out.println("in B");
    }
}
class C extends A{
    @Override
    public void info(){
        System.out.println("in C");
    }
}

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

推荐阅读更多精彩内容