12.13 Java基础11

  • 考试题目讲解(对周末所做错题总结的补充)

1.以下程序输出结果为? String s = null; System.out.println(s);

A.不输出

B.空字符串

C.null

D.编译出错

// 声明 引用类型的默认值为null
    static Person p; //类变量

    public static void main(String[] args) {

        String s = null;
        System.out.println(s);

    }

2.以下说法正确的是
A、不需要定义类,就能创建对象
B、对象一经声明就可以立即使用(声明:Age a;)
C、Java中的方法参数如果是对象,那么形参的变化会原样反应到实参上(相关内容还没教,要等到讲String)
D、new操作符动态地为对象按其指定的类型分配内存 ,并返回该类型的一个引用

3. 面向对象语言比面向过程语言更为高级,更有效率 

A.对

B.错误(前半句可以说对,毕竟面向对象比面向过程少了指针这个麻烦,不过面向对象语言Java是编译型语言,效率比面向过程的汇编语言譬如C语言之类的底层语言要低。)

4.覆盖的方法和被覆盖的方法必须具有完全相同的方法名、参数列表和返回类型

A.对

B.错误(如果返回值类型为引用类型,子类方法的返回值类型要比父类小那也是重写,也就是方法的覆盖返回值类型不一定要完全相同。)

5.如果类中的成员变量只可以被同一包访问,则使用private约束符

A.对

B.错误(如果类中的成员变量只可以被同一包访问,要使用的约束符是default或者protected。)

6.abstract的method是可同时是static

A.对

B.错误(static修饰的方法可以用类名调用,对于abstract修饰的方法没有具体的方法实现,所以不能直接调用,也就是说abstract可以与static共存。)

 

  • 上周知识点回顾
  • OOP三个特征
  1. 封装:将类的内部细节隐藏起来,private私有化属性,提供公共的方法来访问私有的属性。
  2. 继承:如果A是B,那么我们称A为子类,B为父类。 A is B ; 公交车 是 交通工具  吗?
    子类继承父类的非私有的成员。构造方法不能被继承。
    重写子类中定义一个方法,修饰符,返回值类型,方法名,参数列表都一致,一定是重写。
    不过如果返回值类型为引用类型,子类方法的返回值类型要比父类小也是重写,比如object和String
    方法的访问权限修饰符:子类修饰符必须大于或者等于父类方法的访问修饰符
    super:作用:出现在子类中,去调用父类的构造 super();  super.属性或者super.方法
  3. 多态 不同对象对同一个消息作出不同的响应,过程和结果都不同。
    new出来的多个对象-》方法名相同-->方法实现上有差异. 比如说吃eat,有狼吞虎咽,也有细嚼慢咽
    实现1: 父类,父类有一个方法eat; 子类重写父类eat的方法. 场景中有一个方法,参数是父类引用;
    实际执行的时候,传递的是子类对象。传递哪个子类,调用就是哪个子类的方法
    实现2:接口,之后再说
  4. 如果要问面向对象的四大特征,那就除了封装、继承和多态,就要提到抽象。

    抽象:对象->类  从许多对象中去提取公共的属性和方法并形成类的过程,称为抽象。

  • 抽象类与接口
  • 抽象类

如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类,必须用abstract关键字来修饰。

[访问权限] abstract class 类名 {

  成员列表

  }

没有功能主体的方法称为抽象方法,也必须用abstract关键字来修饰,只有方法声明,没有方法体,且必须定义在抽象类中

abstract意思是说,我不实现,子类去实现。

  • 特点

抽象类不可以被实例化,也就是不可以用new创建对象 ,但有构造方法,是为了让子类进行初始化

抽象类通过其子类实例化,而子类需要覆盖掉抽象类中所有的抽象方法后才可以创建对象,否则该子类也是抽象类。

方法只有声明没有实现时,该方法就是抽象方法,需要用abstract来修饰,抽象方法必须定义在抽象类中,该类也必须被abstract来修饰。

抽象方法必须定义在抽象类中。但是抽象类中不一定有抽象方法,抽象类也可以有成员属性和非抽象的成员方法

  • abstract与其他修饰符的关系:

    finalabstract不能共存:

    final修饰代表不可以继承,修饰方法不可重写。

    abstract修饰类就是用来被继承的,修饰方法就是用来被重写的

    static修饰的方法可以用类名调用,对于abstract修饰的方法没有具体的方法实现,所以不能直接调用,也就是说abstract可以与static共存

    private修饰的只能在本类中使用,abstract方法是用来被子类进行重写的,有矛盾所以不能共存。

  • 抽象类与普通类的异同

相同点:抽象类和普通类都是用来描述事物的,都在内部定义了成员。

不同点

普通类有足够信息来描述事物,抽身象类描述事物的信息有可能不够充足

普通类不能定义抽象方法,只能定义普通方法,抽象类中可以定义抽象方法,同时也可以定义普通方法

普通类可以被实例化,抽象类不可以被实例化

  • 为了方便理解抽象,我们可以联想到新版愚公移山。 移山(方法) 不实现 让儿子实现 儿子也可以选择不实现,继续交给它的子类去实现。。
  • 抽象练习

    1.定义抽象类MyShape(图形)

        定义抽象方法获取图形的长度和面积

    2.定义子类Rect继承父类MyShape  

         定义自身特有的长和宽(成员变量)  width height;

         实现父类未实现的函数。

    3.定义子类 Circle实现父类MyShape

         定义自身特有的半径和圆周率(使用常量)实现父类为实现的方法。

代码:

public abstract class MyShape {

    // 抽象方法获取图形的周长和面积
    // 周长
    public abstract void getGirth();

    // 面积
    public abstract void getArea();

}

public class Rect extends MyShape {

    // 长方形的长和宽
    private double height;
    private double width;

    public Rect() {
        // TODO Auto-generated constructor stub
    }

    public Rect(double height, double width) {
        super();
        this.height = height;
        this.width = width;
    }

    public double getHeight() {
        return height;
    }

    public void setHeight(double height) {
        this.height = height;
    }

    public double getWidth() {
        return width;
    }

    public void setWidth(double width) {
        this.width = width;
    }

    @Override
    public void getGirth() {
        // TODO Auto-generated method stub
        double result = 2 * (width + height);
        System.out.println("长方形的周长为" + result);
    }

    @Override
    public void getArea() {
        double result = width * height;
        System.out.println("长方形的面积为" + result);
    }
}

 

public class Circle extends MyShape {
    private double r;// 半径
    // 使用常量 final ->这个值只是我们内部用的,也不会setter和getter来封装了
    private final double pi = Math.PI;

    public Circle() {
        // TODO Auto-generated constructor stub
    }

    public Circle(double r) {
        super();
        this.r = r;
    }

    public double getR() {
        return r;
    }

    public void setR(double r) {
        this.r = r;
    }

    @Override
    public void getArea() {
        // bigdecimal
        // string
        double result = pi * Math.pow(r, 2);
        System.out.println("圆的面积为" + result);

    }

    @Override
    public void getGirth() {
        double result = 2 * pi * r;
        System.out.println("圆的周长为" + result);

    }
}

 

public class TestShape1 {

    public static void main(String[] args) {
        MyShape c = new Circle(5);
        c.getArea();
        c.getGirth();

        Rect rect = new Rect();
        rect.setHeight(10);
        rect.setWidth(5);
        rect.getArea();
        rect.getGirth();
    }
}

 

案例:

/**
 * 形状类: ->周长,面积. 我说的这个形状类的周长是怎么计算?面积怎么实现?
 * 每个形状都会有自己周长和面积,但是当我们说概念比较大的时候,不能确定形状,周长和面积也就不好确定.
 * 
 * 通常用来做模板.
 * 
 * @author Administrator
 *
 */
public abstract class Shape {

    public Shape() {
        System.out.println("无参数构造");
    }

    // 抽象方法不用去实现 ,不用写 { }
    // abstract 修饰符
    // 这个类,只是许了一个愿.没有实现. 子类去实现.
    public abstract void getGirth();
}
/**
 * 子类继承抽象的父类,重写了抽象方法: getGirth()
 * 
 * @author Administrator
 *
 */
//class Circle extends Shape {
//
//    private double r;
//
//    public double getR() {
//        return r;
//    }
//
//    public void setR(double r) {
//        this.r = r;
//    }
//
//    public Circle() {
//        // TODO Auto-generated constructor stub
//    }
//
//    public Circle(double r) {
//        super();
//        this.r = r;
//    }
//
//    // alt+/
//    @Override
//    public void getGirth() {
//        // 周长
//
//        System.out.println(3.14 * r * 2);
//
//    }
//}

/**
 * 子类继承父类 也可以不实现抽象方法,继续抽象.
 * 
 * @author Administrator
 *
 */
abstract class SubShape extends Shape {

}

备注:抽象类是类中的一个特例,类有的:普通属性,静态属性,构造方法,普通方法,静态方法它都可以有.普通代码段,静态代码段也有,除此之外,它还可以有抽象方法。

final修饰类: 一人吃饱,全家不饿,要什么老婆,要什么孩子. 丁克。  这个类不能被继承
final abstract 不能同时用来修饰类

public abstract class A {

    // 1 普通属性
    private int a;

    // 2静态属性
    public static int b = 1;

    // 3可以有构造方法
    public A() {
        // TODO Auto-generated constructor stub
    }

    // 4 抽象方法
    // final 这个类不能被重写.
    // static 类有,又抽象?
    public abstract void test1();

    // 5.普通方法
    public void test2() {

    }

    // 6. 静态方法
    public static void test3() {

    }

    static {
        System.out.println("普通代码段");
    }

    {
        System.out.println("普通代码段");
    }
}

 

  • 接口

Java接口是一系列方法的声明,是一些抽象的集合,一个接口只有抽象方法(只有定义而没有被实现),没有方法的实现。简言之,接口就是特殊的抽象类,即所有方法都是抽象方法的抽象类就是Java中的接口。

  • 格式

 [修饰符]   interface   接口名{

  [public] [static] [final] 数据类型 变量名;

  [public] [abstract] 方法( );

}

 

接口中的成员修饰符是固定的

公共静态的常量 public static final 修饰的变量变常量,该值不能改变,只能读。声明成员变量列表时,即便没有修饰符,它们也是public static final的,这是固定的。

修饰符:可选,用于指定接口的访问权限,可选值为public。即使省略,也依然是public abstract(公共抽象方法)的。(jdk1.8之后一个默认方法: 使用default关键字来修饰的方法)

接口中可以包含: 静态方法

接口名:必选参数,用于指定接口的名称,接口名必须是合法的Java标识符。一般情况下,要求首字母大写。

示例:

public interface IMonkey {

    // final field 使用final修饰的属性,表示是一个常量
    // The blank final field a may not have been initialized
//    int a;

    int A = 1;
    // Illegal modifier for the interface field IMonkey.B;
    // only public, static & final are permitted
//    private static int B =2;

    public static int B = 2;

    static final int C = 3;

    public static final int D = 4;

    // 抽象方法
    void test1();

    abstract void test2();

    public abstract void test3();

    // Abstract methods do not specify a body
    // jdk1.8之后可以有一个默认的方法
    default void test4() {
        System.out.println("default");
    }

    // 静态方法 ->IMonkey 接口所有
    public static void test5() {
        System.out.println("静态方法");
    }
}

  • 类与接口的关系

[访问权限修饰符] class 类名 [extends 父类名] [implements 接口列表]{  

     必须重写接口中的方法( ){ }

   }

类与接口之间是实现关系,类实现接口(多实现),避免了单继承的局限性

接口不可以被实例化。

实现了接口的实现类必须重写接口中所有抽象方法后,这个子类才可以被实例化否则子类也需要声明为抽象类,不然会报错。

一个类可以实现多个接口,多个接口用逗号分隔。

一个类在继承另一个类同时,还可以实现多个接口。

  • 接口与接口的关系

 

[修饰符]   interface 接口名  extends   接口名,接口名 {

      接口中的方法( ){

      }

   }

接口与接口之间是继承关系,而且可以多继承。

  • 接口与抽象类的区别

abstract class

interface

属性

不用限制

public 静态 final 常量

构造方法

可有可无

没有

普通方法

可以有具体方法

必须是public抽象方法

子类

单一继承

多重实现(接口继承接口时为多重继承)

抽象类是继承 is a关系 (所属关系)在定义该体系的基本共性内容

接口是实现是like a关系(不所属关系)在定义该体系额外功能

  • 接口可实现多继承的原因

Java类的继承是单一继承,Java接口的继承是多重继承;

接口可实现多继承原因分析:

不允许类多重继承的主要原因是,如果A同时继承B和C,而B和C同时有一个D方法,A无法确定该继承哪一个

接口全都是抽象方法,不存在实现冲突,继承谁都可以,所以接口可继承多个接口。

 

  • 类与类之间的关系
  • 类之间的关联关系-一对一:关联表示has-a关系,如学生拥有个课程,往往表现为B作为A的属性存在(A关联B)

public class Boy {
    private Girl girl;
    private int years;
    
    public Boy() {
        super();
    }
}

当然,如果是一对多的关系,比如一个人可以有多个荣誉证书,我们可以使用数组或集合来描述这个关系。

  • 依赖关系

依赖关系是一种使用关系,特定事物的改变有可能会影响到使用该事物的事物。所谓依赖就是某个对象的功能依赖于另外的某个对象,而被依赖的对象只是作为一种工具在使用,而并不持有对它的引用。

依赖体现了“ use a”关系,依赖关系一般使用方法的参数体系。

public class Vehicle {
    private double weight;
    private String brand;
    
    public Vehicle() {
        // TODO Auto-generated constructor stub
    }
    
    public void crush() {
        System.out.println("挖掘机压过路面");
    }
}

 

public class Boy1 {
    private String name;

    public Boy1() {
        // TODO Auto-generated constructor stub
    }

    public void drive(Vehicle v) {//改变挖掘机的状态 开起来
        v.crush();//相关改变的操作
    }
}

  • 包的命名规范

第一级 指该项目的类型,如com,org,gov等,

第二级 指项目所开发或者运行的公司名称,如:chinasofti,icss,huawei,etc等

第三级 指项目的名称,如:corejava,bcms,oa,erp等

第四级 指项目模块的名称,如:bean,action,exception,oop01等

 

  • 成员访问控制符总结如下:

相关导入关键字 import

public访问权限范围(其他项目引用需要封装成jar文件):

可访问当前类,同一个包的其他类,不同包的子类,不同包的其他类。

protected访问权限范围:

可访问当前类,同一个包的其他类,不同包的子类。

default访问权限范围:

可访问当前类,同一个包的其他类。

private访问权限范围:

仅可访问当前类。

 

感想:今天讲的有点多,课上还犯困了,不过看着ppt还是能懂,代码好敲。继续努力,回家看final和static关键字用法,明天老师要讲。

19:05:57 2021-12-13

posted on 2021-12-13 19:05  heyiyang1312  阅读(11)  评论(0)    收藏  举报

导航