Java面向对象- -day4

本文详细介绍了Java中的接口概念,包括接口的创建、常量和抽象方法定义,接口的继承,以及接口与类的关系。同时涵盖了函数式接口、内部类(局部和静态)的概念,以及值传递与引用传递的区别,以及String类型的只读性和常量池的使用。

接口的定义

接口可以看成是特殊的抽象类。

接口使用interface关键字创建。

接口中只能定义常量和抽象方法


接口中接口的实现—implements关键字


一个类可以实现多个接口,多个接口之间用逗号分隔。这个类需要实现所有接口的抽象方法。
接口可以作为一种类型声明变量,一个接口类的变量可以引用实现了该类的对象。通过该引用,调
用接口中的方法

// 定义接口: 常量, 抽象方法。
public interface Fly {
  public static  final  int  LIFE= 100; // 生命值
  public abstract  void fly(); // public abstract -- 接口中的方法,默认就是公
开,抽象的,所有省略这两个关键字。
  void fly(String good);// 借助于什么力量飞行
}
interface Run{
  public static  final  int  LIFE= 100; // 生命值
  void  run();
}
// 定义一个人类实现接口(Run)
abstract class Person implements Run{
}
1.3接口的继承
接口间可以存在继承关系,一个接口可以通过extends关键字继承另外一个接口。
子接口继承了父接口中定义的所有方法。
class Doctor extends  Person{
  @Override
  public void run() {
 }
}
// 定义一个鸟类实现接口(Fly , Run)
class  Bird implements Fly , Run{
  @Override
  public void fly() {
    System.out.println("鸟在天上飞。。。");
 }
  @Override
  public void fly(String good) {
    System.out.println("鸟吃了:" + good +" , 可以飞......");
 }
  @Override
  public void run() {
    System.out.println("鸟有时候跑.............");
 }
}
class TestBird{
  public static void main(String[] args) {
    // 1. 创建鸟,赋值给鸟类型,调用其所有方法
    Bird b = new Bird();
    b.fly();
    b.fly("虫子");
    b.run();
    // 2. 创建鸟,赋值给Fly类型,调用其所有方法
    Fly b1 = new Bird();
    b1.fly();
    b1.fly("玉米");
    // 3. 创建鸟,赋值给Run类型,调用其所有方法
    Run b2 =new Bird();
    b2.run();
 }
}

接口的继承

接口间可以存在继承关系,一个接口可以通过extends关键字继承另外一个接口。
子接口继承了父接口中定义的所有方法。

// 接口,可以通过extends,实现继承多个接口。
interface YunDonYuan extends  Run , Fly{ // 继承之后,就有三个方法。
  void excise(); // 练习
  void test(); // 考试
}
// 练习: 定义一个People类型, 具有 : 名字, 性别, 身份证号码
class  People{
1.4函数式接口
2.内部类的定义
一个类可以定义在另外一个类的内部,定义在内部的类称为内部类,其所在的类称之为外部类。
定义在内部的类,一般只服务于其外部类,对外部类具备可见性,内部类可以直接使用外部类的成
员及方法。
  String name;
  String sex;
  String id;
}
class TestPinPang{
  public static void main(String[] args) {
    People  p1= new PinPang();
    YunDonYuan p2 =new PinPang();
    Fly p3 = new PinPang();
    Run p4 = new PinPang();
    PinPang p5 = new PinPang();
 }
}
// 练习: 定义一个游泳运动员: 队员编号 ,身高, 体重 , 继承Pople , 实现YunDonYuan接
口 ,定义一个根据不同的泳姿游泳的方法。
//    然后创建游泳运动员对象,分别赋值给自己和父类的引用。
// 练习: 定义一个乒乓球运动员,具有:队员编号 ,身高, 体重 , 继承Pople , 实现
YunDonYuan接口 , 再定义方法: 比赛。
class PinPang extends  People implements  YunDonYuan{
  String code; // 队员编号
  double high; // 身高
  double weight; // 体重
  public  void biSai(){
 }
  // 需要实现父类中的素有抽象方法。
}

函数式接口

// 注解:可以放在方法的前面, 类前面, 变量的前面。
//   ** 有特殊的功能,对类, 方法, 变量进行一些作用。
@FunctionalInterface  // 函数式接口 , 使用这个注解之后, 接口内部只能有一个抽象方法。
public interface Eat {
  public abstract  void  eat();
}

内部类的定义

一个类可以定义在另外一个类的内部,定义在内部的类称为内部类,其所在的类称之为外部类。
定义在内部的类,一般只服务于其外部类,对外部类具备可见性,内部类可以直接使用外部类的成
员及方法。

通常内部类不能独立于外部类存在, 通过外部类对象,创建内部类对象,如下语法规则:

Outer outer=new Outer();
Inner inner=outer.new Inner();
public class Outer { // 外部类
  int x;
  int y;
  public  void  print(){
    System.out.println("["+x+","+y+"]");
 }
  class  Inner{ // 内部类
    public int sum(){
      print();  // 内部类, 可以直接使用外部类的成员方法
      return  x +y; // 内部类,可以直接使用外部类的成员变量。
   }
 }
}
class  TestInner{
  public static void main(String[] args) {
    // 内部类Inner对外不可见。
   // Inner i = new Inner();
    Outer outer =new Outer();
    outer.x = 10 ;
    outer.y = 10;
    Outer.Inner inner = outer.new Inner();
    int sum = inner.sum();
    System.out.println("和:" + sum);
 }
}

匿名内部类的定义

如果在一段程序中需要创建一个类的对象(通常这个类需要实现某个接口或者继承某个类),而且
对象创建后,这个类的价值也就不存在了,这个类可以不必命名,称之为匿名内部类。

import java.util.Timer;
import java.util.TimerTask;
public class TimerDemo1 {
  public static void main(String[] args) {
    Timer t = new Timer();
    // TimerTask是一个抽象类。
    // ** 这里使用了匿名内部类。
    t.schedule(new TimerTask() {
      @Override
      public void run() {
        System.out.println("该起床了");
     }
   } , 1000 , 5000);

局部内部类

定义在方法中的类,称为局部内部类

public class Outer1 {
    public void fun(){
        //定义在方法中的类成为局部内部类
        class Inner{
            public void fun(){
                System.out.println("这是局部内部类");
            }
        }
        //局部内部类只能用在所在成员的内部方法中
        Inner inner=new Inner();
        inner.fun();
    }
}
class TestDemo{
    public static void main(String[] args) {
        Outer1 outer1=new Outer1();
        outer1.fun();
    }
}

静态内部类

使用static修饰的成员内部类称为静态内部类,在外部类加载时存在

public class Outer3 {
    //static修饰可以通过类名调用
    static class Inner{
        public void fun(String str){
            System.out.println("这是静态内部类"+str);
        }
    }
    public void fun(){
        System.out.println("这是一个普通方法");
    }

    public static void main(String[] args) {
        //完整写法
        Inner inner=new Outer3.Inner();
        inner.fun("hello");
        //静态内部类随着外部类的加载而存在,可以直接通过new创建对象
        new Inner().fun("hello  world");
        //普通方法
        Outer3 outer3=new Outer3();
        outer3.fun();
        //对象.方法名
        new Outer3().fun();

    }
}

值传递和引用传递

如果一个方法的参数为引用类型,直接修改该参数会对其造成影响。
如果一个方法的参数为引用类型,该方法中又创建了新对象,不会对实际参数造成影响。
如果一个方法的参数为字符串,该方法中赋值了一个新字符串,不会对实际参数造成影响
如果一个方法的参数为原始类型,该方法不会对实际参数造成影响。

String类型分析

从源码可以看到java.lang.String 是被final修饰的,所以,字符串对象一旦创建就不可变。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {

    @Stable
    private final byte[] value;

    
    private final byte coder;

  
    private int hash; // Default to 0

  
    private static final long serialVersionUID = -6849794470754667710L;

   
    static final boolean COMPACT_STRINGS;
  1. 字符串对象具有只读特性,任何对字符串的操作实际上是对其引用的操作。
  2. 字符串提供了toString(),equals(),hashCode()方法的重写

字符串常量池

常量池在JVM的堆内存区中

直接使用双引号声明出来的String对象会直接存储在常量池中。

如果不是用双引号声明的String对象,可以使用String提供的intern()方法

// *** 字符串常量池。
public class Demo1 {
  public static void main(String[] args) {
    // 字符串对象
    String str = "a"; // str是一个引用你该地址, 指向对象。
    String str1 = new String("a"); // str1是一个引用你该地址, 指向对象。
    String str2 = "a" ;// 到常量池,找是否有对象”a“ ,找到了就把引用该地址赋值给
str2. 找不到就再常量池创建这个对象。然后把地址赋值为str2.
    String str3 = new String("a"); // new , 就创建对象。
    // 等号就是再比较对象的引用地址是否相同。
6.2引用传递分析
6.3String类型的分析
7.作业
    System.out.println(str == str1); // false
    System.out.println(str == str2); // true
    System.out.println(str == str3); // false
    System.out.println(str1 == str3); // false
 }
}

 

### Java面向对象编程中常用的类 #### 1. **Object 类** `Object` 是所有 Java 类的祖先(根基类),每个类都隐式或显式地继承自 `Object` 类。这意味着所有的 Java 对象都可以调用 `Object` 中定义的方法,例如 `toString()`、`equals(Object obj)` 和 `hashCode()` 等方法[^1]。 以下是 `Object` 类的一些常用方法: - `public String toString()`: 返回该对象的字符串表示形式。 - `public boolean equals(Object obj)`: 判断当前对象是否等于指定的对象。 - `protected void finalize() throws Throwable`: 当垃圾回收器决定释放此对象所占用的空间时,会自动调用此方法。 - `public int hashCode()`: 返回该对象的哈希码值。 这些方法通常会被子类重写以适应特定的需求。 --- #### 2. **String 类** `String` 类用于处理不可变的字符序列。它是 Java 编程中最常使用的类之一。由于其不可变性,在多线程环境中非常安全[^2]。 一些常见的操作包括: - 字符串连接:通过 `+` 或者 `concat(String str)` 方法完成。 - 子串提取:使用 `substring(int beginIndex, int endIndex)` 方法。 - 大小写转换:利用 `toLowerCase()` 和 `toUpperCase()` 方法。 示例代码如下: ```java String greeting = "Hello"; System.out.println(greeting.toUpperCase()); // 输出 HELLO ``` --- #### 3. **Integer 类和其他包装类** `Integer` 是基本数据类型 `int` 的包装类。它提供了许多有用的静态方法来处理整数类型的数值运算和转换[^3]。 其他类似的包装类还包括: - `Boolean` (对应布尔类型) - `Double`, `Float` (对应浮点类型) - `Character` (对应字符类型) 以下是一个简单的例子展示如何创建并比较两个 `Integer` 对象: ```java Integer a = new Integer(42); Integer b = Integer.valueOf("42"); if (a.equals(b)) { System.out.println("Values are equal."); } ``` --- #### 4. **ArrayList 类** `ArrayList` 属于集合框架的一部分,实现了动态数组的功能。它可以存储任意数量的对象,并允许随机访问其中的元素。 主要特点有: - 动态调整大小。 - 提供快速的随机访问能力。 - 不适合频繁插入删除场景下的性能优化需求。 实例化方式以及常见操作演示: ```java import java.util.ArrayList; ArrayList<String> list = new ArrayList<>(); list.add("Apple"); // 添加元素 list.remove(0); // 移除索引位置上的元素 for (String item : list) { System.out.println(item); } ``` --- #### 5. **HashMap 类** `HashMap` 实现了基于键值对的数据结构——散列表。它的特点是能够高效地执行查找、插入和删除操作。 典型用途包括缓存机制的设计或者关联不同实体之间的映射关系。下面是一段简单程序片段用来初始化一个 HashMap 并对其进行查询: ```java import java.util.HashMap; HashMap<Integer, String> map = new HashMap<>(); map.put(1, "One"); map.put(2, "Two"); // 查询是否存在某个 key-value pair if (map.containsKey(1)) { System.out.println(map.get(1)); // 输出 One } ``` --- #### 6. **Date 和 Calendar 类** 时间日期相关的处理经常需要用到 `Date` 及其改进版本 `Calendar` 来获取系统当前时间和日期信息。 虽然现代项目更倾向于采用 JSR-310 定义的新 API (`LocalDateTime`) 替代旧有的 Date/Time 库,但在遗留代码里仍然广泛存在这两种传统实现方式。 样例代码如下所示: ```java import java.util.Date; import java.util.Calendar; Date today = new Date(); Calendar cal = Calendar.getInstance(); cal.setTime(today); System.out.println(cal.YEAR + "-" + cal.MONTH + "-" + cal.DAY_OF_MONTH); ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值