当前位置: 代码迷 >> 综合 >> day03 面向对象 ---- java基础篇
  详细解决方案

day03 面向对象 ---- java基础篇

热度:41   发布时间:2023-12-18 04:45:38.0

目录

单例设计模式

final关键字

接口 interface

Java的单继承

Java三大特征之多态


  • 单例设计模式

package com.java.test;/*单例设计模式:保证一个类在内存中只有一个对象。模式:模式就是解决 一类 问题的固定步骤 。模式的概念最早起源于建筑行业....建房子的步骤都是一样子:打地基-----> 浇柱子------->盖楼面--------->砌墙--------->封顶---->装修-----入住单例设计模式的步骤:	懒汉单例设计模式:1. 私有化构造函数。2. 声明本类的引用类型变量,但是不要创建对象,3. 提供公共静态 的方法获取本类 的对象,获取之前先判断是否已经创建了本类 对象,如果已经创建了,那么直接返回对象即可,如果还没有创建,那么先创建本类的对象,然后再返回。推荐使用: 饿汉单例设计模式。  因为懒汉单例设计模式会存在线程安全问题,目前还不能保证一类在内存中只有一个对象。*/public class Demo01 {public static void main(String[] args) {}
}/** 饿汉式 1 静态常量【可用】* * 饿汉单例设计模式 步骤: 1. 私有化构造函数。 2. 声明本类的引用类型变量,并且使用该变量指向本类对象。 3. 提供一个公共静态的方法获取本类的对象。* 优点:这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。 缺点:在类装载的时候就完成实例化,没有达到Lazy* Loading的效果。如果从始至终从未使用过这个实例,则会造成内存的浪费。*/
class Single {// 1.私有化构造函数private Single() {}// 2. 声明本类的引用类型变量,并且使用该变量指向本类对象。private final static Single STE = new Single();// 3.提供一个公共静态的方法获取本类的对象。public static Single get() {return STE;}}/** 饿汉式2 静态代码块 【可用】*/
class Single02 {// 2. 声明本类的引用类型变量,并且使用该变量指向本类对象。private static Single02 instance;static {instance = new Single02();}// 1.私有化构造函数private Single02() {}// 3.提供一个公共静态的方法获取本类的对象。public static Single02 GetInstance() {return instance;}}/** 懒汉单例设计模式: 线程不安全【不可用】 1. 私有化构造函数。 2. 声明本类的引用类型变量,但是不要创建对象, 3. 提供公共静态 的方法获取本类* 的对象,获取之前先判断是否已经创建了本类 对象, 如果已经创建了,那么直接返回对象即可,如果还没有创建,那么先创建本类的对象,然后再返回。* * 特点:这种写法起到懒加载(Lazy Loading 又称延迟加载)的效果,仅能在单线程下使用。 如果是在多线程下,一个线程进入if (singleton* == null)判断语句块,还未来得及往下执行, 另一个线程也通过了这个判断语句,这时便会产生多个实例,所以多线程不适合这种方式*/
class Single03 {// 2. 声明本类的引用类型变量,但是不要创建对象,private static Single03 single;// 1. 私有化构造函数。 构造函数的作用:初始化成员变量private Single03() {}// 3. 提供公共静态 的方法获取本类 的对象,获取之前先判断是否已经创建了本类 对象,// 如果已经创建了,那么直接返回对象即可,如果还没有创建,那么先创建本类的对象,然后再返回。public static Single03 GetInstance() {if (single == null) {single = new Single03();}return single;}
}/** 懒汉式 2 线程不安全 【不可用】* * 特点:效率极低,可执行getInstance()方法实现线程的同步*/
class Single04 {private static Single04 Single;private Single04() {}public static synchronized Single04 GetInstance(){if(Single == null){Single = new Single04();}return Single;}}
  • final关键字

/*
final(最终、修饰符)  final关键字的用法:1. final关键字修饰一个基本类型的变量时,该变量不能重新赋值,第一次的值为最终的。2. fianl关键字修饰一个引用类型变量时,该变量不能重新指向新的对象。3. final关键字修饰一个函数的时候,该函数不能被重写。4. final关键字修饰一个类的时候,该类不能被继承。常量 的修饰符一般为: public static final */
package com.java.test;public class Demo02 {
public static void main(String[] args) {Circle C = new Circle();C.GetArea();
}
}
class Circle{double R = 5;public static final double pi = 3.14; // 被final修饰的变量 值固定不变public Circle(){this.R = R;}public final void GetArea(){System.out.println("这个圆形de面积是:" + R*R*pi);}
}
package com.java.test;
/*
抽象类:
目前存在的问题:1. 动物类的run方法描述的不正确。2. 没有强制要子类一定要重写run方法。
抽象类的应用场景:我们在描述一类事物的时候,发现该种事物确实存在着某种行为,
但是这种行为目前是不具体的,那么我们可以抽取这种行为 的声明,但是
不去实现该种行为,这时候这种行为我们称作为抽象的行为,我们就需要使用抽象类。抽象类的好处: 强制要求子类一定要实现指定的方法。抽象类要注意的细节:1. 如果一个函数没有方法体,那么该函数必须要使用abstract修饰,把该函数修饰成抽象 的函数。。2. 如果一个类出现了抽象的函数,那么该类也必须 使用abstract修饰。3. 如果一个非抽象类继承了抽象类,那么必须要把抽象类的所有抽象方法全部实现。4. 抽象类可以存在非抽象方法,也可以存在抽象的方法.5. 抽象类可以不存在抽象方法的。 5. 抽象类是不能创建对象的。疑问:为什么抽象类不能创建对象呢?因为抽象类是存在抽象方法的,如果能让抽象类创建对象的话,那么使用抽象的对象调用抽象方法是没有任何意义的。6. 抽象类是存在构造函数的,其构造函数是提供给子类创建对象的时候初始化父类的属性的。abstract不能与以下关键字共同修饰一个方法:1. abstract不能与private共同修饰一个方法。2. abstract 不能与static共同修饰一个方法。3. abstract 不能与final共同修饰一个方法。
*/
public class Demo04 {public static void main(String[] args) {Dog Dg = new Dog("大黑狗","黑色");Dg.run();}}// 动物类--->抽象类
abstract class Animal{// 抽象父类// 成员变量   对象属性String Name;String Color;// 构造方法  初始化成员变量public Animal(String Name, String Color){this.Name = Name;this.Color = Color;}// 非抽象方法   对象行为public void eat(){System.out.println(Name + "吃东西");}// 抽象方法(函数)  移动  对象行为public abstract void run(); // 没有方法体  需用abstract修饰该函数
}class Dog extends Animal{ // 非抽象子类继承抽象的父类 必须实现抽象父类中所有的抽象方法public Dog(String Name, String Color){super(Name,Color); // super关键字指定引用父类的成员或构造函数}//实现抽象父类的所有抽象方法public void run(){System.out.println(Name + "不愧是四条腿的动物,跑到贼快!");}
}
  • 接口 interface

package cn.java.test;/*接口:接口:拓展功能的。 举例:电脑的usb接口.。。接口的定义格式:interface 接口名{}接口要注意的事项 :1. 接口是一个特殊的类。2. 接口的成员变量默认的修饰符为: public static final 。那么也就是说接口中的成员变量都是常量。3. 接口中 的方法都是抽象的方法,默认的修饰符为: public abstract。4. 接口不能创建对象。5. 接口是没有构造方法的。6. 接口是给类去实现使用的,非抽象类实现一个接口的时候,必须要把接口中所有方法全部实现。实现接口的格式:class  类名 implements 接口名{}类与接口之间关系: 实现关系。接口与接口之间关系: 继承关系。类与接口要注意的事项:1. 非抽象类实现一个接口时,必须要把接口中所有方法全部实现。2. 抽象类实现一个接口时,可以实现也可以不实现接口中的 方法。3. 一个类可以实现多个接口 。java不支持多继承(类),但支持多实现(接口)*/public class Demo03 {
public static void main(String[] args) {InterfaceTest IT = new InterfaceTest("铅笔");IT.write();IT.Remove();
}
}class Pencil { // 普通铅笔类String Name;public Pencil(String Name) {// 带参的构造方法this.Name = Name;}//铅笔的行为public void write(){System.out.println(Name + "沙沙的写东西");}
}interface Eraser{ // 定义一个橡皮接口 修改是铅笔的扩展功能// 成员变量 接口成员变量默认修饰符 public static final//public static final int Age = 10;// 成员函数 接口中的方法是抽象方法 所以没有方法体public abstract void Remove();// 接口没有构造方法
}//定义一个类 继承铅笔类 实现橡皮接口
class InterfaceTest extends Pencil implements Eraser {// InterfaceTest类的构造方法public InterfaceTest(String Name){super(Name); // super关键字指定引用父类成员}//非抽象类实现一个接口时必须把接口中的所有方法实现public void Remove(){System.out.println("涂改,涂改...");}
}
  •      Java的单继承

一个类至多有一个直接父类,但可以有许多间接父类,返过来说父类可以有许多子类

package cn.java.test;public class Dmeo02 {
public static void main(String[] args) {Zi Z = new Zi();Z.Name = "小小黑";
}
}
//Java继承实例
class Ye{ // Zi类的间接父类  超类  根类String Name;
}class Fu extends Ye{ // Zi类的直接父类}class Zi extends Fu{}
  • Java三大特征之多态

package cn.java.test;/*多态:一个对象具备多种形态。(父类的引用类型变量指向了子类的对象或者是接口 的引用类型变量指向了接口实现类的对象)多态的前提:必须存在继承或者实现 关系。动物  a  = new   狗();多态要注意 的细节:1.  多态情况下,子父类存在同名的成员变量时,访问的是父类的成员变量。2.  多态情况下,子父类存在同名的非静态的成员函数时,访问的是子类的成员函数。3.  多态情况下,子父类存在同名的静态的成员函数时,访问的是父类的成员函数。4.  多态情况下,不能访问子类特有的成员。总结:多态情况下,子父类存在同名的成员时,访问的都是父类的成员,除了在同名非静态函数时才是访问子类的。编译看左边,运行不一定看右边。编译看左边:java编译器在编译的时候,会检查引用类型变量所属的类是否具备指定的成员,如果不具备马上编译报错。多态的应用:1. 多态用于形参类型的时候,可以接收更多类型的数据 。2. 多态用于返回值类型的时候,可以返回更多类型的数据。多态的好处: 提高了代码的拓展性。需求1: 定义一个函数可以接收任意类型的图形对象,并且打印图形面积与周长。*/public class Demo04 {public static void main(String[] args) {//实例化圆Circle C = new Circle(2.3);// 調用方法C.GetArea();C.GetLength();//实例化矩形Rect R = new Rect(10,5); //width 与 height 参数数据类型为 int 所以传入int类型的数据//調用方法R.GetArea();R.GetLength();}
}abstract class MyShape {// 定义抽象类 图形类// 抽象方法(抽象类中的方法)没有方法体public abstract void GetArea();public abstract void GetLength();}class Circle extends MyShape {// Circle类中的成员变量public static final double PI = 3.14159;double R;// 有参构造方法 初始化成员变量public Circle(double r) {this.R = r; // this关键字指定成员变量 如果不指定Java的就近原则会默认访问局部变量r}// 非抽象类继承抽象类 必须实现抽象类的所有方法public void GetArea() {System.out.println("圆的面积:" + PI * R * R);}public void GetLength() {System.out.println("圆的周长是:" + 2 * PI * R);}
}class Rect extends MyShape {int width;int height;public Rect(int Width, int Height) {this.width = Width;this.height = Height;}public void GetArea() {System.out.println("矩形的面积:" + width * height);}public void GetLength() {System.out.println("矩形的周长:" + 2 * (width + height));}
}

 

  相关解决方案