【JAVA笔记】JAVA基础-面向对象04
一、OOP详解
- 面向对象编程(Object-Oriented Programming,OOP)
- 面向对象编程的本质就是:以类的方式组织代码,以对象的组织(封装)数据。
- 抽象
- 三大特性:封装、继承、多态、
1、 class类
我们面向对象,就是把一个一个抽象的事务具象化一个类,然后把属性和行为定义出来。
定义类
public class Cat {
String name;
int age;
void eat(){
System.out.println("小猫吃鱼!");
}
}
这就是一个类,小猫的名字和年龄是它本身的属性,吃是小猫的行为
2、类与对象的关系
类是一种抽象的数据类型,而对象是对这种抽象的类的实例化。
public static void main(String[] args) {
Cat cat = new Cat();
cat.eat();
}
二.类详解-封装
1、 this关键字
this翻译出来就是这个,每一个类都有一个this,他是一个引用。通常情况下可以省略。
在实例方法中,或者构造方法中,为了区分局部变量和实例变量,不能省略。
private String name;
public void setName(String name) {
this.name = name;
}
这个时候区分这个this.name代表类种属性的name而不是局部变量。
2 、构造方法
每个类都有一个默认的构造方法,和类名一样的无参构造。
但是如果我们写了一个构造器,系统就不会自动生成无参构造器了
public class Cat {
private String name;
int age;
public Cat() {
}
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
void eat(){
System.out.println("小猫吃鱼!");
}
}
alt+insert可以选择constrouctor快速的生成构造方法。构造方法可以重载。
3、封装
一个类的属性不应该完全暴露,不然就会被随意更改,我们需要定义一个方法,通过方法来操作我们的属性,这就是封装的基本理念

1)private强调是自己来使用
2)默认是给同包下的来使用
3)protected 强调的是给子类使用
4)public 强调的是给大家使用
封装的意义:
private 是私有的意思,我们把属性通过private修饰,然后通过方法去取值和赋值,这样对于一些违规的操作我们就可以在方法里进行过滤,比如年龄如果传过来超过一百五十岁这种。
public class Cat {
private String name;
private int age;
public Cat() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Cat(String name, int age) {
this.name = name;
this.age = age;
}
void eat(){
System.out.println("小猫吃鱼!");
}
}
alt+inser也可以快速生成
*延申-封装-可变参数:
基本概念:
java允许将同一个类中多个同名同功能但参数个数不同的方法,封装成一个方法。
基本语法:
访问修饰符 返回类型 方法名(数据类型... 形参名) {}
public class VarParameter {
public static void main(String [] args) {
HspMethod Sum = new HspMethod();
System.out.println(Sum.sum(1,2,3));
}
}
class HspMethod {
public int sum(int... nums) {
//System.out.println("接受的参数个数= " + nums.length);
int res = 0;
for(int i = 0; i < nums.length; i++) {
res += nums[i];
}
return res;
}
}
注意事项和细节
(1)可变参数可以是0个或者任意个。
(2)可变参数的实参可以是数组。
(3)可变参数的本质就是数组。
(4)可变参数可以和普通类型的参数一起放在形参列表,但必须保证可变参数在最后。
(5)一个形参列表中只能出现一个可变参数。
public class VarParameter {
public static void main(String [] args) {
HspMethod Sum = new HspMethod();
System.out.println(Sum.showScore("小明",90,100));
}
}
class HspMethod {
public String showScore(String name, double... score) {
double totalScore = 0;
for(int i = 0; i < score.length; i++) {
totalScore += score[i];
}
return name + "的总成绩为:" + totalScore;
}
}
//小明的总成绩为:190.0
三.类详解-继承
类与类直接可以继承,比如我们定义一个人类,然后男人类和女人类就可以继承人类。完全继承他的属性和方法。还有自己的特定的属性
public class Person {
private String name;
private int age;
public void eat() {
System.out.println("吃");
}
}
public class Man extends Person {
private String huzi;
public void niao(){
System.out.println("站着尿尿");
}
}
我们就定义是一个人类,基本上每个人都是有年龄名字和吃的行为,但是男人除了人类的特性,还有胡子和站着尿尿的行为,这样我们为了不重复声明属性和行为,直接继承即可。
一个类只能单继承,只能继承一个父类,但是一个父类可以有多个子类。
Object类是所有类的父类。
1、Super关键字
之前介绍了this关键字,是类的引用,Super关键字就是代表父类的引用。
public void niao(){
super.eat();
System.out.println("站着尿尿");
}
我们子类在尿尿的时候,可以调用父类吃的方法,吃完在尿
不管是显式还是隐式的父类的构造器,super语句一定要出现在子类构造器中第一行代码。所以this和 super不可能同时使用它们调用构造器的功能,因为它们都要出现在第一行代码位置。
2、方法重写
方法重写是发生在子类中,参数和方法名返回值类型都得相同。

重写 实例:
package com.cnblogs;
//本类用于实现
public class Application {
public static void main(String[] args) {
//实例化父类
Person person = new Person();
//实例化子类
Student stu = new Student();
person.getName();//父类属性
stu.getName();
//子类属性
//父类属性
}
}
package com.cnblogs;
/*
person类
*/
public class Person {
//父类属性
private String name = "父类属性";
//父类方法
public void getName(){
System.out.println(name);
}
}
package com.cnblogs;
/*
student类
*/
public class Student extends Person{
//子类属性
private String name = "子类属性";
//子类重写父类方法
@Override
public void getName() {
System.out.println(name);
//super关键字
super.getName();
}
}
四.类详解-多态
定义:父类引用指向子类对象,就是多态
多态的存在要有3个必要条件:要有继承,要有方法重写,父类引用指向子类对象
1、多态实例:
Animal 父类:
package cn.itcast.demo7;
//定义父类
public class Animal {
private String name;
// 空参构造
public Animal() {
}
// 带参构造
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 成员方法
public void eat() {
System.out.println("吃饭");
}
}
Dog 子类:
package cn.itcast.demo7;
//是Animal的子类
public class Dog extends Animal {
//对父类eat重写
@Override
public void eat() {
System.out.println(getName() + "吃骨头");
}
}
Mouse 子类:
package cn.itcast.demo7;
//子类-老鼠类
public class Mouse extends Animal {
@Override
//对父类eat重写
public void eat() {
System.out.println(getName() + "吃奶酪");
}
}
Test测试类(写法1):
package cn.itcast.demo7;
public class Test {
public static void main(String[] args) {
Animal animal1 = new Dog();
animal1.setName("哈士奇");
animal1.eat();
Animal animal2 = new Mouse();
animal2.setName("Jerry");
animal2.eat();
}
}
测试结果:
哈士奇吃骨头 Jerry吃奶酪
Test测试类(写法1):
package cn.itcast.demo7;
public class Test {
public static void main(String[] args) {
// 用来测试Dog类和Mouse类
// 测试Dog类
Dog d = new Dog();
d.setName("哈士奇");
showAnimal(d);
// 用来测试老鼠类
Mouse m = new Mouse();
m.setName("Jerry");
showAnimal(m);
}
// 多态的使用场景:父类型可以作为形参的数据类型
public static void showAnimal(Animal an) {
an.eat();
}
}
两种写法返回结果相同
备注:
1)多态关系中,成员变量不涉及重写 简单记忆:编译看左,运行看左 2)多态关系中,成员方法 简单记忆:编译看左,运行看右
2、多态调用子类独有方法实例:
Animal 父类:
package cn.itcast.demo8;
public class Animal {
public void eat() {
System.out.println("吃饭");
}
}
Dog子类:
package cn.itcast.demo8;
public class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗吃骨头");
}
public void watch() {
System.out.println("狗会看家");
}
}
Test 测试类:
package cn.itcast.demo8;
public class Test {
public static void main(String[] args) {
// 通过多态创建对象调用子类的方法
Animal an = new Dog();
// 调用eat()方法
an.eat();
// 调用watch()方法,属于子类独有的方法
// an.watch(); 不能直接使用
//1、向下转型(调用子类独有的方法)
/* Dog dog = (Dog) an;
dog.watch();*/
// 优化、判断对象是否是Dog对象,如果是再调用watch()方法
if (an instanceof Dog) {
//能走到这里说明条件满足
Dog dog = (Dog) an;
dog.watch();
}
}
}
测试结果:
狗吃骨头 狗会看家
本文来自博客园,作者:橘子偏爱橙子,转载请注明原文链接:https://www.cnblogs.com/xfbk/p/16951023.html

浙公网安备 33010602011771号