面向对象

简介: 面向对象

构造方法

Java 构造方法有以下特点:

方法名必须与类名相同

没有任何返回值,包括 void

构造方法中不能有return语句

可以有 0 个、1 个或多个参数

默认返回类型就是对象类型本身

只能与 new 运算符结合使用

注意事项:

1.如果自己没写构造方法,系统会默认一个无参的构造方法。供我们创建对象使用

2.如果我们写了构造方法,那么系统就不再提供空参的构造方法了


方法重载

同一类中方法名相同

参数列表不同(参数的个数不同,或数据类型不同)

方法返回值类型、修饰符等,与方法重载没有任何关系


方法重写

1.方法重写时, 方法名与形参列表、返回值类型必须一致。

2.方法重写时,子类的权限修饰符必须要大于或者等于父类的权限修饰符。

3.方法重写时,子类的返回值类型必须要小于或者 等于父类的返回值类型。

4.方法重写时, 子类抛出的异常类型要小于或者等于父类抛出的异常类型。 Exception(最坏) RuntimeException(小坏)

注意事项:

重写的方法可以使用 @Override 注解来标识。

父类的成员方法只能被它的子类重写。

声明为 final 的方法不能被重写。

声明为 static 的方法不能被重写,但是能够再次声明。

构造方法不能被重写。

子类和父类在同一个包中时,子类可以重写父类的所有方法,除了声明为 private 和 final 的方法。

子类和父类不在同一个包中时,子类只能重写父类的声明为 public 和 protected 的非 final 方法。

如果不能继承一个方法,则不能重写这个方法。


Super关键字

访问父类成员(方法和属性)

Final关键字

Final修饰的类(最后一个),不能被继承

修饰的方法,不能被重写


访问符

四种修饰符的访问权限

由大到小public>protected>default>private

public:对所有类可见

protected:对同一包中的类可见、对同一包及不同包中的子类可见

default:对同一包中的类可见、对同一包中的子类可见

private:仅对类本身可见


this的三种用法

调用成员变量

调用成员方法

调用构造方法


static关键字

修饰的变量或方法不用实例化对象就可以调用

类名.方法名()或类名.变量名=赋值

static只能修饰成员变量,不能修饰局部变量

什么时候使用?

当一个变量被共享的时候

补充:成员变量和局部变量的区别

1.在类中的位置不同

成员变量:类中方法外

局部变量:方法定义中或者方法声明上

2.初始化值不同

成员变量:有默认值

局部变量:没有默认值,必须定义,赋值,然后才能使用


继承extends

特点:只支持单继承,但可以多层继承。

继承父只能使用父类的公共成员。

每个类都默认继承了0bject类


抽象abstract

什么是抽象类:

当我们进行父类抽取的时候,有些方法具体每个子类的实现方式都不太一样时。那么这个时候,就应该把这个方法定义成抽象方法。有抽象方法的类一定是抽象类。

注意事项:

抽象类不能直接实例化对象使用


接口interface

定义:

// 常量

public static final int id =1;

//抽象方法

public abstract void eat();

//默认方法

public default void Type(String type) {

System.out.println(type);

}

//静态方法

public static int getId() {

return id;

}


接口与类的区别:

接口不能用于实例化对象。

接口没有构造方法。

接口中所有的方法必须是抽象方法。

接口不能包含成员变量,除了 static 和 final 变量。

接口不是被类继承了,而是要被类实现。

接口支持多重继承。

特点:

1.方法,语法 public abstract(只能是 public abstract)。

2、接口中变量,语法: (只能是public static final,默认的可以省略 )变量

3、接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。


抽象类和接口的区别

1.抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法无方法体。

2.抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。

3.接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。

4.一个类只能继承一个抽象类,而一个类却可以实现多个接口。

接口与类的关系

Implement实现接口,可以实现多接口

接口与接口的关系

继承关系


多态

前提条件:

1.要有继承(或实现接口)的关系

2.要有方法重写

3.要有父类引用指向子类对象

如:Animal a = new Dog();

关键字:instanceof

用于判断左边的引用是否为右边的对象类型

Animal a = new Dog();


If(a instanceof Dog)

向上转型:父类引用指向子类对象Animal a = new Dog();

向下转型:

Dog d = (Dog) a

成员内部类

//访问内部类成员

Outer.Inner in = new Outer().new Inner();


API

replace()替换

reverse()反转


String与stringBuffer

1.Character 是进行单个字符操作的,

2.String 对一串字符进行操作。不可变类。+连接字符串

3.StringBuffer 也是对一串字符进行操作,但是可变类。append()拼接,可以反转reverse();


StringBuffer str2 = new StringBuffer(“peOple”);

//StringBuffer转换String

//方法一

String str1 = new String(str2);

//方法二

String str1 = str2.toString();

//string转StringBuffer

StringBuffer str2 = new StringBuffer(str1);


例题.计算从今天是算起,170天以后是几月几号,并格式化成XXXX年XX月XX日的形式输出。

提示:

① 调用Calendar类的add方法计算170以后的日期。

② 调用Calendar类的getTime方法返回Date类对象

使用SimpleDateFormat类的对象调用format方法输出指定格式的日期

public static void main(String[] args) {
    //获取当前时间
    Calendar c = Calendar.getInstance();
    c.add(Calendar.DATE,170);
    Date date = c.getTime();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
    System.out.println(sdf.format(date));
  }

例题.计算2021年4月25日和2020年7月8日之间间隔的天数。

提示:

① 创建SimpleDateFormat类的对象,指定日期格式化的格式

② 按照指定格式从键盘上输入日期字符串(和上面指定格式一致)

③ 用SimpleDateFormat类的对象将输入日期字符串转换为Date类的对象

④ 用Date对象的after方法求出天数差。

public static void main(String[] args) throws ParseException {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入第一个日期格式:2021-4-25");
    String str1 =sc.next();
    System.out.println("请输入第二个日期格式:2020-7-8");
    String str2 =sc.next();
    //SimpleDateFormat类的对象将输入日期字符串转换为Date类的对象
    Date date1 = sdf.parse(str1);
    Date date2 = sdf.parse(str2);
    int sum;
//    date1.after(date2)如果date1比date2大,返回true,否则返回false
    if(date1.after(date2)) {
      sum = (int)((date1.getTime()-date2.getTime())/(1000*3600*24));
    }else {
      sum = (int)((date2.getTime()-date1.getTime())/(1000*3600*24));
    }
    System.out.println("2021年4月25日和2020年7月8日之间间隔的天数是"+sum);
  }

回文数

//输入一个字符串判断是否是回文

//回文数:一个字符串反转过来和原来字符串一样

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入一个字符串");
    String str = sc.next();
    StringBuffer sb = new StringBuffer(str);
    //反转过来
    sb.reverse();
    int count = 0;
    //判断反转过来的每个字符和原来的是否都相等,统计相等的个数
    //charAt()方法返回指定索引位置的char值。索引范围为0~length()-1.
    for (int i = 0; i < str.length(); i++) {
      if (str.charAt(i) == sb.charAt(i)) {
        count++;
      }
    }
    //相等的个数与原来的字符串长度是否一致
    if (count == str.length()) {
      System.out.println(str+"-是一个回文字符串");
    } else {
      System.out.println(str+"-不是一个回文字符串");
    }
  }
目录
相关文章
|
设计模式 Java C#
浅谈面向对象
浅谈面向对象
|
6月前
|
Java 编译器
面向对象篇
面向对象篇
|
6月前
|
C语言 C++
【c++】什么是面向对象
【c++】什么是面向对象
【c++】什么是面向对象
|
Java
1.7 面向对象
1.7 面向对象
53 0
再次认识面向对象
再次认识面向对象
49 0
面向对象(1)
面向对象(1)
74 0
C#面向对象知识
C#面向对象知识
47 0
|
存储 搜索推荐 编译器
C++ 面向对象篇
C++程序在执行时,将内存大致分为四个区域; - 代码区:存放函数体的二进制代码,操作由系统管理 - 全局区:存放全局变量和静态变量以及常量 - 栈区:由编译器自动分配释放,存放函数的参数值(形参),局部变量等 - 堆区:由程序员分配和释放,若程序员不手动释放,系统在程序结束时自动回收
150 0
|
Java
2. 面向对象(三)
2. 面向对象(三)
150 0
|
Java 编译器
初识面向对象上
初识面向对象上
124 0
初识面向对象上