欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第三周学习

程序员文章站 2024-03-19 23:01:46
...

java第三周总结

第三周主要学的是关于面向对象的知识,主要的知识的围绕着继承,封装,多态来学习的,知道并且理解其中的特点还有联系,如何运用。

继承

  • 继承使用extends关键字
  • 继承的类被称为子类,被继承的类被称为父类(或者超类)
  • 子类继承父类之后,子类直接使用父类中的非私有的元素,并且子类中也能定义自己的元素
  • 一个类只能继承一个父类
  • 继承关系的构造中,创建子类对象时先调用父类的构造器
  • java中允许多重继承

例如-----

先设置一个父类

package CCCC;

public class A1 {
	public String name;
	public int age;
	
	public void coding() {
		System.out.println(name + "超级会写代码");
	}
	
	public void love(){
		System.out.println("情场高手!!!!");
	}
}

创建子类

package CCCC;

public class A2 extends A1{
	public static void main(String[] args) {
		A1 s = new A1();
		s.name = "刘德华";
		s.coding();
		s.love();
	}
}

运行结果
第三周学习

继承注意事项

  • 子类只能继承父类的属性和方法,不能继承构造器
  • 子类对象构造之前会先执行父类的构造器(如果存在多重继承,则从最顶层父类构造器开始执行)
  • 一个父类可以存在多个子类,但是一个子类只能存在一个父类
  • Java不允许多继承,但是支持多重继承
  • 被protected修饰的元素可以在子类中被访问(即便父类和子类不在同一个包)

重写

-当父类终端方法实现满足不了子类需求时,此时子类中可以编写一个与父类方法一模一样的方法,对父类的方法进行覆盖,该过程称之为方法的重写(Override)

案列:

package CCCC;

public class A1 {
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
    //动物咆哮(不同的动物发出的叫声一样,因此无法一概而论)
	public void bark() {
		System.out.println(name + "哇哇哇哇啊啊...");
	}
}

package CCCC;

public class A2 extends A1{
	//对bark方法重写
		public void bark() {
			System.out.println(getName() + "汪汪汪。。。");
		}
}

package CCCC;

public class A3 extends A1{
	//对bark方法重写
		public void bark() {
			System.out.println(getName() + "喵喵喵。。。");
		}
}

package CCCC;

public class A4 {
	public static void main(String[] args) {
		A3 cat = new A3();
		cat.setName("加菲猫");
		A2  dog = new A2();
		dog.setName("拉布拉多");
		cat.bark();
		dog.bark();
	}
}

第三周学习

方法重写注意事项:

  1. 重写必须存在继承关系,一般是由子类重写父类方法
  2. 被重写的方法名称,返回值类型,参数列表必须跟父类方法一模一样
  3. 子类重写的方法访问权限不能低于父类

重载

重载指的是在同一个类中,或者存在继承关系的多个类中,存在同名的方法,这些方法的名称一模一样,但是方法的参数个数 ,类型,顺序任意有一项不一致,具备以上特点的方法统一称之为重载方法。

重载的条件:

  1. 方法名称必须一致
  2. 参数的个数、顺序和类型任意有一项不一致
  3. 重载与返回值无关

案列:

System.out.println("helloworld");
System.out.println(10);
System.out.println(true);
System.out.println('a');
System.out.println(3.14);

多态

多态是面向对象程序设计中最为重要的一种(没有之一)特性,java中的多态主要包含两种呈现方式:

  • 行为的多态(方法多态:一种方法以多种不同的形态呈现)
    • 方法的重写
    • 方法的重载
  • 变量的多态
    • 父类的引用指向子类对象
    • 子类引用指向父类对象(强制转换:前提是被转换的引用变量原本指向的就是目标对象)
package CCCC;

public class A1 {
	public void eat(){
        System.out.println("宠物吃东西");
    }
}

package CCCC;

public class A2 extends A1{
	
}
package CCCC;

public class A3{
	 public static void main(String[] args){
	        //父类引用指向子类对象(p只能调用父类和子类共有的方法)
	        A1 p = new A1();
	        
	        //子类引用指向父类对象(实际还是Dog对象)
	        A2 d = (A2) p;
	    }
}

多态的好处

多态性的优势体现在如下:

  • 提高程序的可扩展性
  • 提高代码的可复用性
  • 提高了程序的可维护性

封装类型

​由于java中提供基本数据类型只能用于一些简单运算(算术,关系,布尔逻辑等),但是无法像引用数据类型一样可以进行对象创建,方法或属性调用;因此对于一些特殊需求(比如:将字符串类型的数字转换整数,将十进制整数转成其他进制:2进制,8进制,16进制),基本数据类型显得功能不足;所以JDK提供了针对以上需求的基本类型封装类,用于进行相关类型的面向对象操作(方法调用)。

针对java中的8个基本类型数据,JDK也提供了对应的8个封装类型:

基本类型 封装类型
byte java.lang.Byte
short java.lang.Short
int java.lang.Integer
long java.lang.Long
float java.lang.Float
double java.lang.Double
char java.lang.Character
boolean java.lang.Boolean

基本使用

int i = 10;
int j = 20;

//需求:
//将十进制整数类型转成二进制字符串 1010
//将字符串转成整数型
// int ---> java.lang.Integer

System.out.println(Integer.MAX_VALUE); 
System.out.println(Integer.MIN_VALUE); 

Integer inte = new Integer("123");
System.out.println(inte + i); 

装箱拆箱

在JDK1.5之后,引入了装箱和拆箱机制,用于实现基本类型数据和对应的封装类型之间的自动转换。

  • 装箱(boxing):将基本类型的数据值包装为对应的引用类型对象
  • 拆箱(unboxing):将封装类型中的基本数据值拆成为基本数据类型
//装箱(boxing)
Integer i = 10;

//拆箱(unboxing)
int j = new Integer(10);

装箱和拆箱机制的实现:

1.5之后编译器对以下代码自动调用Integer.valueOf()完成装箱提供能

Integer i = 10

拆箱的实现使用的是如下方法

intValue()

String类

​ String是来自java.lang包中的一个常见字符串处理类,用于表示一个定长字符串,String的底层实现原理实际上就是一个字符序列(char数组);由于String是一个长度不可变的字符数组,因此对String进行修改实际就是在创建新的对象,在进行大量字符串拼接操作时内存和时间的开销会比较大,影响程序执行效率,因此String不适合做大量的字符串拼接操作。(如果有大量字符串拼接需求,建议使用:StringBuffer或StringBuilder)。

常见构造器

构造器 说明
String(String s) 根据提供的字符串直接量创建String对象
String(char[] c) 根据提供的字符数组创建String对象
String(char[] c,int offset,int len) 根据提供的字符数组,偏移量以及长度构建String对象
String(byte[] b) 根据提供的字节数组,转换为String对象
String(byte[] b,int offset,int len) 根据提供的字节数组,偏移量以及长度构建String对象

抽象类(abstract class)

java中凡是普通类都具备实例化对象的能力,因为一个类具备了实例化对象的一些必要信息,比如属性,比如行为;但是有些时候,当一个类中信息不足以描述一个具体对象时,此时该类就应该考虑定义为抽象类。

java中的抽象类中所包含的信息,不足以描述一个具体对象,抽象类的内部成分由以下信息构成:

  • 属性
  • 构造器
  • 行为
    • 已实现
    • 未实现(抽象方法)

抽象类基本案例

语法

public abstract class 类名称{
    
    //属性定义
    //方法定义
    
    //抽象方法定义
    public abstract 返回值类型 方法名(参数列表);
    
}

案例:

/**
 * 	抽象类
 * @author mrchai
 */
public abstract class Animal {

	private String name;
	
	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	//抽象方法
	public abstract void eat();
	public abstract void sleep();
	
}

Dog类:

public class Dog extends Animal{

    //实现方法
	public void eat() {
		System.out.println("吃骨头");
	}
	//实现方法
	public void sleep() {
		System.out.println("睡狗屋");
	}

}

特点

  1. 抽象类必须使用abstract修饰
  2. 抽象类存在构造器,但是无法实例化(可以使用匿名内部类创建子类对象)
  3. 抽象类中通常会包含抽象方法
  4. 抽象类的存在一般是需要由子类继承,子类一旦继承了抽象类,则子类必须实现父类中的抽象方法(除非子类也是抽象类)
  5. 抽象类允许继承其他抽象类,但是也只能单继承,可以通过多重继承的方式实现多继承
  6. abstract只能修饰类和方法