构造方法概述和格式
- 构造方法概述和作用:
创建对象,给对象中的成员进行初始化 - 构造方法格式特点:
1:方法名与类名相同
2:没有返回值类型,连void都没有
3:没有具体的返回值 - 构造方法注意事项:
1:如果我们没有给出构造方法,系统将自动提供一个无参构造方法。
2:如果我们给出了构造方法,系统将不再提供默认的无参构造方法。
注意:这个时候,如果我们还想使用无参构造方法,就必须自己给出。建议永远自己给出无参构造方法 - 给成员变量赋值的两种方式:
1:setXxx()方法
2:构造方法 - 输出成员变量值的方式:
1:通过getXxx()分别获取然后拼接
2:通过调用show()方法搞定
创建一个对象的步骤
- 步骤:
(1):加载Student.class文件进内存
(2):在栈内存为s开辟空间
(3):在堆内存为学生对象开辟空间
(4):对学生对象的成员变量进行默认初始化
(5):对学生对象的成员变量进行显示初始化
(6):通过构造方法对学生对象的成员变量赋值
(7):学生对象初始化完毕,把对象地址赋值给s变量
构造方法求长方形周长及面积
public class MyTest {
public static void main(String[] args) {
Rectangle rectangle = new Rectangle();
rectangle.setHeight(10);
rectangle.setLength(5);
double zhouChang = rectangle.getZhouChang();
double mianji = rectangle.getMianji();
System.out.println("周长: "+zhouChang);
System.out.println("面积: " + mianji);
System.out.println("-------------------------");
Rectangle rectangle1 = new Rectangle(19, 35);
System.out.println(rectangle1.getZhouChang());
System.out.println(rectangle1.getMianji());
}
}
class Rectangle{ //构造方法
private double length;
private double height;
public Rectangle() {
}
public Rectangle(double length, double height) {
this.length = length;
this.height = height;
}
public double getLength() {
return length;
}
public void setLength(double length) {
this.length = length;
}
public double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public double getZhouChang(){
return (height+length)*2;
}
public double getMianji(){
return height*length;
}
}
static关键字
- static关键字的特点:
1:随着类的加载而加载
2:优先于对象存在
3:被类的所有对象共享
4.可以通过类名调用,也可通过对象名调用,推荐使用类调用 - static的注意事项:
1:在静态方法中是没有this关键字的
如何理解呢?
静态是随着类的加载而加载,this是随着对象的创建而存在。
静态比对象先存在。即先存在的不能访问后存在的,后存在的可以访问先存在的
2:静态方法只能访问静态的成员变量和静态的成员方法
静态变量和成员变量的区别
- 所属不同:
静态变量属于类,所以也称为类变量
成员变量属于对象,所以也称为实例变量(对象变量) - 内存中位置不同:
静态变量存储于方法区的静态区
成员变量存储于堆内存 - 内存出现时间不同:
静态变量随着类的加载而加载,随着类的消失而消失
成员变量随着对象的创建而存在,随着对象的消失而消失 - 调用不同:
静态变量可以通过类名调用,也可以通过对象调用
成员变量只能通过对象名调用
如何使用JDK提供的帮助文档
- 步骤:
1:找到文档,打开文档
2:点击显示,找到索引,出现输入框
3:你应该知道你找谁?举例:Scanner
4:看这个类的结构(需不需要导包)
java.lang包下的内容不需要我们手动导入
其它包下的内容需要我们手动导入
类 API文档
成员变量 字段摘要
构造方法 构造方法摘要
成员方法 方法摘要
5:看这个类的说明(简单的了解一下)
6:看开始版本
7:看构造方法
8:看成员方法
看左边:
是否是static的,如果是我们就不需要创建对象,直接可以使用类名调用该方法;看返回值,返回值是什么我就使用什么接收
看右边:
看参数列表: 参数的个数 , 参数的类型 ; 要什么参数我是用的时候,就传递什么参数
9:然后使用
学习Math类的随机数功能
打开JDK提供的帮助文档学习
- Math类概述
类包含用于执行基本数学运算的方法 - Math类特点
由于Math类在java.lang包下,所以不需要导包。
没有构造方法,因为它的成员全部是静态的。 - 获取随机数的方法
public static double random():返回带正号的 double 值,该值大于等于 0.0 且小于 1.0。 - 我要获取一个1-100之间的随机数,怎么办?
int number = (int)(Math.random()*100)+1;
Math类的随机数功能的应用
import java.util.Scanner;
public class GuessNumberGame {
public static void main(String[] args) {
int num = (int) (Math.random() * 100 + 1);
Scanner scanner = new Scanner(System.in);
for (int i = 1; i <= 5; i++) {
System.out.println("请输入一个整数 范围1---100,包含1和100");
int userNum = scanner.nextInt();
if (userNum > num) {
System.out.println("猜大了");
} else if (userNum < num) {
System.out.println("猜小了");
} else{
System.out.println("恭喜你猜对了");
break;
}
if((5 - i)>0){
System.out.println("你还剩余:" + (5 - i) +" 次机会");
}else{
System.out.println("GameOver");
}
}
}
}
代码块的概述和分类
- 代码块概述:
在Java中,使用{}括起来的代码被称为代码块。 - 代码块分类:
根据其位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块 - 常见代码块的应用
1:局部代码块 :
在方法中出现;限定变量生命周期,及早释放,提高内存利用率
2:构造代码块 :
在类中方法外出现;多个构造方法方法中相同的代码存放到一起,每次调用构造都执行,并且在构造方法前执行
3:静态代码块:
在类中方法外出现,加了static修饰
在类中方法外出现,并加上static修饰;用于给类进行初始化,在加载的时候就执行,并且只执行一次。
继承的概述
- 继承概述:
多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。 - 继承格式:
通过extends关键字可以实现类与类的继承
class 子类名 extends 父类名 {}
单独的这个类称为父类,基类或者超类;这多个类可以称为子类或者派生类。
继承的好处、弊端及特点
- 继承的好处:
1:提高了代码的复用性
2:提高了代码的维护性
3:让类与类之间产生了关系,是多态的前提 - 继承的弊端:
类的耦合性增强了,开发的原则:高内聚,低耦合。
耦合:类与类的关系
内聚:就是自己完成某件事情的能力 - Java中类的继承特点:
1:Java只支持单继承,不支持多继承。(只有一个父类)
有些语言是支持多继承,格式:extends 类1,类2,…
2:Java支持多层继承(继承体系)
继承的注意事项和什么时候使用继承
- 继承的注意事项
1:子类只能继承父类所有非私有的成员(成员方法和成员变量)
2:子类不能继承父类的构造方法,但是可以通过super(待会儿讲)关键字去访问父类构造方法。
3:不要为了部分功能而去继承,不然容易增加类与类之间的耦合性。 - 什么时候使用继承:
如果有两个类A,B。只有他们符合A是B的一种,或者B是A的一种,就可以考虑使用继承。
继承中成员变量的关系
- 子类中的成员变量和父类中的成员变量名称不一样
- 子类中的成员变量和父类中的成员变量名称一样时
在子类中访问一个变量的查找顺序(“就近原则”)
1: 在子类的方法的局部范围找,有就使用
2: 在子类的成员范围找,有就使用
3: 在父类的成员范围找,有就使用
4:如果还找不到,就报错
this和super的区别和应用
- this和super的区别:
this 代表的是本类对象的引用
super代表的是父类存储空间的标识(可以理解成父类的引用,可以操作父类的成员) - this和super的使用:
1:调用成员变量
this.成员变量 调用本类的成员变量
super.成员变量 调用父类的成员变量
2:调用构造方法
this(…) 调用本类的构造方法
super(…) 调用父类的构造方法
3:调用成员方法
this.成员方法 调用本类的成员方法
super.成员方法 调用父类的成员方法
继承中构造方法的关系
- 子类中所有的构造方法默认都会访问父类中空参数的构造方法,因为每一个构造方法的第一条语句默认都是:super()
- 继承中构造方法的注意事项:
super(…)或者this(….)必须出现在第一条语句上
方法重写概述及其应用
- 什么是方法重写:
子类中出现了和父类中一模一样的方法声明(方法名,参数列表,返回值类型),也被称为方法覆盖,方法复写。 - 方法重写的应用:
当子类需要父类的功能,而功能主体子类有自己特有内容时,可以重写父类中的方法。
这样,即沿袭了父类的功能,又定义了子类特有的内容。 - Override和Overload的区别
方法重写就是子类不满足父类的方法,进行重新编写
而方法重载是参数类型不同或者参数个数不同 - 方法重写注意事项:
1:父类中私有方法不能被重写
因为父类私有方法子类根本就无法继承
2:子类重写父类方法时,访问权限不能更低
最好就一致
3:父类静态方法,子类也必须通过静态方法进行重写, 子类重写父类方法的时候,最好声明一模一样。
继承 猫狗案例
public class MyTest {
public static void main(String[] args) {
Dog dog = new Dog();
System.out.println(dog.name);
System.out.println(dog.age);
dog.eat();
dog.run();
System.out.println("-----------------------------");
Cat cat = new Cat();
System.out.println(cat.name);
System.out.println(cat.age);
cat.eat();
cat.run();
}
}
class Animal {
String name;
int age;
public void run() {
System.out.println("跑步");
}
}
class Dog extends Animal {
String name="来福";
int age=4;
public void eat() {
System.out.println("狗吃骨头");
}
}
class Cat extends Animal {
String name="汤姆";
int age=3;
public void eat() {
System.out.println("猫吃鱼");
}
}
final关键字概述
- final概述:
final关键字是最终的意思,可以修饰类,变量,成员方法。 - final修饰特点:
修饰类: 被修饰类不能被继承
修饰方法: 被修饰的方法不能被重写
修饰变量: 被修饰的变量不能被重新赋值,因为这个量其实是一个常量
修饰基本数据类型时,是值不能被改变
修饰引用数据类型时,是地址值不能被改变