Retrospection
Java中方法的定义:
1 2 3 4
| 修饰符 (public static) 返回值的数据类型 (void/int/boolean...) 方法名(数据类型 参数名1, 数据类型 参数名2) { 方法体; return 具体的返回值;(如果返回值是void类型可以不写) }
|
其中修饰符,可以简单的理解为: public static(后续会说的)
具体案例:
1 2 3 4
| public static int getSum(int a, int b){ int sum = a + b; return sum; }
|
方法重载OverLoaded
简单理解方法重载: 就是在同一个类中, 出现方法名称相同, 但是参数列表不同(参数个数, 参数的数据类型不同)
两个或两个或者多个方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
public class OverLoaded {
public static void main(String[] args) { boolean flag = compare(10, 20); System.out.println(flag); short s1 = 11, s2 = 22; compare(s1, s2);
}
public static boolean compare(byte b1, byte b2) { System.out.println("比较byte类型"); return b1 == b2; } public static void compare(short b1, short b2){ System.out.println("比较short类型"); System.out.println(b1 == b2); } public static boolean compare(int b1, int b2){ System.out.println("比较int类型"); return b1 == b2; } public static boolean compare(long b1, long b2){ System.out.println("比较long类型"); return b1 == b2; } }
|
Java中参数传递问题
形参如果是基本类型, 则形参的改变对实参没有任何影响*,因为传递的是:* *数值,*也叫值传递
形参如果是引用类型, 则形参的改变对实参有直接影响, 因为传递的是: 地址值, 也叫引用传递
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
public class TransParameter { public static void main(String[] args) { int number = 10; System.out.println("调用change方法前: " + number); change(number); System.out.println("调用change方法后: " + number); int[] arr = {10, 20, 30}; System.out.println("调用change方法前: " + arr[1]); change(arr); System.out.println("调用change方法后: " + arr[1]); } public static void change(int number){ number = 100; } public static void change(int[] arr){ arr[1] = 200; } }
|
面向对象ObjectOriented
面向对象是什么: 它是一种编程思想, 强调的是以 对象 为基础完成各种操作.
面向对象的三大基本特性, 封装,继承,多态.
类: 属性和行为的集合,
是一个抽象的概念, 看不见, 也摸不着.
对象: 类的具体体现, 实现.
属性: 也叫成员变量,
字段, 就是事物的外在特征(名词).
行为: 也叫成员方法,
就是描述事物能够做什么(动词).
如何定义类
1 2 3 4 5 6
| public class 类名 { }
|
封装
概述:
封装就是隐藏对象的属性和实现细节, 仅对外提供一个公共的访问方式.
Q1: 怎么隐藏?
A1: 可以通过 private 关键字实现, 被它修饰的内容只能在本类中直接访问.
Q2: 公共的访问方式是什么? A2: 指的是 getXxx() 和 setXxx()方法.
Q3: 封装的好处是什么? A3: 提高代码的安全性(private保证), 提高代码的复用性(方法).
Q4: 封装的弊端是什么, 针对于private来讲? A4: 代码的冗余度增加了.
Q5: 目前我们在setPrice()方法中是没有做到见名知意的, 只是传入了一个p, 那如何解决这个问题呢? A5: 通过 this 关键字解决, 它是用来解决局部变量和成员变量重名问题的. this关键字解释: 它表示当前对象的引用, 谁调用, 它就代表谁.
Demo
Student.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| package com.heima.oop;
public class Student { int age = 30; public void show(){ int age = 20; System.out.println(age); System.out.println(this.age); } }
|
Student_demo.java
1 2 3 4 5 6 7 8 9 10 11 12
| package com.heima.oop;
public class StudentDemo { public static void main(String[] args) { Student s = new Student(); s.show(); System.out.println(s.age); } }
|
result结果: 为20, 30, 30
为什么:
Java中使用变量遵循就近原则, 局部有就使用, 没有就去本类的成员位置找,有就使用, 没有就去父类的成员位置找, 有就使用, 没有就报错.
这里不考虑父类的父类这种情况,因为会一直找下去, 直至找到Object类.
私有属性Private
Demo
Student.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| package com.heima.private_exercise;
public class Student { private String name; private int age; public Student(){ System.out.println("我是空参构造"); } public Student(String name, int age){ System.out.println("我是全参构造"); this.name = name; this.age = age; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public void setAge(int age) { this.age = age; }
public int getAge() { return age; } public void study(){ System.out.println("好好学习,天天向上"); } }
|
PrivateDemo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package com.heima.private_exercise;
public class PrivateDemo { public static void main(String[] args) { Student s = new Student(); s.setName("刘亦菲"); s.setAge(33); System.out.println(s.getName() + ',' + s.getAge()); s.study(); Student s2 = new Student("高圆圆",33); System.out.println(s2.getName() + "," + s2.getAge()); s2.study(); } }
|
继承
概述
实际开发中, 我们发现好多类中的部分内容是相似的或者相同的, 每次写很麻烦, 针对于这种情况, 我们可以把这些相同(相似)的然后单独的定义到一个类中, 然后让那多个类和这个类产生关系, 这个关系就叫继承, Java中, 继承用 extends 关键字表示.
格式
class A extends B { //子承父业 }
叫法
类A: 子类, 派生类
类B: 父类, 基类, 超类.
好处
1. 提高代码的复用性.
- 提高代码的可维护性.
- 让类与类之间产生关系, 是多态的前提.
弊端
类与类之间的耦合性太强了.
开发原则: 高内聚, 低耦合.
继承关系中成员的特点:
成员变量: 就近原则. 构造方法: 子空参访问父空参, 子全参访问父全参. 成员方法: 就近原则.
Demo
Animal.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| package com.heima.extend;
public class Animal { private String name; private int age; int num = 30; public Animal() { }
public Animal(String name, int age) { this.name = name; this.age = age; }
public String getName() { return name; }
public int getAge() { return age; }
public void setName(String name) { this.name = name; }
public void setAge(int age) { this.age = age; } public void eat(){ System.out.println("动物会吃!"); } }
|
Cat.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| package com.heima.extend;
public class Cat extends Animal { public Cat(){ super(); } public Cat(String name , int age){ super(name, age); } int num = 20; public void show(){ int num = 10; System.out.println(num); System.out.println(this.num); System.out.println(super.num); } public void eat(){ System.out.println("猫吃鱼!"); } }
|
Demo.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| package com.heima.extend;
public class Demo1 { public static void main(String[] args) { Cat c = new Cat(); c.setName("加菲猫"); c.setAge(13); System.out.println(c.getName() + "," + c.getAge()); c.eat(); NewPhone np = new NewPhone(); np.call();
} }
|
多态
1 2
| Animal an = new Cat(); Cat c = new Cat();
|
多态的好处:
父类型可以作为方法的形参类型, 这样可以接受其任意的子类对象.
根据多态的成员方法调用规则”编译看左, 运行看右”传入什么对象, 就掉谁的方法
前提:
1. 必须有继承或者实现关系.
2. 必须父类(父接口)引用指向子类对象.
3. 必须有方法重写, 不然多态无意义.
多态中的成员方法特点:
成员变量: 编译看左, 运行看左. 成员方法: 编译看左, 运行看右.
多态的好处:
父类型可以作为方法的形参类型, 这样可以接受其任意的子类对象.
根据多态的成员方法调用规则”编译看左, 运行看右”传入什么对象, 就掉谁的方法.
多态的弊端:
父类引用不能直接使用子类的特有成员.
如何解决?
向下转型.
1 2
| Animal an = new Cat(); 向上转型. double d = 10; 隐转 Cat c = (Cat)an; 向下转型. int a = (int)d; 强转
|