@月月鸟
Java 是面向对象的高级编程语言,类和对象是 Java 程序的构成核心。
围绕着 Java 类和 Java 对象,有三大基本特性:封装是 Java 类的编写规范、继承是类与类之间联系的一种形式、而多态为系统组件或模块之间解耦提供了解决方案。
面向对象和面向过程的思想有着本质上的区别, 作为面向对象的思维来说,当你拿到一个问题时,你分析这个问题不再是 第一步先做什么,第二步再做什么(面向过程) 这是面向过程的思维
面向对象有一个非常重要的设计思维:合适的方法应该出现在合适的类里面
面向对象
对象是用于计算机语言对问题域中事物的描述,对象通过“属性(attribute)”和“方法(method)”来分别对应事物所具有的静态属性和动态属性。
类是用于描述同一类的对象的一个抽象的概念,类中定义了这一类对象所具有的静态属性和动态属性
- 类是用于描述同一类的对象的一个抽象的概念,类中定义了这一类对象所具有的静态属性和动态属性
- 类可以看成一类对象的模板,对象可以看成该类的一个具体实例。
1. 定义类
抽象对象之间的共同特征,是具有相同属性和方法的一组对象的集合
- 类 格式:
【访问修饰符】class 类名{
// 类的内部具体代码
}
// 人类
public class person {
// 类的内部具体代码
}
- 类 属性:
【访问修饰符】数据类型 属性名
// 人类
public class person {
//姓名
public String name;
//年龄
publi int ags;
}
- 类 方法
【访问修饰符】返回类型 方法名称(参数类型 参数名1,参数类型 参 数名2,······){
// 方法的内部具体代码
}
public void work(){
System.out print(this.name+" ");
}
2 . 创建和使用对象
- 创建对象
类名 对象名 = new 类名();
Person hanbing = new Person();
- 使用对象
对象名. 属性
对象名. 方法名
hanbing.name = "寒冰";
hanbing.age = 22;
- 对象数组
public class Person {
// 属性
public int age;
public String name;
// 有参构造方法
public Person(int age, String name) {
this.age = age;
this.name = name;
}
public static void main(String[] args) {
Person s = new Person(2, "康");
Person q = new Person(3, "李");
Person[] a = { s, q };
for (int i = 0; i < a.length; i++) {
System.out.print(a[i].age + a[i].name);
}
}
}
输出结果为:
2康3李
成员方法
1. 带参数的方法
方法的返回值(两种情况):
- 如果方法具有返回值,方法中必须使用关键字return返回该值,返回值类型为该返回值的类型
public class Student{
String name = "张三";
public String getName(){
return name;
}
//……
}
语法:return 表达式; 作用: 跳出方法、返回结果;
- 如果方法没有返回值,返回值类型为void
public class Student{
String name = "张三";
public void getName(){
}
//……
}
方法调用:
定义带参数的方法:
<访问修饰符> 返回类型 <方法名>(<形式参数列表>) {
//方法的主体
}
访问修饰符:该方法允许被访问调用的权限范围;返回类型:方法返回值的类型;形式参数列表:传送给方法的形参列表
public class StudentsBiz {
String[ ] names = new String[30];
public void addName(String name) { (没有返回值)
//增加学生姓名 (一个形式参数)
}
public void showNames() { //显示全部学生姓名
}
}
调用带参数的方法:
对象名.方法名(参数1, 参数2,……,参数n) (实参列表)
public static void main(String[] args) {
StudentsBiz st = new StudentsBiz(); (先实例化对象,再使用方法)
Scanner input = new Scanner(System.in);
for(int i=0;i<5;i++){
System.out.print("请输入学生姓名:");
String newName = input.next();
st.addName(newName); (实参的类型、数量、顺序都要与形参一一对应)
}
st.showNames();
}
总结:
形参和实参
1.方法定义处,参数叫做形式参数,也叫形参(主要约束参数的类型的)
2.形参名字可以随便取,但是要符合驼峰命名规则,同时要有意义
3.方法调用处,参数叫做实际参数,也叫实参
4.实参名字也可以随便取,但是遵循驼峰命名规则,同时也要有意义
5.实参和形参的类型必须一致,名字可以一致,也可以不一致
6.方法有没有返回值,和方法有没有参数,没有任何关系
7.方法参数可以有一个,也可以有多个,多个参数之间用逗号隔开(形参和实参都是这样)
8.形整和实参数量一定要一致,数据类型一定要一致
2.方法重载
方法名 一样,但参数不一样,这就是重载。
所谓的参数不一样,主要有两点:第一是参数的个数不一样,第二是参数的类型不一样。只要这两方面有其中的一方面不一样就可以构成方法的重载了。
public class TestOverLoad {
void max(int a, int b) {
System.out.println(a > b ? a : b);
}
/*
* int max(int a, int b) {
* return a > b ? a : b;
* }
*/
void max(float a, float b) {
System.out.println(a > b ? a : b);
}
}
注意:
- 这里有void修饰符的两个max方法名字相同,但它们的参数类型不一样,所以可以构成重载。
- 而int max(int a , int b)方法与void max(int a, int b)方法是不构成重载的,现在它们是重名的两个方法,在一个类中声明两个重名的方法是不允许的,编译会出错。
- 方法名一样,参数类型一样,只有返回值不一样,这个不构成重载,因为方法可以这么调用,调用一个方法时可以不使用的它返回值,所以当调用这两个方法时,把整型的数传进去,由于两个方法都是一样的名字,一样的参数类型,所以编译器无法区分到底要调用的是哪一个方法。
- 构成重载深层次的原因:只要这两个方法编译器能区分开来,在调用的时候知道要调用的是哪一个,不会产生混淆,这两个方法就构成重载。
示例:
int max(int a, int b) {
System.out.println("调用的int max(int a, int b)方法");
return a > b ? a : b;
}
int max(short a, short b) {
System.out.println("调用的int max(short a, short b)方法");
return a > b ? a : b;
}
这两个方法也是可以构成重载的,因为编译器一看到整数,就会把它当作int类型。所以当把整数传进来的时候,编译器首先调用的是max(int a , int b)这个方法。而要想调用max(short a ,short b)这个方法,那么就得在main方法里面这样写:
public static void main(String[] args) {
TestOverLoad t= new TestOverLoad();
t.max(3,4); //这里调用的是max(int a , int b)这个方法
short a = 3;
short b = 4;
t.max(a, b); //这里调用的是max(short a , short b)这个方法。
}
3.成员变量
成员变量和局部变量:
变量声明的位置决定变量作用域
变量作用域确定可在程序中按变量名访问该变量的区域
成员变量和局部变量的区别:
- 作用域不同
局部变量的作用域仅限于定义它的方法
成员变量的作用域在整个类内部都是可见的
- 初始值不同
Java会给成员变量一个初始值
Java不会给局部变量赋予初始值
注意:
-
在同一个方法中,不允许有同名局部变量;在不同的方法中,可以有同名局部变量
-
在同一个类中,成员变量和局部变量同名时,局部变量具有更高的优先级
4.构造方法
一个新对象初始化的最终步骤是通过new关键字去调用对象的构造方法,构造方法需满足如下要求:
(1)方法名必须与类名称完全相匹配;
(2)构造方法不需要返回类型;
(3)构造方法不能被static、final等关键字修饰,且不能有return返回语句。
(4)在创建对象时,要调用new,如:book b1=new book();
(5)当没有指定构造方法时,系统会自动添加无参的构造方法
(6)当有指定构造方法时,无论该构造方法是有参,还是无参,系统都不会再自动添加无参的构造方法
(7)构造方法的重载:方法名相同,但参数不同的多个方法,调用时会自动根据不同的参数选择相应的方法
无参的构造方法
class person{
public person(){
System.out.println("无参的构造方法被调用了。。。");
}
}
class Ex11{
public static void main(String[] args){
person p=new person();
}
}
有参的构造方法(目的就是为了给对象实例变量赋值)
class person{
int age;
public person(int a){
age=a;
}
public void speak(){
System.out.println("I am "+age+" years old");
}
}
class Ex11{
public static void main(String[] args){
person p=new person();
p.speak();
}
}
构造方法重载
package test;
public class Person {
String name;
int age;
public Person() {
System.out.println("无参数构造方法");
}
public Person(String name) {
this();
this.name = name;
System.out.println("姓名:"+name);
}
public Person(String n, int a) {
this(n);
this.age = a;
System.out.println("姓名:"+name+" "+"年龄:"+age);
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void getName() {
System.out.println("姓名:"+name);
}
public void getAge() {
System.out.println("年龄:"+age);
}
public static void main(String[] args) {
Person p = new Person("张三",20);
p.getAge();
p.setAge(30);
p.getAge();
}
}
this关键字:
/*
关键字this:
1,在普通方法中,关键字this代表方法的调用者,即本次调用了该方法的对象
2,在构造方法中,关键字this代表了该方法本次运行所创建的那个新对象
*/
class A
{
private int i;
public A(int i)
{
this.i = i; //将形参 i 赋给该构造方法本次运行所创建的那个新对象的i数据成员
}
public void show(){
System.out.println("i = " + this.i);
//this表示当前时刻正在调用show方法的对象
//this可以省略
}
}
public class TestThis
{
public static void main(String[] args){
A aa1 = new A(100);
aa1.show();
A aa2 = new A(200);
aa2.show();
}
}
- 使用this 调用成员变量,解决成员变量和局部变量的同名冲突。
- 使用this调用成员方法。
- 使用this调用重载的构造的方法,只能在构造方法中使用,且必须是构造方法的第一条语句。
下期了解面向对象的特性之一‘封装’,以上内容可能会有出入,部分出自转载,欢迎大家踊跃留言指正。