【Java基础】面向对象中
2021-03-11 06:31
标签:abstract hub 过程 info 关键字 on() protected tor 子集 这一章主要涉及面向对象的三大特征,包括封装、继承、多态、(抽象)。 程序设计追求“高内聚,低耦合”: 通俗的说,把该隐藏的隐藏起来,该暴露的暴露出来,这就是封装性的设计思想。 通过将数据声明为私有的(private),再提供公共的(public)方法:getXxx() 和 setXxx() 实现对该属性的操作,以实现下述目的: 四种访问权限修饰符:Java 权限修饰符 注意:对于 class 的权限修饰符号只可以用 为什么呢?因为外部类和外部类之间访问权限就只有包内和包外。 封装性的体现: 构造器的特征: 构造器的作用: 语法格式: 构造器的分类: 使用注意: 例子: JavaBean 是一种 Java 语言写成的可重用组件。 所谓 JavaBean,是指符合如下标准的 Java 类: 注意: 包的作用: MVC是常用的设计模式之一,将整个程序分为三个层次:视图模型层,控制器层,与数据模型层。这种将程序输入输出、数据处理,以及数据的展示分离开来的设计模式使程序结构变的灵活而且清晰,同时也描述了程序各个对象间的通信方式,降低了程序的耦合性。 为使用定义在不同包中的 Java 类,需用 import 语句来引入指定包层次下所需要的类或全部类 语法格式: 注意: 为什么要有继承?多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么多个类无需再定义这些属性和行为,只要继承那个类即可。 多个类称为子类(派生类),单独的这个类称为父类(基类 或 超类)。可以理解为:“子类 is a 父类”。 类继承语法规则: 继承的作用: 注意: 根据 UML 类图 实现功能: Circle Cylinder CylinderTest 重写:在子类中可以根据需要对从父类中继承来的方法进行改造,也称为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。 要求: 注意: 方法的重写,也是一种“多态性”:同名的方法,用不同的对象来区分调用的是哪一个方法。 在 Java 类中使用 super 来调用父类中的指定操作: 注意: 对于调用父类构造器: this 和 super 的区别: 从结果上看: 从过程上看: 理解多态性:可以理解为一个事物的多种状态。 对象的多态性:父类的引用指向子类的对象。它也可以直接应用在抽象类和接口上。 多态的使用:当调用子父类同名同参数的方法时,实际执行的是子类重写的方法,即虚拟方法调用。 Java 引用变量有两个类型:编译时类型和运行时类型。编译时类型由声明该变量时使用的类型决定,而运行时类型由实际赋给该变量的对象决定。所以,编译时,看左边;运行时,看右边。 若编译时类型和运行时类型不一致,就出现了对象的多态性(Polymorphism)。在多态情况下,看左边即看的是父类的引用(父类中不具备子类特有的方法),看右边即看的是子类的对象(实际运行的是子类重写父类的方法)。 子类可看做是特殊的父类,所以父类类型的引用可以指向子类的对象,即向上转型(upcasting)。 总结以上,多态性的使用前提是:1. 类的继承关系;2. 方法的重写。 为什么要有多态性? 对于重载而言,在方法调用之前,编译器就已经确定了所要调用的方法, 注意:多态性不适用于属性。 解释:这是由于 Java 为了实现多态的这个机制,选择让方法在运行期间绑定对应对象所对应实际类型,选择让属性在编译期间绑定其所对应实际类型。 语法: 基本数据类型的转换: 对 Java 对象的强制类型转换称为造型。需要注意: Object 类是所有 Java 类的根父类,Object 只声明了一个空参的构造器; 如果在类的声明中未使用 extends 关键字指明其父类,则默认父类为 java.lang.Object 类; Object 类的主要方法: equals 【Java基础】面向对象中 标签:abstract hub 过程 info 关键字 on() protected tor 子集 原文地址:https://www.cnblogs.com/parzulpan/p/14130156.html面向对象中
封装
private
、 default(缺省)
、protected
、public
置于类的成员定义前,用来限定对象对该类成员的访问权限。
权限修饰符
类内部
同一个包
不同包的子类
同一个工程
private
Yes
default(缺省)
Yes
Yes
protected
Yes
Yes
Yes
public
Yes
Yes
Yes
Yes
public
和 default(缺省)
。
构造器
修饰符 类名(参数列表) {
初始化语句;
}
public class ConstructorTest {
public static void main(String[] args) {
// StudentA s1 = new StudentA(); // Error
StudentA s2 = new StudentA("A", 11);
s2.printInfo();
StudentA s3 = new StudentA("A", 11, "B");
s3.printInfo();
StudentA s4 = new StudentA("A", 11, "B", "C");
s4.printInfo();
}
}
class StudentA {
String name;
int age;
String school;
String major;
StudentA(String n, int a) {
name = n;
age = a;
}
StudentA(String n, int a, String s) {
name = n;
age = a;
school = s;
}
StudentA(String n, int a, String s, String m) {
name = n;
age = a;
school = s;
major = m;
}
public void printInfo() {
System.out.println(name + " " + age + " " + school + " " + major);
}
}
JavaBean
UML 类图
+
表示 public 类型,-
表示 private 类型, #
表示 protected 类型;+
、-
)方法名(参数名:参数类型): 返回值类型。this 的使用
this(形参列表)
的方式,调用本类中重载的其他构造器;this(形参列表)
的方式调用自身构造器;this(形参列表)
;this(形参列表)
必须声明在类的构造器的首行;this(形参列表)
;package、import 的使用
package 顶层包名.子包名;
;“.”
来指明包(目录)的层次;cn.parzulpan.xxx
。
MVC 设计模式
import
(.*)
。import 语句告诉编译器到哪里去寻找类。import 包名. 类名;
继承
class SubClass extends SuperClass{}
“extends”
,即子类不是父类的子集,而是对父类的“扩展”。
方法的重写
super
this(参数列表)
或者 super(参数列表)
语句指定调用本类或者父类中相应的构造器。同时,只能”二选一”,且必须放在构造器的首行;package com.parzulpan.java.ch04;
import java.util.Date;
/**
* @Author : parzulpan
* @Time : 2020-11-20
* @Desc :
*/
public class SuperTest {
public static void main(String[] args) {
}
}
class SuperPerson {
private String name;
private int age;
private Date birthDate;
public SuperPerson(String name, int age, Date d) {
this.name = name;
this.age = age;
this.birthDate = d;
}
public SuperPerson(String name, int age) {
this(name, age, null);
}
public SuperPerson(String name, Date d) {
this(name, 30, d);
}
public SuperPerson(String name) {
this(name, 30);
}
}
class SuperStudent extends SuperPerson {
private String school;
public SuperStudent(String name, int age, String s) {
super(name, age);
school = s;
}
public SuperStudent(String name, String s) {
super(name);
school = s;
}
// 编译出错: no super(),系统将调用父类无参数的构造器。
public SuperStudent(String s) {
school = s;
}
}
区别点
this
super
访问属性
访问本类中的属性,如果本类没有此属性则从父类中继续查找
直接访问父类中的属性
调用方法
访问本类中的方法,如果本类没有此方法则从父类中继续查找
直接访问父类中的方法
调用构造器
代表本类对象的引用,调用本类构造器,必须放在构造器的首行
代表父类的内存空间的标识,调用父类构造器,必须放在子类构造器的首行
子类对象实例化过程
多态
// 使用举例一
package com.parzulpan.java.ch04;
/**
* @Author : parzulpan
* @Time : 2020-11-20
* @Desc : 多态的使用举例一
*/
public class PolymorphismTest {
public static void main(String[] args) {
PolymorphismTest polymorphismTest = new PolymorphismTest();
polymorphismTest.func(new Cat()); //
polymorphismTest.func(new Dog()); //
}
public void func(AnimalA animalA) {
animalA.eat();
animalA.shout();
}
}
class AnimalA {
public void eat() {
System.out.println("动物:进食!");
}
public void shout() {
System.out.println("动物:叫!");
}
}
class Cat extends AnimalA {
public void eat() {
System.out.println("猫:进食!");
}
public void shout() {
System.out.println("猫:叫!");
}
}
class Dog extends AnimalA {
public void eat() {
System.out.println("狗:进食!");
}
public void shout() {
System.out.println("狗:叫!");
}
}
// 使用举例二
package com.parzulpan.java.ch04;
import java.sql.Connection;
/**
* @Author : parzulpan
* @Time : 2020-11-20
* @Desc : 多态的使用举例二,操作不同的数据库
*/
public class PolymorphismTest1 {
public static void main(String[] args) {
DBDriver d = new DBDriver();
d.doData(new MySQLConnection);
d.doData(new OracleConnection);
d.doData(new Db2Connection);
}
}
class DBDriver {
public void doData(Connection connection) {
// 一些数据库操作
}
}
这称为“早绑定”或“静态绑定”;而对于多态而言,只有等到方法调用的那一刻,解释运行器才会确定所要调用的具体方法,这称为“晚绑定”或“动态绑定”。instanceof 操作符
x instanceof A
检验 x 是否为类 A 的对象,返回值为 boolean 型。
对象类型转换
Object
public class Person {
// ...
}
// 等价于:
public class Person extends Object {
// ...
}
method(Object obj){…} //可以接收任何类作为其参数
Person o=new Person();
method(o);
包装类
练习和总结