6.2面向对象(Math类,成员方法,代码块,继承,制作文档说明书)

本文深入讲解Java中的Math类使用、随机数生成、类成员方法、代码块、继承关系及其细节,还包括面向对象练习和匿名对象的应用。

一、Math类

1)Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。

public static double random()返回带正号的 double 值

,该值大于等于 0.0 且小于 1.0,[0.0,1.0),永远接近1.0返回值是一个随机选择的数

2)应用举例:

package org.westos_Math.random;

import java.util.Scanner;

/*

 * 键盘录入数字,猜数字小游戏

 * */

public class MathTest {

public static void main(String[] args) {

//取一个随机数,0-100之间

//我们要猜的数据

int number = (int) (Math.random()*100 + 1);

while(true){

//采用键盘录入数据

Scanner sc = new Scanner(System.in) ;

//接收并录入数据

//用户输入的数据

System.out.println("请您输入一个数字:");

int guesssNumber = sc.nextInt() ;

if(guesssNumber > number){

System.out.println("你猜的数据:"+guesssNumber+"大了");

}else if(guesssNumber<number){

System.out.println("你猜的数据:"+guesssNumber+"小了");

}else{

System.out.println("恭喜您,猜对了");

break ;

}

}

}

}

 

二、成员方法

1)一个标准类的成员:

成员变量:类中方法外

构造方法:无参.有参

成员方法:set()/get()方法

  返回值类型:void类型 

             void类型

  形式参数:有形式参数

           空参

 学生类:

成员方法:set()/get(),study();

2)成员方法种类及案例:

a. //有返回值类型:但是没有参数的成员方法

public String getString(){

return "helloworld" ;

}

b. //没有返回值类型,无参

public void show(){

System.out.println("show");

}

c. //无返回值类型,有参

public void method(String name){

System.out.println("给"+name+"打电话");

}

d. //有返回值类型,有参数的情况

public String function(String s1,String s2){

return s1 + s2 ;

}

三、代码块

1)在java中,用{}括起来的代码叫代码块

2)代码块分类:

a. 局部代码块:局部位置,用于限定变量的生命周期

 b. 构造代码块:在类中的成员位置,在执行构造方法之前,必须先执行构造代码块中的内容

作用:用来将多个构造方法中相同的代码放进来,给对象进行初始化!

c. 静态代码块:在类中的成员位置,static{}

static随着类的加载而加载

  静态代码在类中只加载一次!

3)面试题:构造代码块,静态代码块,构造方法,的优先级?

       静态代码块>构造代码块>构造方法

 

四、继承

1)继承概述 

a. 多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。 

b. 通过extends关键字可以实现类与类的继承:

class子类名extends父类名{}  

c. 单独的这个类称为父类,基类或者超类;这多个类可以称为子类或者派生类。 

d. 有了继承以后,我们定义一个类的时候,可以在一个已经存在的类的基础上,还可以定义自己的新成员

2)继承关系的好处:

a. 提高代码的复用性

b. 提高了代码的维护性

c. 类与类产生了关系---->关系:耦合性  

类与类产生了关系,这种关系它是多态的前提条件!

3)java中开发的原则:

低耦合,高内聚!

耦合:类与类关系,

内聚:指的是执行一件事情能力!

4)java中继承的特点:

a. 在java中,只支持单继承,不支持多继承

别的语言,可能会支持多继承(class Zi extends Fu,Monther){}

    b. 虽然不支持多继承,但支持多层继承!

5)继承的注意事项:

a. 子类继承父类,只能继承父类中非私有的成员(成员变量/成员方法)

子类继承父类:继承父类所有成员

私有的成员private (成员变量/成员方法)

b. 子类继承父类,不能继承父类中构造方法,但是可以通过一个super关键字间接的访问

【什么情况下使用继承:extends ?】

盲目的使用继承关系,会在后期维护代码中比较麻烦!

如果A类是B类的一种,或者B类是A类的一种,那么可以是继承关系!

继承关系体现的是一种"is a"的关系:谁是谁的一种,如果存在这这种关系,那么可以放心的使用继承关系了 !

6)子类继承父类,成员变量的关系:

a.子类中的成员变量和父类中的成员变量名称不一致的情况,分别输出!

b.子类中的成员变量和父类的成员变量名称一致的情况:

首先在子类中局部变量中找,是否有这样变量的值,有就输出;

找不到,需要在子类的成员位置中找,有就输出,

如果没有,在父类中的成员位置找,如果有就输出,如果没有,就报错(不考虑父亲的父亲…)

7)super关键字:super的用法和this很像 

a.this代表本类对应的引用。 

super代表父类存储空间的标识(可以理解为父类引用)

b. 用法(thissuper均可如下使用)

*访问成员变量: 

this.成员变量:访问的是本类中的成员变量

super.成员变量 :访问的是父类中的成员变量

*访问成员方法:

this.成员方法():访问的是本类中的成员方法    

super.成员方法():访问的是父类中的成员方法

*访问构造方法: 

this()/this(): 访问的是本类中的构造方法

super()/super(): 访问的是父类中的构造方法

8)继承中构造方法的关系:

构造方法的作用:对数据进行初始化!

a. 子类中所有的构造方法,会默认的访问父类中的无参构造方法!

【为什么呢?

因为子类会继承父类中的所有的数据(private修饰外部类不能访问),可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。 

每一个构造方法的第一条语句默认都是:super() 

继承关系数据初始化:分层初始化!先让父类进行数据初始化,然后子类进行数据初始化!

b. 如果在父类没有无参构造方法,会出现什么现象?如何解决?

子类的构造方法全部报错!

l 方法一:手动给出父类中的无参构造方法

l 方法二:子类继承父类,可以通过父类中有参构造,间接访问,在子类中的构造方法第一句话:super("传参");

l 方法三:子类中的有参构造,第一句话:this():访问当前类中的无参构造方法----->间接访问父类中的有参构造

this()/super(" "); 要写的话必须写在第一句话:防止父类进行多次初始化!

9)典型练习题:

package org.westos_继承;

class Fu4 {

static {

System.out.println("静态代码块Fu");

}

{

System.out.println("构造代码块Fu");

}

public Fu4() {

System.out.println("构造方法Fu");

}

}

class Zi4 extends Fu4 {

static {

System.out.println("静态代码块Zi");

}

{

System.out.println("构造代码块Zi");

}

public Zi4() {

System.out.println("构造方法Zi");

}

}

public class ExtendsTest2 {

public static void main(String[] args) {

Zi4 z = new Zi4();

}

}

输出结果:

静态代码块Fu

静态代码块Zi

构造代码块Fu

构造方法Fu

构造代码块Zi

构造方法Zi

 

五、面向对象练习

1)需求:长方形的周长和面积,键盘录入

package org.westos_面向对象练习;

import java.util.Scanner;

/*

 * 分析:长方形是一个事物---------->长方形类

 * 属性:长和宽成员变量:长和宽

 *行为:周长和面积成员方法:

 * */

class ChangFangXing{

//定义成员变量

private int width ;

private int length ;

//只需要set()方法

public void setLength(int length) {

this.length = length;

}

public void setWidth(int width){

this.width = width ;

}

//成员方法:

//周长

public int getZhouChang(int width ,int length){

return (width+length)*2 ;

}

//面积:

public int getArea(int width,int length){

return (length*width) ;

}

}

 

//测试类

public class Test {

public static void main(String[] args) {

//创建键盘录入对象

Scanner sc = new Scanner(System.in);

//录入并接收数据

System.out.println("请输入长方形的长:");

int length = sc.nextInt() ;

System.out.println("请输入长方形的宽:");

int width = sc.nextInt() ;

//需要创建长方形类的对象

ChangFangXing cfx = new ChangFangXing() ;

cfx.setLength(length) ;

cfx.setWidth(width) ;

//调用成员方法

int zhouChang = cfx.getZhouChang(width, length) ;

int area = cfx.getArea(width, length) ;

System.out.println("该长方形的周长是:"+zhouChang+",面积是:"+area);

}

}

 

 

2)匿名对象:

package org.westos_匿名对象;

/*

 * 匿名对象:

 *没有名字的对象

 *Student s = new Student(); 对象名是s

 *

 *匿名的对象的格式:new 类名() ;

 *new Student() ;在实际开发中会经常用到对象,一般情况使用一次,多次使用合适!

 *

 *匿名对象的好处:省空间,比较方便

 *

 *

 * */

class Student2{

public void show(){

System.out.println("好好学习,天天向上");

}

}

class StudentDemo2{

//形式参数是引用类型

public void method(Student2 s){//需要该类对象

s.show() ;

}

}

 

//测试类:

public class NoNameDemo {

public static void main(String[] args) {

//创建StudentDemo2对象

StudentDemo2 sd2 = new StudentDemo2() ;

Student2 s = new Student2() ; //有名字的对象:对象名是s:

sd2.method(s);

s.show() ;//有名字的对象:s

s.show() ;

//匿名对象

StudentDemo2 sd3 = new StudentDemo2() ;

new Student2().show() ;//匿名对象调用

new Student2().show() ;

System.out.println("----------------");

//匿名对象也可以作为实际参数传递:开发中经常使用

//链式编程:一步走

new StudentDemo2().method(new Student2());

}

}

 

3)形式参数的问题:

package 形式参数的问题;

/*

 * 形式参数的问题:

 *基本数据类型作为形式参数:形式参数的改变,不影响实际参数

 *引用类型作为形式参数:会直接影响实际参数

 * */

 

class Demo{

//形式参数是基本数据类型

public int sum(int a,int b){

return a + b ;

}

}

class Student{

public void show(){

System.out.println("好好学习,天天向上");

}

}

class StudentDemo{

//形式参数是引用类型

public void method(Student s){//告诉我们:形式参数是一个类名的情况下,实际参数要的就是该类的具体对象!Student s = new Student();

s.show() ;

}

}

//测试类

public class Test {

public static void main(String[] args) {

//1)需求:调用Demo中 sum()方法

//创建Demo类的对象

Demo d = new Demo() ;

int result = d.sum(10, 20) ;

System.out.println("result:"+result);

System.out.println("-----------------------");

//2)需求:我要调用StudentDemo中method方法

//创建StudentDemo的对象

StudentDemo sd = new StudentDemo() ;

Student s = new Student() ;

sd.method(s) ;

}

}

 

六、制作文档说明书

1)制作帮助文档:

l 制作工具类

ArrayTools

l 制作帮助文档(API)

javadoc -d 目录 -author -version ArrayTool.java

2)如何使用帮助文档:

a. 找到文档,打开文档

b. 点击显示,找到索引,出现输入框

c. 你应该知道你找谁?举例:Scanner

d. 看这个类的结构(需不需要导包)

成员变量----->字段

构造方法----->构造方法

成员方法----->方法

e. 看这个类的说

f. 看构造方法

g. 看成员方法

h. 然后使用

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值