我是靠谱客的博主 糊涂小海豚,最近开发中收集的这篇文章主要介绍JavaSE进阶回顾第一天,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

第一章

  • final关键字
  • 抽象类
  • 接口
  • 抽象类与接口的区别
  • package和import
  • 访问权限控制
  • Object类

final的特点:

  1. final修饰的类,为最终类,该类不能被继承。(如String 类)
  2. final修饰的方法可以被继承和重载,但不能被重写
  3. final修饰的变量不能被修改,只能被赋值一次。
  4. final修饰的引用只能指向一个对象,并且它只能永远指向该对象。

万变不离其宗。final修饰的变量只能被赋值一次!

  1. final修饰实例变量,那么在构造方法初始化该属性后,就不能被修改了。final修饰的实例变量,系统不会赋默认值,必须要程序员手动赋初值,或者通过构造方法赋值!!!
class User{
    //实例变量
    //编译器报错!!!
    final int age;
    
    //实例变量
    //编译通过
    final double height=1.8;
    
    //实例变量
    //通过构造方法赋值可以通过
    final double weight;
    
    //构造方法
    public User(){
        this.weight=60;
    }
    
}
  1. static final修饰的被称为常量

常量与静态变量区别在于:常量是不能改变的。

常量和静态变量都存储在方法区,并且都在类加载的时候初始化。

常量全大写

class Chinese{
    static final String COUNTRY = "中国";
    
    static final int i = 10;
}

在这里插入图片描述

抽象类

  1. 什么是抽象类?

    类与类之间具有共同特征,将这些共同特征提取出来。形成的就是抽象类。类本身是不存在的,所以抽象类无法创建对象《无法实例化》。

  2. 抽象属于什么类型?

    抽象类属于引用数据类型

  3. 抽象类怎么定义?

//银行账户类
abstract class Account{
   
} 

//子类继承抽象类,子类可以实例化对象
class CreditAccount extends Account{
    
} 
  1. 抽象类的子类可以是抽象类。

  2. 注意:abstract和final是敌人,不能同时出现,不能联合使用。(abstract类就是为被继承,而final修饰的类不能被继承)

  3. 抽象类虽然无法实例化,但抽象类有构造方法,这个构造方法是供子类使用的。

  4. 抽象类关联到一个概念:抽象方法。

    什么是抽象方法?

    抽象方法表示没有实现的方法,没有方法体的方法。

    public abstract void doSome();//抽象方法00
    
  5. 重点结论如下:

    1. 抽象类中不一定有抽象方法。抽象方法必须重写抽象类中。

    2. 一个非抽象类继承抽象类,必须将抽象类中的抽象方法 实现了/重写/覆盖。

在这里插入图片描述

在这里插入图片描述

  1. 继承抽象方法可以使用多态

    Animal a = new Bird();
    a.move();
    

在这里插入图片描述

接口

接口的基础语法:

  1. 接口也是一种引用数据类型。
  2. 接口是完全抽象的。
  3. 接口定义,语法是什么?
[访问修饰符] interface 接口名{}
  1. 一个接口可以继承多个接口,接口支持多继承
//定义接口
interface A(){
    
}

//定义接口
interface B(){
    
}

//定义接口
interface C extends A,B{
    
}

  1. 接口中只包含看两部分,一部分是:常量,一部分是:抽象方法
  2. 接口中所有的元素都是public修饰的。(都是公开的。)
  3. 接口的抽象方法的public abstrac可以省略,常量的public static final也可以省略。
//我的数学接口
interface MyMath{
    
    //常量
    public static final double PI=3.14//常量的public static final也可以省略
    double PI=3.14//抽象方法
    public abstract int sum(int a,int b);
    
    //接口当中既然都是抽象方法,那么在编写代码的时候,public abstrac可以省略!!
    int sum(int a,int b);
}
  1. 接口中的方法都是抽象方法,所有接口中的方法不能有方法体。

  2. 经过测试:接口和接口之间在进行强制类型转换的时候,没有继承关系,也可以强转。但是一定要注意,运行时间可能会出现ClassCastException异常。
    向下转型用instanceof同样适用。(代码如下)

    以下代码编译没问题,运行有问题:

interface K{
    
}
interface M{
    
}
interface E implements M{
     
}

M m = new E();

if(m instanceof K){//这样就可以防止没有继承关系的时候可以强转的风险。
    K k = (K)m;
}

以下代码可以通过:调用其他接口中的方法需要转型即可。

interface A{
    int m1();
}
interface B{
    int m2();
}
interface C{
    int m3();
}
class D implements A,B,C{
    //实现以上所有方法
}
A a = new D();
B b = new D();
C c = new D();

B b2 = (B)a;//调用其他接口中的方法需要转型即可。
b2.m2
  1. extend在前,implements在后。
  2. 一个非抽象类实现接口的时候,必须将接口中所有的方法加以实现。
  3. 一个类可以实现多个接口。
  4. 使用接口写代码的时候,可以使用多态(父类引用指向子类引用)。

接口在开发中的应用:

注意:接口在开发中的作用,类似于多态在开发中的作用。

多态:面向抽象编程,不要面向具体编程。降低程序的耦合度。提高程序的扩展力。

/*public class Master{
    public void feed(Dog d){}
    public void feed(Cat c){}
}*/

public class Master{
    public void feed(Animal a){
        //面向Animal父类编程,父类比子类更抽象
        //所以我们叫做面向抽象编程,不要面向具体编程。
        //这样扩展力就更强。
    }

}

接口是完全抽象的,提倡面向接口编程。

示例:顾客去餐馆吃饭?

//菜单:接口
public interface FoodMenu {
    void chaoFan();//炒饭

    void baoTang();//煲汤

}
//中国厨师
public class ChineseCook implements FoodMenu{
    @Override
    public void chaoFan() {
        System.out.println("中式炒饭");
    }

    @Override
    public void baoTang() {
        System.out.println("中式煲汤");
    }
}
//外国厨师
public class ForeignCook implements FoodMenu{
    @Override
    public void chaoFan() {
        System.out.println("西式炒饭");
    }

    @Override
    public void baoTang() {
        System.out.println("西式煲汤");
    }
}
//顾客
public class Customer {
    //顾客手里有一个菜单
    //Customer has a FoodMnue
    //记住:以后凡是能够使用has a描述的,统一以属性的方式存在!
    private FoodMenu foodMenu;//面向抽象编程,面向接口编程。

    public Customer() {
    }
 
    public Customer(FoodMenu foodMenu) {
        this.foodMenu = foodMenu;
    }

    public void chaoFan(){
        foodMenu.chaoFan();
    }
    public void baoTang(){
        foodMenu.baoTang();
    }
}
/*
    Cat is a Animal,但凡满足is a的表示可以设置为继承!
 */
//主类
public class Test {
    public static void main(String[] args) {
        ChineseCook chineseCook = new ChineseCook();
        Customer customer = new Customer(chineseCook);
        customer.chaoFan();
        customer.baoTang();

        Customer customer1 = new Customer(new ForeignCook());
        customer1.chaoFan();
        customer1.baoTang();
    }
}

类型和类型之间的关系:

is a、has a、like a

  1. is a:Cat is a Animal

    凡是能够满足is a的表示"继承关系"

  2. has a:Customer has a menu

​ 凡是能够满足has a关系的通常以"属性"形式存在。

  1. like a:Cook like a FoodMenu

    凡是能够满足like a关系的表示:类 实现了 接口。

抽象类和接口有什么区别?

接口是半抽象的。

接口是完全抽象的。

抽象类中有构造方法。

接口中没有构造方法。

接口与接口之间支持多继承。

类与类之间只支持单继承。

一个类可以实现多个接口。

一个抽象类只能继承一个类(单继承)。

接口中只出现常量和抽象方法。

package和import

package命名规范:

公司域名倒序(com.chinsoft) + 项目名(javas e) + 模块名(chapter17) + 功能名(homework)

例如:com.chinsoft.javase.chapter17;

import:当需要使用的类在不同包下时,需要使用import导包。

java.lang.*这个包下的类不需要使用import导入(*形式的效率低)。

访问控制权限

在这里插入图片描述

范围:public > protected > 默认 > private

Object类

常用的方法:

protected Object clone();//负责对象克隆的。

int hashCode();//获取对象哈希值的一个方法。(通过哈希算法将对象地址转化为一串数字)

boolean equals(Object obj);//判断两个对象是否相等。(自己创建的类建议都重写equals方法)

String toString();//将对象转换成字符串形式

protected void finalize()//垃圾回收器负责调用的方法(垃圾回收器GC回收的时候自动调用,垃圾回收时机 )

匿名内部类

  1. 什么是内部类?

​ 内部类:在类的内部又定义了一个新的类。被称为内部类。

  1. 内部类的分类:

    静态内部类:类似于静态变量。

    实例内部类:类似于实例变量。

    局部内部类:类似于局部变量。

计算方法(匿名内部类实现):

不建议使用匿名内部类,因为没有名字,不能重复使用,代码太乱,可读性差。

能看懂以后别人写的匿名内部类即可

//计算接口
public interface Compute {
    int sum(int a,int b);
}
//MyMath类
public class MyMath {
    public void mySum(Compute c,int x,int y){
        int retValue =c.sum(x, y);
        System.out.println(x+"+"+y+"="+retValue);
    }
}
//主函数入口
//匿名内部类
public class Test {
    public static void main(String[] args) {
        MyMath mm = new MyMath();
        Compute c = new ComputeImpl();
        //mm.mySum(c, 100, 200);
        mm.mySum(new Compute() {//匿名内部类,能看懂即可
            @Override
            public int sum(int a, int b) {
                return a+b;
            }
        }, 100, 200);

    }
}

最后

以上就是糊涂小海豚为你收集整理的JavaSE进阶回顾第一天的全部内容,希望文章能够帮你解决JavaSE进阶回顾第一天所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部