JAVA

mac2026-03-15  2

Day09

关于成员变量的问题

一个变量什么时候定义为成员变量? 当前该变量能够描述当前类的属性(举例,姓名,年龄…),才能将该变量定义为成员变量 == 变量的定义==:范围越小越好 (能定义局部变量,就用局部变量!) 类与对象的关系: 类:当前事物一组属性和行为的集合 长方形: 长 宽 学生: 姓名 年龄 手机 品牌 颜色 价格

/* 需求: 求两个数据之和 */ //有一个Demo类 class Demo{ //求和的方法 //方式1 public int sum(int a,int b){ int c = a + b ; return c ; } // 方式2定义两个成员变量 /* int a ; int b ; public int sum (){ return a + b ; } */ } /* class MemberDemo{ public static void main(String[] args){ //创建Demo类的对象 Demo d = new Demo() ; int result = d.sum(10,20) ; System.out.println("result:"+result) ; //d.a = 10 ; //d.b = 20 ; System.out.println(d.sum()); } }

通过api_Math类

通过API查看当前Math类 1.看字段(成员变量) 看构造方法(存在,可以创建对象) 看方法(成员方法):是否在static修饰,看方法返回值类型 java.lang—>不需要导包 2.Math类:包含执行基本数字运算的方法,如基本指数,对数,平方根和三角函数。

public static double random(): 返回一个double值为正号,大于等于0.0 ,小于1.0 .伪随机选择的。

class MathDemo{ public static void main(String[] args){ //直接调用random()方法 double r = Math.random() ; System.out.println(r) ; System.out.println("------------------") ; //获取1-100之间的随机数 random() ; [0.0,1.0) //for(int x = 0 ; x <100; x ++){ int a = (int)(Math.random()*100)+1; System.out.println(a) ; //} } }

经典案例 使用Math类的random方法完成猜数字的游戏 分析: 1.产生一个1-100之间的随机数 (被猜的) 2.使用键盘录入一个数据 接收数据(录入的数据) 3.判断录入的数据(要猜的)和产生的随机数进行大小, 大了,提示当前录入的数据大了 小了,提示当前录入的数据小了 如果猜到了,就应该结束循环(不知道循环多少次,使用while)

import java.util.Scanner ; class MathTest{ public static void main(String[] args){ //产生一个1-100之间的随机数 (被猜的) int num = (int)(Math.random()*100+1) ; //System.out.println(num) ; //定义统计变量 int count = 0 ; //使用while循环 while(true){ count ++ ; //创建键盘录入对象 Scanner sc = new Scanner(System.in) ; //提示并接收数据 System.out.println("请您输入要猜的数据: ") ; int guessNumber = sc.nextInt() ; //判断当前录入的数据和要猜的数据进行比较 if(guessNumber>num){ System.out.println("你要猜的数据,"+guessNumber+"大了") ; }else if(guessNumber < num){ System.out.println("你要猜的数据,"+guessNumber+"小了") ; }else{ System.out.println("恭喜您第"+count+"次猜中了") ; break ; } } } }

代码块

代码块:在Java中使用{} 将代码包裹起来 **局部代码块:**是在局部位置(方法中定义),作用,限定变量的生命周期 **构造代码块:**在类中的成员位置,作用:以后将构造方法中相同的代码使用{} 提取出来—>构造代码块 每次执行构造方法之前,都会优先构造代码块 **静态代码块:**在类中的成员位置 ,作用:给类中进行初始化! 只执行一次! 在{}前面使用static关键字修饰 static{ …代码 }

面试题:

静态代码块,构造代码块,构造方法的执行顺序? 静态代码块 > 构造代码块 >构造方法 定义一个Code类 */ class Code{ //静态代码块 static{ int x = 1000 ; System.out.println(x) ; } //构造代码块 { int x = 100 ; System.out.println(x) ; } /* { int y = 200; System.out.println(y) ; } */ public Code(){ System.out.println("code...") ; } public Code(int i){ System.out.println("code...") ; } } //测试类 class CodeDemo{ public static void main(String[] args){ { //定义一个变量 int x = 10 ; System.out.println(x) ; } { //定义一个变量 int x = 20 ; System.out.println(x) ; } //创建Code类的堆 Code code = new Code() ; System.out.println("----------------") ; Code code2 = new Code() ; System.out.println("----------------") ; Code code3 = new Code(10) ; } }

看程序,写结果 构造代码块,构造方法,以及静态代码块执行先后顺序

class Student{ { System.out.println("高圆圆已经39了,我很伤心...") ; } static{ System.out.println("我是静态代码块...") ; } public Student(){ System.out.println("student构造方法...") ; } { System.out.println("student构造代码块..."); } } class CodeTest{ public static void main(String[] args){ System.out.println("我是Main方法") ; Student s = new Student(); Student s2 = new Student() ; } }

结果: 我是Main方法 我是静态代码块… 高圆圆已经39了,我很伤心… student构造代码块… student构造方法… 高圆圆已经39了,我很伤心… student构造代码块… student构造方法…

继承

定义:将共有的属性/行为---->独立的类,(父类,超类…) 独立的类和其他类产生一种"继承"关系:extends 子类,也叫派生类.

继承的好处:

1.提高代码的复用性 2.提高后期代码的维护管理性 3.让类和类之间产生一种关系 (是多态的前提条件) 也是一个弊端 Java中的开发原则: 高内聚,低耦合 耦合:类和类之间的关系 内聚:指的是完成某一件事情执行能力

//使用继承之前 /* class Student{ //成员变量.. //setXXX()/getXXX() //成员方法 public void eat(){ System.out.println("饿了就需要吃饭..."); } public void sleep(){ System.out.println("累了就需要休息..."); } } class Teacher{ //成员变量.. //setXXX()/getXXX() //成员方法 public void eat(){ System.out.println("饿了就需要吃饭..."); } public void sleep(){ System.out.println("累了就需要休息..."); } } */ //使用继承之后 class Person{ //成员变量.. //setXXX()/getXXX() //成员方法 public void eat(){ System.out.println("饿了就需要吃饭..."); } public void sleep(){ System.out.println("累了就需要休息..."); } } //子类 class Student extends Person{} class Teacher extends Person{} //测试类 class ExtendsDemo{ public static void main(String[] args){ //创建Student类对象 Student s = new Student() ; s.eat() ; s.sleep() ; System.out.println("------------"); Teacher t = new Teacher() ; t.eat() ; t.sleep() ; } }

Java中继承的特点:

1.在Java语言中,继承只支持单继承,不支持多继承 在别的语言中,是可以多继承的 ,多继承的格式:class Zi extends Fu1,Fu2…{} 2.虽然不支持多继承,但是可以多层继承

//class Father{} //class Monther{} //编译不通过,多继承的语法,在Java中不适用 //class Son extends Father,Monther{} //爷爷类 class GrandFather{ public void show(){ System.out.println("我是你爷爷...") ; } } //父类 class Father extends GrandFather{ public void method(){ System.out.println("我是老子...") ; } } //子类 class Son extends Father{ public void function(){ System.out.println("我是晚辈...") ; } } //测试类 class ExtendsDemo2{ public static void main(String[] args){ //创建子类对象 Son s = new Son() ; s.show() ; s.method() ; s.function() ; } }

继承中的注意事项

1.子类不能继承父类的私有的成员(成员变量,成员方法); 2.子类不能继承父类的构造方法,但是可以通过一个关键字super 3.不能为了部分功能,随便使用"继承" 举例: class A{ public void show1() {…} public void show2() {…} } class B{ public void show2() {…} public void show3() {…} } //发现类A和类B有共同的成员方法show2(),就可以使用继承… class B extends A{ public void show3() {…} } //在后期维护过程中非常麻烦,因为show1(),类B中可能用不到… 问题:什么时候使用继承? 继承体现的是一种"is a"的关系 人 学生 老师 军人 工人… 水果 香蕉 苹果 葡萄…

以后如果能描述:A是B的一种,或者B是A的一种,使用继承关系 class Father{ public int num = 10 ; private int num2 = 20 ; public void show(){ System.out.println(num) ;//10 System.out.println(num2) ;//20 } //私有的方法 private void method(){ System.out.println(num) ; System.out.println(num2) ; } } //子类 class Son extends Father{ //子类的成员方法 public void function(){ // num2可以在Father中访问private //System.out.println(num2) ; //子类不能继承父类的私有成员 System.out.println(num) ; } } //测试类 class ExtendsDemo{ public static void main(String[] args){ //创建子类对象 Son s = new Son() ; s.show() ; s.function() ; //s.method() ; //method()属于父类的私有成员方法 } }

继承中的成员关系问题:

类的成员: 成员变量 构造方法 成员方法 继承中成员变量的关系问题:(面试中经常问到执行先后顺序) 子类的成员变量名称和父类成员变量名称不一致: 1.通过子类调用成员方法分别输出对应父类的成员变量和子类的成员变量. 当子类的成员变量名称和父类的成员变量名称一致的情况下: 1.首先在子类的局部位置中找,有就输出,没有—>到成员位置找 2.找到了,就输出—>如果子类的成员位置找不到 3.到父类中的成员位置中找,有就输出 4.如果父类的成员位置找不到,就报错

//定义父类 class Father extends Object{ //成员变量 public int num = 10 ; public int num2 = 50 ; //public void method(){ //System.out.println(num2) ; //} } //子类 class Son extends Father{ //成员变量 //public int num2 = 20 ; public void show(){ //局部变量 //int num2 = 100 ; System.out.println(num) ;//10 //10 //10 System.out.println(num2) ;//50 //20 //100 } } //测试类 class ExtendsDemo2{ public static void main(String[] args){ //创建子类对象 Son s = new Son() ; s.show() ; s.method() ; } }

super

问题: 在show方法中就想去访问子类的成员变量? this就可以代表当前子类的对象的引用 同理,访问父类中的成员变量num? Java 中提供一个关键字super super.成员变量; super:代表父类的空间标识(父类的对象的地址引用) this和super的区别? 前者表示子类对象的引用 后者跟父类相关,代表父类的引用

成员变量 this.成员变量; super.成员变量; 成员方法 this.成员方法名() ; super.成员方法名() ; 构造方法 this.构造方法(…) ; super.构造方法(…) ;

class Father{ int age ; public int num = 50 ; } class Son extends Father{ public int num = 100 ; public void show(){ int num = 200 ; System.out.println(num) ; //200 System.out.println(this.num) ; //100 System.out.println(super.num) ; //50 } } //测试类 class ExtendsDemo3{ public static void main(String[] args){ //创建子类对象 Son s = new Son() ; s.show() ; } }

继承关系中构造方法的初始化:

1.子类的无参构造方法/有参构造方法,都会默认访问父类的无参构造方法… 因为子类会继承父类中的数据,可能还会使用父类的数据。所以,子类初始化之前,一定要先完成父类数据的初始化。(分层初始化) 每一个构造方法的第一条语句默认都是:super()

class Father{ String name ; int age ; //给出无参构造方法 public Father(){ System.out.println("访问的是父类的无参构造方法...") ; } } class Son extends Father{ //无参构造方法: public Son(){ super() ; //访问父类的无参构造方法 System.out.println("访问的是子类的无参构造方法...") ; } public Son(String name){ super() ;//访问父类的无参构造方法 System.out.println("Son的带参构造方法...") ; } } class ExtendsDemo4{ public static void main(String[] args){ //创建子类对象 Son s = new Son() ; System.out.println("---------") ; Son s2 = new Son("高圆圆") ; } }
最新回复(0)