Java(十二)

知识点1:final关键字的使用

package com.atguigu.java;

/**
 *
 * final关键字的使用
 *
 * 1.final : 最终的
 * 2. 可以用来修饰:类、方法、变量(属性、局部变量)
 *
 * 3. final修饰类:表示此类不能被继承。
 *   比如:String\StringBuffer\StringBuilder
 *
 * 4. final修饰方法:表示此方法不能被重写
 *   比如:Object类中getClass()
 *
 * 5.1 final修饰属性:此属性是一个常量。
 *    表示:此属性一旦被赋值,就不可更改。即:只能赋值一次。
 *    final修饰的属性可以在哪些位置赋值?① 显式赋值 ② 代码块中赋值 ③构造器中赋值
 *
 *    说明: static final修饰一个属性:全局常量。
 *    比如:Math类中的PI
 *        在游戏中:public static final int UP = 1;
 *                 public static final int DOWN = 2;
 *                 public static final int LEFT = 3;
 *                 public static final int RIGHT = 4;
 *
 *
 * 5.2 final修饰局部变量:一旦对此局部变量进行了赋值,就不能再修改此值。
 *
 *
 *  面试题:区分 final \ finalize \ finally
 */
public class FinalTest {

    public static void main(String[] args) {
        FinalTest test = new FinalTest();
        test.method1(10);
    }

    final int MY_NUM1 = 0;

    final int NUM2;

    {
        NUM2 = 1;
    }

    final int NUM3;

    public FinalTest(){
        NUM3 = 3;
    }

    public FinalTest(int i){
//        this();
        NUM3 = i;
    }

//    final int NUM4;
//
//    public void setNum4(int num4){
//        this.NUM4 = num4;
//    }


    public void method(){
        final int num = 0;
//        num++;
        System.out.println(num);
    }

    public void method1(final int num){
//        num++;
        System.out.println(num);
    }
}

//class MyString extends String{}

final class A{

}

//class B extends  A{
//
//}

class C{
    public final void methodFinal(){}
}

class D extends C{
//    public void methodFinal(){}
}

说明:开发中我们常关注使用final修饰属性。

知识点2:abstract关键字的使用

  • 产生的背景

  • 知识点说明

/**
 *
 * abstract class Account{
 *     double balance;//余额
 *
 *     public void withdraw(double amt){}
 *
 *     public void deposit(double amt){}
 *
 * }
 *
 * class SavingAccount extends Account{
 *
 * }
 *
 * class CheckAccount extends Account{
 *
 * }
 *
 *
 *
 *
 * abstract关键字的使用
 * 1. abstract:抽象的
 * 2. abstract用来修饰类、方法
 *
 * 3. abstract修饰类:此时就是抽象类
 *      > 抽象类,不可以实例化。
 *      > 开发中,我们都会去提供抽象类的子类。进而创建子类的实例。
 *
 *
 * 4. abstract修饰方法:即为抽象方法
 *      > 抽象方法所在的类,一定是抽象类。反之,抽象类中可以没有抽象方法。
 *      > 子类继承抽象的父类以后,如果重写了抽象的父类中的所有的抽象方法,则此子类可以实例化。
 *        子类继承抽象的父类以后,没有重写抽象的父类中的所有的抽象方法,则此子类仍然为抽象类。
 *
 *
 */
  • 代码演示
public class AbstractTest {
    public static void main(String[] args) {
//        Person p1 = new Person();
//        p1.eat();

        Student s1 = new Student();
        s1.eat();
        s1.sleep();


        //创建了继承于Person类的匿名子类的对象
        Person p2 = new Person(){

            @Override
            public void eat() {

            }

            @Override
            public void sleep() {

            }

            @Override
            public void breath() {

            }
        };
        System.out.println(p2.getClass());
    }
}

abstract class Creature{
    public abstract void breath();//呼吸
}

abstract class Person extends Creature{
    String name;
    int age;

    //抽象方法
    public abstract void eat();

    public abstract void sleep();
}

class Student extends Person{
    String major;

    public void eat(){
        System.out.println("学生多吃有营养的食物");
    }

    @Override
    public void sleep() {
        System.out.println("学生保证每天8小时的睡眠");
    }


    @Override
    public void breath() {
        System.out.println("学生多呼吸新鲜空气");
    }
}

abstract class Worker extends Person{
    @Override
    public void breath() {
        System.out.println("工人的工作场所空气质量一般都不好");
    }
}
  • 应用场景

  • abstract使用的注意点

/**
 *
 * 1. abstract只能修饰类、方法;不能修饰属性、构造器、代码块
 *
 * 2. 不能用abstract修饰私有方法、静态方法、final的方法、final的类
 */
public abstract class AbstractTest1 {
    public abstract void method();
}

知识点3:接口的使用

  • 知识点说明
/**
 *
 * interface关键字的使用
 *
 * 1. 使用interface定义接口,接口是与类并列的概念
 *
 * 2. 接口内可以声明的结构有:
 *   jdk7及以前:全局常量、抽象方法
 *   全局常量:public static final 。可以省略不写
 *   抽象方法:public abstract 。可以省略不写
 *
 *  jdk8中:接口中定义静态方法、默认方法
 *  jdk9中:接口中定义私有方法
 *
 * 3. 接口中不能定义构造器,不能实例化接口!
 *
 * 4. 类与接口之间是实现(implements)关系,而且是多实现的。
 *    class A extends B implements C,D
 *
 *    4.1 如果实现类实现了接口中声明的所有抽象方法,则此类可以实例化
 *    4.2 如果实现类没有实现接口中声明的所有抽象方法,则此类仍为抽象类,不能实例化
 *
 * 5. 接口与接口之间存在继承关系,而且是可以多继承的。
 */
  • 代码演示
public class InterfaceTest {
    public static void main(String[] args) {
        System.out.println(Flyable.MIN_SPEED);
        System.out.println(Flyable.MAX_SPEED);

        System.out.println(Bullet.MIN_SPEED);
    }
}

interface Flyable{
    //常量
    public static final int MIN_SPEED = 1;
    int MAX_SPEED = 7900;

    void fly();
}

interface Attackable{
    void attack();
}

abstract class Plane implements Flyable{

}

class Bullet implements Flyable,Attackable{

    @Override
    public void fly() {
        System.out.println("让子弹飞一会儿~~");
    }

    @Override
    public void attack() {
        System.out.println("子弹具备攻击性");
    }
}

//#####################

interface AA{
    void method1();
}
interface BB{
    void method2();
}

interface CC extends AA,BB{

}

class DD implements CC{

    @Override
    public void method1() {

    }

    @Override
    public void method2() {

    }
}
  • 接口的本质是契约,标准,规范,就像我们的法律一样。制定好后大家都要遵守。

  • 经典题目

package com.atguigu.java1;

/**
 *
 * 1. 接口,定义了一种规范、标准
 *
 * 2. 接口也存在多态性
 *
 */
public class USBTest {

    public static void main(String[] args) {
        Computer computer = new Computer();

        Printer printer = new Printer();
        //1. 传入接口的实现类的对象
        computer.transferData(printer);

        //2.传入接口的实现类的匿名对象
        computer.transferData(new Flash());

        //3.传入接口的匿名实现类的对象
        USB usb1 = new USB(){

            @Override
            public void start() {
                System.out.println("数码相机开始工作");
            }

            @Override
            public void stop() {
                System.out.println("数码相机结束工作");
            }
        };
        computer.transferData(usb1);

        //4.传入接口的匿名实现类的匿名对象
        computer.transferData(new USB(){

            @Override
            public void start() {
                System.out.println("手机开始工作");
            }

            @Override
            public void stop() {
                System.out.println("手机结束工作");
            }
        });


    }

}

interface USB{
    //常量:USB的长、宽、...
    //抽象方法
    public abstract void start();
    void stop();
}

class Computer{

    public void transferData(USB usb){//多态:USB usb = new Printer();
        usb.start();
        System.out.println("=======数据传输的细节==========");
        usb.stop();
    }

}

class Printer implements USB{//打印机

    @Override
    public void start() {
        System.out.println("打印机开始工作");
    }

    @Override
    public void stop() {
        System.out.println("打印机停止工作");
    }
}

class Flash implements USB{//u盘
    @Override
    public void start() {
        System.out.println("U盘开始工作");
    }

    @Override
    public void stop() {
        System.out.println("U盘停止工作");
    }
}

  • java8中的新特性
package com.atguigu.java2;

/**
 */
public interface CompareA {
    public static void method1(){
        System.out.println("CompareA:北京");
    }

    public default void method2(){
        System.out.println("CompareA:上海");
    }

    default void method3(){
        System.out.println("CompareA:深圳");
    }

    default void method4(){
        System.out.println("CompareA:广州");
    }
}

package com.atguigu.java2;

/**
 */
public interface CompareB {
    default void method3(){
        System.out.println("CompareB:深圳");
    }
}
package com.atguigu.java2;

/**
 */
public class SuperClass {
    public void method4(){
        System.out.println("SuperClass:广州");
    }
}

package com.atguigu.java2;

/**
 */
public class SubClass extends SuperClass implements CompareA,CompareB {

    public void method2(){
        System.out.println("SubClass:上海");
    }

    public void method3(){
        System.out.println("SubClass:深圳");
    }



    //知识点5:如何调用父类及实现的接口中被重写的方法。
    public void method(){
        super.method4();//调用的是父类中的方法
        method3();//SubClass自己重写的方法
        CompareA.super.method2();//调用的是接口中的方法

    }
}

package com.atguigu.java2;

import org.junit.Test;

/**
 */
public class SubClassTest {
    public static void main(String[] args) {
        //知识点1:接口中的静态方法不能被实现类直接调用。只能通过接口来进行调用。
        CompareA.method1();
        //编译不通过
//        SubClass.method1();

        //知识点2:通过实现类的对象可以直接调用接口中定义的默认方法。
        //如果实现类重写了接口中的默认方法,则实现类对象调用的就是重写的方法
        SubClass sub1 = new SubClass();
        sub1.method2();

        //知识点3:如果实现类实现的多个接口中,定义了同名同参数的默认方法,则实现类必须要重写
        //接口中的此方法。否则会出现接口冲突。
        sub1.method3();

    }
    //知识点4:如果子类继承的父类与实现的接口中定义了同名同参数的方法,则子类在没有重写此方法的
    //情况下,默认调用父类中的方法。---->类优先原则。
    @Test
    public void test1(){
        SubClass sub1 = new SubClass();
        sub1.method4();
    }
}

知识点4:内部类的使用

  • 知识点总结
/**
 *
 * 类的成员之五:内部类
 *
 * 1. 概念:将一个类A声明在另一个类B的内部,则构成了内部类结构。
 *
 * 2. 分类:成员内部类 :静态的成员内部类  vs 非静态的成员内部类
 *          局部内部类:
 *
 * 3. 内部类,一方面作为类:
 *              > 可以定义属性、方法、构造器、代码块等
 *              > 可以被final、abstract 修饰
 *
 *          另一方面作为外部类的成员:
 *              > 可以被4种权限修饰符修饰。
 *              > 可以被static修饰
 *              > 可以调用外部类的属性、方法等。
 *
 *
 *  4. 需要大家掌握的3个知识点:
 *    ① 如何创建成员内部类的对象?(静态的成员内部类、非静态的成员内部类)
 *    ② 在成员内部类中,如何调用外部类的结构。
 *    ③ 掌握局部内部类的常见使用场景:见 InnerClassTest1.java
 */
  • 代码演示
public class InnerClassTest {
    public static void main(String[] args) {
        //创建静态的成员内部类的对象
       Person.Cat cat =  new Person.Cat();

       //创建非静态的成员内部类的对象
        Person p1 = new Person();
        Person.Dog dog = p1.new Dog(); //new p1.Dog():错误的

        dog.info("花花");

        dog.eat();

        System.out.println(dog.getClass());
    }
}

class Person{
    String name = "Tom";
    int age;

    //内部类
    public class Dog{
        String name = "旺财";

        public void eat(){
            swim();
            Person.this.swim();
        }

        public void info(String name){
            System.out.println(name);
            System.out.println(this.name);
            System.out.println(Person.this.name);
        }

        public void swim(){
            System.out.println("狗也会游泳");
        }
    }

    static class Cat{

    }

    public void method(){
        //内部类
        class AA{

        }
    }

    public void swim(){
        System.out.println("人游泳");
    }

}
  • 内部类的使用举例
/**
 *
 * 局部内部类的使用
 */
public class InnerClassTest1 {

    public void method(){
        //局部内部类:非常少见
        class AA{

        }
    }

    public Comparable getComparable(){
        //局部内部类
//        class MyComparable implements Comparable{
//
//            @Override
//            public int compareTo(Object o) {
//                return 0;
//            }
//        }
//        return new MyComparable();


        return new Comparable(){

            @Override
            public int compareTo(Object o) {
                return 0;
            }
        };
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值