<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      今日內(nèi)容

      • 面向?qū)ο髲?fù)習(xí)
        • 類的創(chuàng)建------>必須掌握
        • 對(duì)象的創(chuàng)建和使用------>必須掌握
        • 匿名對(duì)象
      • 繼承
        • 如何繼承---繼承的格式------>必須掌握
        • 繼承之后成員的訪問(wèn)特點(diǎn)------>必須掌握
        • 方法重寫以及this和super關(guān)鍵字------>理解并會(huì)使用
      • 抽象類
        • 定義抽象類------>必須掌握
        • 抽象方法的定義和使用------>必須掌握
        • 模板設(shè)計(jì)模式------>必須掌握
      • final 關(guān)鍵字
        • 修飾類格式和特點(diǎn)
        • 修飾方法格式和特點(diǎn)
        • 修飾變量格式和特點(diǎn)------>必須掌握

      第1章 復(fù)習(xí)回顧

      1.1 類和對(duì)象

      定義一個(gè)類

      • 格式:

        修飾符 class 類名{
            // 成員變量
            // 成員方法
            // 構(gòu)造方法
            // 代碼塊
            // 內(nèi)部類
        }
        
      • 代碼:

        public class Person {
            // 成員變量
            private String name;
            private int age;
        
            // 構(gòu)造方法
            public Person(String name, int age) {
                this.name = name;
                this.age = age;
            }
        
            public Person() {
            }
        
            // 成員方法
            public String getName() {
                return name;
            }
        
            public void setName(String name) {
                this.name = name;
            }
        
            public int getAge() {
                return age;
            }
        
            public void setAge(int age) {
                this.age = age;
            }
        
            public void show(){
                System.out.println(name+","+age);
            }
        }
        

      創(chuàng)建并使用對(duì)象

      • 格式:

        創(chuàng)建對(duì)象: 類名 對(duì)象名 = new 類名(實(shí)參);
        使用對(duì)象:
        	訪問(wèn)成員變量: 對(duì)象名.成員變量名
        	訪問(wèn)成員方法:
        		無(wú)返回值的方法: 對(duì)象名.方法名(實(shí)參);
        		有返回值的方法:
        			直接調(diào)用: 對(duì)象名.方法名(實(shí)參);
        			賦值調(diào)用: 數(shù)據(jù)類型 變量名 = 對(duì)象名.方法名(實(shí)參);
        			輸出調(diào)用: System.out.println(對(duì)象名.方法名(實(shí)參));
        
      • 代碼:

        public class Test {
            public static void main(String[] args) {
                // 通過(guò)調(diào)用空參構(gòu)造方法,創(chuàng)建Person類的對(duì)象
                Person p1 = new Person();
        
                // 通過(guò)調(diào)用滿參構(gòu)造方法,創(chuàng)建Person類的對(duì)象
                Person p2 = new Person("李四", 19);
        
                // 使用p1對(duì)象調(diào)用方法
                p1.setName("張三");
                p1.setAge(18);
                String name = p1.getName();
                System.out.println("姓名:" + name);
                System.out.println("年齡:" + p1.getAge());
        
                // 使用p2調(diào)用show方法
                p2.show();
        
            }
        }
        
        

      1.2 對(duì)象的內(nèi)存圖

      畫圖依據(jù)

      - 只要是new對(duì)象就會(huì)在堆區(qū)開(kāi)辟一塊獨(dú)立的空間
      - 只要調(diào)用方法,方法就會(huì)被加載進(jìn)棧
      - 只要方法執(zhí)行完畢,方法就會(huì)被彈棧
      - 方法執(zhí)行的流程: 調(diào)用方法-->加載方法到棧區(qū)-->聲明形參-->把實(shí)參傳遞給形參--->執(zhí)行方法體-->結(jié)束方法,彈棧
      

      內(nèi)存圖

      image-20210729102934434

      1.3 匿名對(duì)象

      概述

      • 概述:匿名對(duì)象指的就是沒(méi)有名字的對(duì)象.
      • 特點(diǎn): 只能使用一次

      使用

      
      import com.itheima.demo1_復(fù)習(xí)類的定義和對(duì)象的使用.Person;
      
      public class Test {
          public static void main(String[] args) {
              /*
                  - 概述:匿名對(duì)象指的就是沒(méi)有名字的對(duì)象.
                  - 特點(diǎn): 只能使用一次
                  - 使用: 如果某個(gè)類的對(duì)象只要使用一次,就可以使用匿名對(duì)象
               */
              // 創(chuàng)建Person對(duì)象---有名字
              Person p1 = new Person("張三",18);
              p1.show();
      
              System.out.println("-------------------");
      
              // 匿名對(duì)象
              new Person("李四",19).show();
              new Person("李四",19).show();
              // 這是2個(gè)不同的對(duì)象,只是所有屬性值一樣,因?yàn)橹灰猲ew就會(huì)在堆區(qū)開(kāi)辟一塊空間創(chuàng)建該對(duì)象
      
              System.out.println("-------------------");
              // 調(diào)用method方法
              //以前的方式---使用有名字的對(duì)象
              //Person p2 = new Person("老王",20);
              //method(p2);
      
              //現(xiàn)在的方式----使用匿名對(duì)象
              method(new Person("老王",20));
      
          }
      
          public static void method(Person p){
              p.show();
          }
      
      }
      
      

      第2章 繼承

      2.1 繼承概述

      為什么要有繼承

      • 生活中為什么要有繼承

      • 程序中為什么還要有繼承

        image-20210729110743973

      繼承的概述

      • 繼承在java中指的是“一個(gè)類”可以“繼承自”“另一個(gè)類”。 "被繼承的類"叫做: 父類/超類/基類,"繼承其他類的類"叫做:子類。繼承后,“子類”中就“擁有”了“父類”中所有的成員(成員變量、成員方法)。 “子類就不需要再定義了”。

      繼承的好處

      • 提高代碼的復(fù)用性;
      • 使類與類之間產(chǎn)生了關(guān)系,作為多態(tài)的前提條件

      2.2 繼承的格式

      繼承的格式

      修飾符 class 子類名 extends 父類名{
          
      }
      

      繼承的演示

      • 父類

        public class Person {
            // 成員變量
            private String name;
            private int age;
        
            // 構(gòu)造方法
            public Person(String name, int age) {
                this.name = name;
                this.age = age;
            }
        
            public Person() {
            }
        
            // 成員方法
            public String getName() {
                return name;
            }
        
            public void setName(String name) {
                this.name = name;
            }
        
            public int getAge() {
                return age;
            }
        
            public void setAge(int age) {
                this.age = age;
            }
        
            public void show(){
                System.out.println(name+","+age);
            }
        }
        
        
      • 子類

        public class Student extends Person {
        }
        
        
      • 測(cè)試類

        public class Test {
            public static void main(String[] args) {
                // 創(chuàng)建Student對(duì)象
                Student stu = new Student();
        
                // 調(diào)用set\get方法以及show方法
                stu.setName("張三");
                stu.setAge(18);
                System.out.println(stu.getName()+","+stu.getAge());
                stu.show();
            }
        }
        
        

      2.3 擴(kuò)展一個(gè)文件定義多個(gè)類

      class Person{
          String name;
      }
      
      class Student extends Person{
      
      }
      
      public class Test {
          public static void main(String[] args) {
              /*
                  1.一個(gè)文件中是可以定義多個(gè)類的
                  2.注意:
                      2.1 一個(gè)文件中定義多個(gè)類,只能有一個(gè)public修飾的類
                      2.2 使用public修飾的類的類名必須和文件名一致
                      2.3 工作中,都是一個(gè)類對(duì)應(yīng)一個(gè)文件,不要一個(gè)文件中定義多個(gè)類,現(xiàn)在只是過(guò)渡一下
               */
              Student stu = new Student();
              stu.name = "zs";
              System.out.println(stu.name);// zs
      
          }
      }
      
      

      2.4 繼承后成員訪問(wèn)規(guī)則

      繼承后構(gòu)造方法的訪問(wèn)規(guī)則

      • 子類無(wú)法繼承父類的構(gòu)造方法

        class Person{
            String name;
            int age;
        
            public Person(String name, int age) {
                this.name = name;
                this.age = age;
            }
        
            public Person() {
            }
        }
        
        class Student extends Person{
        
        }
        
        public class Test {
            public static void main(String[] args) {
                // 子類是無(wú)法繼承父類的構(gòu)造方法
                // 創(chuàng)建Student對(duì)象
                //Student stu = new Student("張三",18);// 編譯報(bào)錯(cuò)
            }
        }
        
        

      繼承后私有成員的訪問(wèn)規(guī)則

      • 子類可以繼承父類的私有成員,但無(wú)法直接訪問(wèn),可以間接訪問(wèn)

        • 私有成員變量: 通過(guò)set\get方法間接訪問(wèn)

        • 私有成員方法: 通過(guò)其他公共的方法間接訪問(wèn)

        class Person{
        private String name;

        private void method(){
            System.out.println("Person method方法...");
        }
        
        public String getName() {
            return name;
        }
        
        public void setName(String name) {
            this.name = name;
        }
        
        public void show(){
            method();
        }
        

        }

        class Student extends Person{

        }

        public class Test {
        public static void main(String[] args) {
        /*
        子類可以繼承父類的私有成員,但無(wú)法直接訪問(wèn),可以間接訪問(wèn)
        - 私有成員變量: 通過(guò)set\get方法間接訪問(wèn)
        - 私有成員方法: 通過(guò)其他公共的方法間接訪問(wèn)
        */
        // 創(chuàng)建Student對(duì)象
        Student stu = new Student();
        //System.out.println(stu.name);// 編譯報(bào)錯(cuò)
        //stu.method();// 編譯報(bào)錯(cuò)

            // 給從父類繼承過(guò)來(lái)的name屬性賦值和取值
            stu.setName("張三");
            System.out.println("name:"+stu.getName());
        
            // 調(diào)用從父類繼承過(guò)來(lái)的method方法---可以調(diào)用公共的show方法
            stu.show();// Person method方法...
        }
        

        }

        
        
        
        

      繼承后非私有成員的訪問(wèn)規(guī)則

      • 子類可以繼承父類的非私有成員,并且可以直接訪問(wèn)

      • 訪問(wèn)規(guī)則: 優(yōu)先在子類中查找,如果在子類中找到了就直接使用子類的,如果沒(méi)有找到就去父類中查找...

        class Person{
            String name = "張三";
        
            public void method(){
                System.out.println("Person method...");
            }
        }
        
        class Student extends Person{
            String name = "李四";
        
            public void method(){
                System.out.println("Student method...");
            }
        }
        
        public class Test {
            public static void main(String[] args) {
                /*
                    - 子類可以繼承父類的非私有成員,并且可以直接訪問(wèn)
                    - 訪問(wèn)規(guī)則: 優(yōu)先在子類中查找,如果在子類中找到了就直接使用子類的,如果沒(méi)有找到就去父類中查找...
                 */
                // 創(chuàng)建Student對(duì)象
                Student stu = new Student();
        
                // 訪問(wèn)從父類繼承過(guò)來(lái)的非私有成員變量
                System.out.println(stu.name);// 李四
        
                // 訪問(wèn)從父類繼承過(guò)來(lái)的非私有成員方法
                stu.method();// Student method...
            }
        }
        
        

      2.5 方法重寫

      方法重寫的概念

      • 概念:子類中出現(xiàn)與父類一模一樣的方法時(shí)(返回值類型,方法名和參數(shù)列表都相同),該方法就是重寫的方法。

      • 代碼:

        class Person{
            public void method(){
                System.out.println("Person method...");   
            }
        }
        
        class Student extends Person{
            // 重寫的方法
            @Override
            public void method(){
                System.out.println("Student method...");
            }
        
            
            public void show(){
                System.out.println("Student show...");
            }
        }
        
        public class Test {
            public static void main(String[] args) {
                /*
                     概念:子類中出現(xiàn)與父類一模一樣的方法時(shí)(返回值類型,方法名和參數(shù)列表都相同),該方法就是重寫的方法。
                     特點(diǎn): 
                        1.重寫的方法可以使用@Override注解進(jìn)行標(biāo)識(shí)
                        2.子類繼承父類的成員方法,如果子類有不同的實(shí)現(xiàn),子類就可以重寫從父類繼承過(guò)來(lái)的方法
                        3.子類重寫父類方法的訪問(wèn)權(quán)限,不能低于父類方法的訪問(wèn)權(quán)限
                            訪問(wèn)權(quán)限修飾符的大小:  public  >  protected > 空的(默認(rèn))   >  private
                       
                 */
            }
        }
        
        

      重寫的注意事項(xiàng)

      • 方法重寫是發(fā)生在父子類之間的關(guān)系。
      • 子類方法重寫父類方法,返回值類型、方法名和參數(shù)列表都要一模一樣。
      • 使用場(chǎng)景:父類的方法,子類有不同的實(shí)現(xiàn),那么子類就需要重寫父類的該方法
      • 子類方法重寫父類方法,必須要保證權(quán)限大于等于父類權(quán)限。
        訪問(wèn)權(quán)限從大到小: public > protected > (默認(rèn)) > private
      • 使用@Override注解,檢驗(yàn)是否重寫成功,重寫注解校驗(yàn)!
        • 建議重寫方法都加上這個(gè)注解,一方面可以提高代碼的可讀性,一方面可以防止重寫出錯(cuò)!

      2.6 this和super關(guān)鍵字

      this關(guān)鍵字的三種用法

      • 介紹:this可以訪問(wèn)本類的成員屬性、成員方法、構(gòu)造方法;

      • this訪問(wèn)本類成員變量: this.成員變量

        class Fu {
            int num = 10;
            
            public void method(){
                int num = 20;
                System.out.println("訪問(wèn)局部變量num:"+num);// 20
                System.out.println("訪問(wèn)成員變量num:"+this.num);// 10
            }
        }
        
        public class Test {
            public static void main(String[] args) {
                // this修飾本類成員變量: this.成員變量名
                // 作用: 用了區(qū)別同名的成員變量和局部變量
                // 創(chuàng)建Fu類對(duì)象,調(diào)用method方法
                Fu f = new Fu();
                f.method();
                
                //new Fu().method();
                
            }
        }
        
      • this訪問(wèn)本類成員方法: this.成員方法名(實(shí)參);

        class Fu {
            public void method1(){
                System.out.println("Fu method1...");
            }
        
            public void method2(){
                System.out.println("Fu method2...");
            }
        
            public void show(){
                // 調(diào)用Fu類中method1,method2方法
                this.method1();
                this.method2();
            }
        }
        
        public class Test {
            public static void main(String[] args) {
                // this訪問(wèn)本類的成員方法: this.方法名(實(shí)參);
                Fu f = new Fu();
                f.show();
            }
        }
        
        
      • this訪問(wèn)本類構(gòu)造方法: 在本類的一個(gè)構(gòu)造方法中,調(diào)用本類另一個(gè)構(gòu)造方法

        • 空參構(gòu)造: this();
        • 有參構(gòu)造: this(實(shí)參);
        • 注意:
          • 1.調(diào)用本類的構(gòu)造方法需要在本類的一個(gè)構(gòu)造方法中
          • 2.調(diào)用本類的構(gòu)造方法的代碼必須放在構(gòu)造方法的第一行
          • 3.調(diào)用本類的構(gòu)造方法不能2個(gè)構(gòu)造方法之間相互調(diào)用
        class Fu{
            String name;
            int age;
        
            public Fu() {
                System.out.println("Fu 空參構(gòu)造...");
            }
        
            public Fu(String name) {
                this.name = name;
        
            }
        
            public Fu(int age) {
                this.age = age;
            }
        
            public Fu(String name, int age) {
                // 訪問(wèn)本類的空參構(gòu)造
                //this();
                // 訪問(wèn)本類的有參構(gòu)造
                this(name);
                //this.name = name;
                this.age = age;
            }
        
        
        }
        
        public class Test {
            public static void main(String[] args) {
                /*
                    this訪問(wèn)本類構(gòu)造方法:  **在本類的一個(gè)構(gòu)造方法中,調(diào)用本類另一個(gè)構(gòu)造方法** 
                    - 空參構(gòu)造:  `this();` 
                    - 有參構(gòu)造:  `this(實(shí)參);`
                    - 注意:
                      - 1.調(diào)用本類的構(gòu)造方法需要在本類的一個(gè)構(gòu)造方法中
                      - 2.調(diào)用本類的構(gòu)造方法的代碼必須放在構(gòu)造方法的第一行
                      - 3.調(diào)用本類的構(gòu)造方法不能2個(gè)構(gòu)造方法之間相互調(diào)用
                 */
                Fu f = new Fu("張三", 18);
                System.out.println(f.name+","+f.age);
            }
        }
        
        

      super關(guān)鍵字的三種用法

      • 介紹:super可以訪問(wèn)父類的成員屬性、成員方法、構(gòu)造方法;

      • super訪問(wèn)父類的成員變量: super.父類成員變量名

        class Fu {
            int num = 10;
        }
        
        class Zi extends Fu {
            int num = 20;
        
            public void show() {
                int num = 30;
                System.out.println("笨類中局部變量num的值:" + num);
                System.out.println("本類中成員變量num的值:" + this.num);
                System.out.println("父類中成員變量num的值:" + super.num);
            }
        }
        
        public class Test {
            public static void main(String[] args) {
                // super訪問(wèn)父類的成員變量:  super.父類成員變量名
                // 創(chuàng)建Zi類對(duì)象
                Zi zi = new Zi();
                zi.show();
            }
        }
        
        
      • super訪問(wèn)父類的成員方法: super.成員方法名(實(shí)參);

        class Fu {
            public void method(){
                System.out.println("Person HelloWorld...");
            }
        }
        
        class Zi extends Fu {
            @Override
            public void method() {
                // 訪問(wèn)父類的method方法
                super.method();
                System.out.println("Student HelloWorld...");
            }
        
            public void show(){
                // 訪問(wèn)本類的method方法
                this.method();
                // 訪問(wèn)父類的method方法
                super.method();
            }
        }
        
        public class Test {
        
            public static void main(String[] args) {
                // super訪問(wèn)父類的成員方法:  super.成員方法名(實(shí)參);
                // 創(chuàng)建Zi類對(duì)象
                Zi zi = new Zi();
                zi.method();
                System.out.println("------");
                zi.show();
            }
        
        }
        
        
      • super訪問(wèn)父類的構(gòu)造方法: super(實(shí)參)

        class Fu{
            private String name;
            private int age;
        
            public Fu() {
                System.out.println("Fu  空參構(gòu)造...");
            }
        
            public Fu(String name, int age) {
                this.name = name;
                this.age = age;
                System.out.println("Fu  有參構(gòu)造...");
            }
        }
        
        class Zi extends Fu{
            public Zi() {
                super();
            }
        
            public Zi(String name,int age){
                // 調(diào)用父類的有參構(gòu)造方法
                super(name,age);
            }
        }
        
        public class Test {
            public static void main(String[] args) {
                /*
                    super訪問(wèn)父類構(gòu)造方法:  **在子類的一個(gè)構(gòu)造方法中,調(diào)用父類的構(gòu)造方法**
                    - 空參構(gòu)造:  `super();`
                    - 有參構(gòu)造:  `super(實(shí)參);`
                    - 注意:
                      - 1.調(diào)用父類的構(gòu)造方法需要在子類的一個(gè)構(gòu)造方法中
                      - 2.調(diào)用父類的構(gòu)造方法的代碼必須放在子類構(gòu)造方法的第一行
                 */
                // 通過(guò)空參構(gòu)造方法創(chuàng)建Zi類對(duì)象
                //Zi zi1 = new Zi();
        
                // 通過(guò)有參構(gòu)造方法創(chuàng)建Zi類對(duì)象
                //Zi zi2 = new Zi("張三",18);
        
            }
        }
        
        

      2.7 super的注意事項(xiàng)

      super的注意事項(xiàng)一

      • super訪問(wèn)成員變量和成員方法: 優(yōu)先去父類中找,如果有就直接使用,如果沒(méi)有就去爺爺類中找,如果有,就用,依次類推...

        class Ye /*extends Object*/{  // Object類是根類
            int num = 10;
            public void method(){
                System.out.println("Ye method...");
            }
        }
        
        class Fu extends Ye{
            /*int num = 20;
            public void method(){
                System.out.println("Fu method...");
            }*/
        }
        
        class Zi extends Fu{
            public void show(){
                System.out.println(super.num);
                super.method();
            }
        }
        
        public class Test1 {
            public static void main(String[] args) {
                /*
                    #### super的注意事項(xiàng)一
                    - super訪問(wèn)成員變量和成員方法: 優(yōu)先去父類中找,如果有就直接使用,如果沒(méi)有就去爺爺類中找,如果有,就用,依次類推...
                 */
                // 創(chuàng)建Zi類對(duì)象
                Zi zi = new Zi();
                // 使用zi類對(duì)象訪問(wèn)num成員方法
                System.out.println(zi.num);
                // 使用zi類對(duì)象訪問(wèn)method成員方法
                zi.method();
                System.out.println("---------------");
                // 使用zi類對(duì)象訪問(wèn)show成員方法
                zi.show();
            }
        }
        
        

      super的注意事項(xiàng)二

      • 子類的構(gòu)造方法默認(rèn)會(huì)調(diào)用父類的空參構(gòu)造方法,如果父類中沒(méi)有空參構(gòu)造方法,只定義了有參構(gòu)造方法,會(huì)編譯報(bào)錯(cuò)

        class Fu{
            public Fu() {
                System.out.println("Fu 空參構(gòu)造...");
            }
        
            public Fu(String name,int age) {
                System.out.println("Fu 有參構(gòu)造...");
            }
        }
        
        class Zi extends Fu{
            public Zi() {
                //super();// 不寫,默認(rèn)也有
            }
        
            public Zi(String name){
                //super();// 不寫,默認(rèn)也有
            }
        }
        
        public class Test {
            public static void main(String[] args) {
                /*
                    #### super的注意事項(xiàng)二
                        - 子類的構(gòu)造方法默認(rèn)會(huì)調(diào)用父類的空參構(gòu)造方法
                        - 如果父類中沒(méi)有空參構(gòu)造方法,只定義了有參構(gòu)造方法,子類中會(huì)編譯報(bào)錯(cuò)
                 */
                // 通過(guò)zi類空參構(gòu)造方法創(chuàng)建對(duì)象
                Zi zi1 = new Zi();
        
                // 通過(guò)zi類有參構(gòu)造方法創(chuàng)建對(duì)象
                Zi zi2 = new Zi("itheima");
        
            }
        }
        
        

      2.8 繼承體系對(duì)象的內(nèi)存圖

      書寫繼承案例

      class Fu{
          int num = 10;
          public void method(){
              System.out.println("Fu method...");
          }
      }
      
      class Zi extends Fu{
          int num = 20;
      
          @Override
          public void method() {
              System.out.println("Zi method...");
          }
      
          public void show(){
              int num = 30;
              System.out.println("局部變量num的值:"+num);
              System.out.println("本類成員變量num的值:"+this.num);
              System.out.println("父類成員變量num的值:"+super.num);
              // 調(diào)用本類的成員方法
              this.method();
              // 調(diào)用父類的成員方法
              super.method();
          }
      }
      
      public class Test {
          public static void main(String[] args) {
              // 創(chuàng)建Zi類對(duì)象
              Zi zi = new Zi();
              // 調(diào)用show方法
              zi.show();
          }
      }
      
      

      根據(jù)案例繪制內(nèi)存圖

      image-20210729153445088

      2.9 繼承的特點(diǎn)

      1. Java只支持單繼承,不支持多繼承。
      public class A{}
      public class B{}
      public class C extends A extends B{} // 都是錯(cuò)誤的
      public class C extends A , B{} // 都是錯(cuò)誤的
      
      
      1. 一個(gè)類只能有一個(gè)父類,但可以有多個(gè)子類。
      public class A{}
      public class B extends A{}
      public class C extends A{}
      
      
      1. 可以多層繼承。
      public class A{}
      public class B extends A{}
      public class C extends B{}
      

      補(bǔ)充: Java中頂層父類是Object類。所有的類默認(rèn)繼承Object,作為父類。

      class A {} 默認(rèn)繼承Object類 直接繼承Object

      class B extends A{} B的父類就是A,但是A的父類是Object類 間接繼承Object類

      第3章 抽象類

      3.1 抽象類的概述和定義

      抽象類的概述

      • 概述: 使用abstract修飾的類就是抽象類
      • 特點(diǎn):
        • 抽象類不能創(chuàng)建對(duì)象
        • 抽象類中可以寫抽象方法

      抽象類的定義

      • 格式:

        修飾符 abstract class 類名{
            // 成員變量
            // 成員方法
            // 構(gòu)造方法
            // 代碼塊
            // 內(nèi)部類
            // 抽象方法
        }
        

      案例

      public abstract class Animal {
          // 成員變量
          private String name;
      
          // 構(gòu)造方法
          public Animal(String name) {
              this.name = name;
          }
      
          public Animal() {
          }
      
          // 成員方法
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public void show() {
              System.out.println("name:" + name);
          }
      
          // 抽象方法
          // 代碼塊
          // 內(nèi)部類
      }
      
      
      

      3.2 抽象方法的概述和定義

      抽象方法的概述

      • 概述: 沒(méi)有方法體,并且使用abstract修飾的方法就是抽象方法

      抽象方法的定義

      • 格式: 修飾符 abstract 返回值類型 方法名(形參列表);

      • 案例:

        public abstract void method();
        

      3.3 抽象類的注意事項(xiàng)

      • 抽象類不能被創(chuàng)建對(duì)象,只能用來(lái)做“父類”,被子類繼承的,體現(xiàn)的是模板思想 。

        abstract class Animal{
            
        }
        
        public class Test {
            public static void main(String[] args) {
                // 抽象類不能被創(chuàng)建對(duì)象,只能用來(lái)做“父類”,被子類繼承的,體現(xiàn)的是模板思想 。
                //Animal anl = new Animal();// 編譯報(bào)錯(cuò)
            }
        }
        
        
      • 抽象類不能被創(chuàng)建對(duì)象,但可以有“構(gòu)造方法”——目的:給子類初始化從父類繼承過(guò)來(lái)的屬性。

        abstract class Animal{
            private String name;
            private int age;
        
            public Animal() {
            }
        
            public Animal(String name, int age) {
                this.name = name;
                this.age = age;
            }
        
            public String getName() {
                return name;
            }
        
            public int getAge() {
                return age;
            }
        }
        
        class Dog extends Animal{
            public Dog(){
        
            }
        
            public Dog(String name,int age){
                super(name,age);
            }
        }
        
        public class Test {
            public static void main(String[] args) {
                // 抽象類不能被創(chuàng)建對(duì)象,但可以有“構(gòu)造方法”——目的:給子類初始化從父類繼承過(guò)來(lái)的屬性。 
                // 說(shuō)白了就是抽象父類中的構(gòu)造方法就是供子類構(gòu)造方法來(lái)調(diào)用的
                // 需求: 創(chuàng)建Dog類對(duì)象,并初始化從Animal類中繼承過(guò)來(lái)的成員變量
                Dog dog = new Dog("旺財(cái)",2);
                System.out.println(dog.getName());
                System.out.println(dog.getAge());
        
            }
        }
        
        
      • 抽象類中可以沒(méi)有抽象方法,但抽象方法必須定義在抽象類中

        
        // 抽象類
        abstract class Animal{
            // 抽象類中可以沒(méi)有抽象方法
        }
        
        abstract class Person{
            // 但抽象方法必須定義在抽象類中
            public abstract void method();
        }
        
        public class Test {
            public static void main(String[] args) {
                // 抽象類中可以沒(méi)有抽象方法,但抽象方法必須定義在抽象類中
            }
        }
        
        
      • 子類繼承抽象類后,必須重寫抽象類中所有的抽象方法,否則子類必須也是一個(gè)抽象類

        abstract class Animal{
            public abstract void eat();
            public abstract void drink();
        }
        
        // 抽象類的子類是抽象類,可以不用重新抽象類中的抽象方法
        abstract class Cat extends Animal{
        
        }
        
        // 抽象類的子類是普通類,那就必須重寫抽象類中所有的抽象方法
        class Dog extends Animal{
        
            @Override
            public void eat() {
        
            }
        
            @Override
            public void drink() {
        
            }
        
        }
        
        public class Test {
            public static void main(String[] args) {
                // 子類繼承抽象類后,必須重寫抽象類中所有的抽象方法,否則子類必須也是一個(gè)抽象類
            }
        }
        
        

      3.4 模板設(shè)計(jì)模式

      • 設(shè)計(jì)模式: 設(shè)計(jì)模式就是解決一些問(wèn)題時(shí)的固定思路,也就是代碼設(shè)計(jì)思路經(jīng)驗(yàn)的總結(jié)。

      • 模板思想:

        • 模板是通用的東西,抽象類體現(xiàn)的是模板思想。

        • 抽象類中可以是具體實(shí)現(xiàn)的方法(通用模板),也可以有抽象方法(填充模板)。

        • 模板中能決定的行為就定義成有方法體的方法,讓需要使用模板的類(子類)直接繼承調(diào)用即可。

        • 模板中不能決定的行為定義成抽象方法,讓需要使用模板的類(子類)負(fù)責(zé)重寫抽象方法實(shí)現(xiàn)。

      • 案例:

        • 需求:按照下述要求,使用代碼實(shí)現(xiàn)
          定義新、老司機(jī)類,新、老司機(jī)類都有開(kāi)車功能,開(kāi)車的步驟一樣,但駕駛時(shí)的姿勢(shì)不同
          新司機(jī):開(kāi)門,點(diǎn)火,雙手緊握方向盤,剎車,熄火
          老司機(jī):開(kāi)門,點(diǎn)火,右手握方向盤左手抽煙,剎車,熄火

        • 代碼:

          
          // 抽象父類
          public abstract class Driver {
              // 通用模板(有方法體的方法)
              public void drive(){
                  System.out.println("開(kāi)門");
                  System.out.println("點(diǎn)火");
                  // 姿勢(shì)
                  ziShi();
                  System.out.println("剎車");
                  System.out.println("熄火");
              }
          
              // 填充模板(沒(méi)有方法體的方法)
              public abstract void ziShi();
          
          }
          
          
          public class NewDriver extends Driver {
              @Override
              public void ziShi() {
                  System.out.println("雙手緊握方向盤");
              }
          }
          
          public class OldDriver extends Driver {
              @Override
              public void ziShi() {
                  System.out.println("右手握方向盤左手抽煙");
              }
          }
          
          package com.itheima.demo12_模板設(shè)計(jì)模式;
          
          public class Test {
              public static void main(String[] args) {
                  // 創(chuàng)建新司機(jī)對(duì)象,調(diào)用開(kāi)車的方法
                  new NewDriver().drive();
          
                  // 創(chuàng)建老司機(jī)對(duì)象,調(diào)用開(kāi)車的方法
                  new OldDriver().drive();
              }
          }
          
          

      第4章 final關(guān)鍵字

      4.1 final關(guān)鍵字的概述和使用

      final關(guān)鍵字的概述

      • 概述: final是一個(gè)關(guān)鍵字,表示最終,不可變的意思,可以用來(lái)修飾類,修飾方法,修飾變量
      • 特點(diǎn):
        • 被final修飾的類不能被繼承
        • 被final修飾的方法不能被重寫
        • 被final修飾的變量不能重復(fù)賦值,只能賦值一次

      final關(guān)鍵字的使用

      修飾類
      • 格式:

        修飾符 final class  類名{
            
        }
        
      • 案例:

        final class Fu{
            
        }
        
        class Zi /*extends Fu*/{
            // 編譯報(bào)錯(cuò),被final修飾的類不能被繼承    
        }
        
        public class Test {
            public static void main(String[] args) {
                
            }
        }
        
      修飾方法
      • 格式: 修飾符 final 返回值類型 方法名(形成列表){ 方法體 }

      • 特點(diǎn): 被final修飾的方法不能被重寫

      • 案例:

        class Fu{
            
            public final void method(){
                System.out.println("Fu method...");
            }
        }
        
        class Zi extends Fu{
            // 編譯報(bào)錯(cuò),因?yàn)楸籪inal修飾的方法不能被重寫
            /*@Override
            public void method(){
                System.out.println("Zi method...");
            }*/
        }
        
        
        public class Test {
            public static void main(String[] args) {
                
            }
        }
        
        
      修飾變量
      • 格式:

        • 方式一: final 數(shù)據(jù)類型 變量名 = 值;
        • 方式二: final 數(shù)據(jù)類型 變量名; 變量名 = 值;
      • 特點(diǎn):

        • 被final修飾的變量不能重復(fù)賦值,只能賦值一次
        • 被final修飾的變量其實(shí)也叫作常量,常量命名規(guī)范是所有字母大寫
      • final修飾局部變量案例:

        public class Test1_局部變量 {
            public static void main(String[] args) {
                // 定義一個(gè)NUM局部變量并賦值
                final int NUM = 10;
                // 重新給num賦值
                // NUM = 20;// 編譯報(bào)錯(cuò),被final修飾的變量不能重復(fù)賦值,只能賦值一次
                // 打印輸出
                System.out.println(NUM);// 10
        
                System.out.println("-----------------");
                final int A;
                A = 20;
                //A = 30;// 編譯報(bào)錯(cuò),被final修飾的變量不能重復(fù)賦值,只能賦值一次
                System.out.println(A);// 20
            }
        }
        
      • final修飾成員變量案例:

        方式一:
        class Person{
            // final 數(shù)據(jù)類型 變量名 = 值;
            final int AGE = 10;
        }
        
        方式二:
        
        class Animal{
            final int age;
        
            public Animal(int age) {
                this.age = age;
            }
        
            public Animal() {
                age = 20;
            }
            // 只要保證age成員變量出現(xiàn)的時(shí)候有值
        }
        
        public class Test2_成員變量 {
            public static void main(String[] args) {
                /*
                    成員變量和局部變量的區(qū)別:
                        1.成員變量定義在類中方法外,局部變量定義在方法中或者方法聲明之上(參數(shù))
                        2.成員變量是在堆區(qū),局部變量是在棧區(qū)
                        3.成員變量是隨著對(duì)象的創(chuàng)建而存在,隨著對(duì)象的銷毀而銷毀;
                          局部變量是隨著方法的調(diào)用而存在,隨著方法的彈棧而銷毀
                        4.成員變量有默認(rèn)值,而局部變量沒(méi)有默認(rèn)值
                 */
                Animal anl = new Animal(20);
                //anl.age = 100;// 編譯報(bào)錯(cuò),因?yàn)楸籪inal修飾的變量不能重復(fù)賦值,只能賦值一次
                System.out.println(anl.age);
        
            }
        }
        

      總結(jié)

      必須練習(xí):
      	1.定義類,創(chuàng)建對(duì)象,使用對(duì)象----->必須掌握
          2.繼承的格式,繼承后成員訪問(wèn)規(guī)則--->必須掌握
          3.this和super關(guān)鍵字的三種用法--->必須掌握
          4.方法重寫--->必須掌握
          5.抽象類的定義以及使用--->必須掌握
          6.抽象方法的定義以及使用--->必須掌握
          7.fianl關(guān)鍵字修飾類,方法,變量--->必須掌握
           
      
      - 能夠?qū)懗鲱惖睦^承格式
          修飾符 class 子類名 extends 父類名{}
      
      - 能夠說(shuō)出繼承的特點(diǎn)
          1.子類繼承父類后,就可以擁有父類所有的成員變量和成員方法
          2.子類繼承父類后,可以直接訪問(wèn)從父類繼承過(guò)來(lái)的非私有成員
          3.只能單繼承,不能多繼承,但可以多層繼承
          4.不要為了繼承而繼承,必須滿足is a的關(guān)系才去繼承
          
      - 能夠說(shuō)出子類調(diào)用父類的成員特點(diǎn)
          子類繼承父類后,可以直接訪問(wèn)從父類繼承過(guò)來(lái)的非私有成員
          子類繼承父類后,不可以直接訪問(wèn)從父類繼承過(guò)來(lái)的私有成員,需要間接訪問(wèn)
          
      - 夠說(shuō)出方法重寫的概念
          概念: 子類中出現(xiàn)和父類一模一樣的方法(返回值類型,方法名,參數(shù)列表),該方法就是重寫的方法
          特點(diǎn):
      		1.子類重寫的方法的權(quán)限不能低于父類方法的權(quán)限
                 public > protected > 默認(rèn) > private
              2.重寫的方法可以使用@Override注解進(jìn)行標(biāo)識(shí),可以起到提高代碼可讀性以及校驗(yàn)重寫是否正確的作用
                  
      - 能夠說(shuō)出this可以解決的問(wèn)題
         this可以訪問(wèn)本類的成員變量: this.成員變量名
         this可以訪問(wèn)本類的成員方法: this.成員方法名(實(shí)參);
         this可以訪問(wèn)本類的構(gòu)造方法: this(實(shí)參);
      
      - 能夠說(shuō)出super可以解決的問(wèn)題
         super可以訪問(wèn)父類的成員變量: super.成員變量名
         super可以訪問(wèn)父類的成員方法: super.成員方法名(實(shí)參);
         super可以訪問(wèn)父類的構(gòu)造方法: super(實(shí)參);
      
      - 描述抽象方法的概念
          概念: 沒(méi)有方法體,并且使用abstract修飾的方法
      
      
      - 寫出抽象類的格式
         概述:使用abstract修飾的類就是抽象類
         格式:修飾符 abstract class 類名{}
         特點(diǎn): 
      		1.抽象類的子類可以是普通類,也可以是抽象類
              2.抽象類的子類是普通類,必須重寫抽象類中所有的抽象方法,否則抽象類的子類必須也是抽象類
              3.有抽象方法的類一定是抽象類,但抽象類中不一定有抽象方法
                  
      - 寫出抽象方法的格式
         格式: 修飾符 abstract 返回值類型 方法名(實(shí)參);
      
      - 能夠說(shuō)出父類抽象方法的存在意義
         強(qiáng)制要求子類重寫
          
      - 描述final修飾的類的特點(diǎn)
          不能被繼承
          
      - 描述final修飾的方法的特點(diǎn)
          不能被重寫
          
      - 描述final修飾的變量的特點(diǎn)
          只能賦值一次,不能重復(fù)賦值
          
      
      posted on 2022-04-24 23:38  ofanimon  閱讀(41)  評(píng)論(0)    收藏  舉報(bào)
      // 側(cè)邊欄目錄 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css
      主站蜘蛛池模板: 日韩av中文字幕有码| 中文字幕日韩有码av| 91孕妇精品一区二区三区| 无码人妻精品一区二区三区东京热 | 精品国产中文字幕懂色| 色悠悠国产精品免费观看| 精品国精品自拍自在线| 四虎永久免费精品视频| 一区二区三区av天堂| 亚洲精品久久一区二区三区四区| 无码中文字幕乱码一区| 国产精品一区二区三区黄色| 锦州市| 国产精品久久无码不卡黑寡妇| 自拍偷自拍亚洲精品熟妇人| 国产精品推荐视频一区二区| 国产成人无码AV片在线观看不卡| 中文字幕乱妇无码AV在线| 国产精品美女一区二三区| 亚洲精品一区二区三区中文字幕| 亚洲成人av一区免费看 | 精品国产精品中文字幕| 亚洲免费观看一区二区三区| 男人j进入女人j内部免费网站| 4虎四虎永久在线精品免费| 成人午夜av在线播放| 性按摩玩人妻hd中文字幕| 国产成人高清亚洲一区二区| 亚洲av在线观看| 国产不卡精品视频男人的天堂| 精品人妻系列无码天堂| 成熟少妇XXXXX高清视频| 久久久久影院色老大2020| 国产成人A在线视频免费| 定州市| 久热99热这里只有精品| 久久影院综合精品| 午夜射精日本三级| 国产美女裸身网站免费观看视频| 国产国产久热这里只有精品| 日韩 一区二区在线观看|