Java的类演进过程
1、从面向过程到面向对象
class Person {
String name;
int age;
public void eat(){
System.out.println("Person can eat.");
}
}
类是抽象的,不能直接对类来进行操作,需要将此类具体化,所以需要将类转换为对象,同过new关键字来创建一个该类的对象。
Person per = new Person();
通过per对象来进行操作,包括类属性的赋值和函数的执行。
public class ClassDemo {
public static void main(String[] args){
Person per = new Person();
per.age = 30;
per.name = "Wendy";
per.eat();
}
}
Person per1 = new Person();
per1.age = -30;
如果外面的程序可以随意修改一个类的成员变量,会造成不可预料的程序错误,比如数据的错误、混乱或安全性问题。所以我们需要将类的成员变量进行封装,使用private关键字来说明成员变量的访问权限,只有该类的其他成员方法可以调用,其他类中的方法不能调用,这个成员变量就成为了私有成员变量。
class Person{
private String name;
private int age;
public void eat(){
System.out.println("ClassDemo can eat.");
}
}
为了实现良好的封装性,通常将类的成员变量声明为private,再通过public方法来对这个变量进行访问。对一个变量的操作,一般都有读取和赋值操作,分别定义两个方法来实现这两种操作,一个是getXxx(),用来读取这个成员变量操作,另外一个是setXxx(),用来对这个成员变量赋值。
class Person{
private String name;
private int age;
//设置年龄
public void setAge(int age) {
this.age = age;
}
//读取年龄
public int getAge() {
return age;
}
//设置姓名
public void setName(String name) {
this.name = name;
}
//读取姓名
public String getName() {
return name;
}
public void eat(){
System.out.println("Person can eat.");
}
}
public class FunctionDemo {
public static void main(String[] args) {
System.out.println(sum(10,20));
System.out.println(sum1(10,20,30));
System.out.println(sum2(10,20,30,40));
System.out.println(sum3(10.5f,20f));
}
//需求1:求两个数的和
public static int sum(int a,int b) {
System.out.println("int");
return a + b;
}
//需求2:求三数的和
public static int sum1(int a,int b,int c) {
return a + b + c;
}
//需求3:求四个数的和
public static int sum2(int a,int b,int c,int d) {
return a + b + c + d;
}
//需求4:求浮点数的和
public static float sum3(float a,float b) {
System.out.println("float");
return a + b;
}
}
public class FunctionDemo {
public static void main(String[] args) {
//jvm会根据不同的参数去调用不同的功能
System.out.println(sum(10,20));
System.out.println(sum(10, 20, 30));
System.out.println(sum(10, 20, 30, 40));
System.out.println(sum(10.5f, 20f));
}
//需求1:求两个数的和
public static int sum(int a,int b) {
System.out.println("int");
return a + b;
}
//需求2:求三数的和
public static int sum(int a,int b,int c) {
return a + b + c;
}
//需求3:求四个数的和
public static int sum(int a,int b,int c,int d) {
return a + b + c + d;
}
//需求4:求浮点数的和
public static float sum(float a,float b) {
System.out.println("float");
return a + b;
}
}
而方法重载我们会在一般方法上使用,但是更多的是使用在构造方法上。这里就不解释什么叫构造方法了,可以另行学习。当创建一个对象时,JVM会去调用对应类的构造方法,根据构造方法来为类的成员变量进行数据初始化赋值。默认的构造方法是无参构造,但是我们定义了多个构造方法,而且这些构造方法具有不同个数或不同类型的参数,编译器就会根据括号中传递的参数来选择相应的构造方法。
class Person{
private String name;
private int age;
//无参构造方法
public Person() {
System.out.println("调用无参构造方法");
}
//参数为name的构造方法
public Person(String name){
System.out.println("调用参数为name的构造方法");
this.name = name;
}
//参数为age的构造方法
public Person(int age){
System.out.println("调用参数为age的构造方法");
this.age = age;
}
//参数为name,age的构造方法
public Person(String name, int age) {
System.out.println("调用参数为name,age的构造方法");
this.name = name;
this.age = age;
}
//设置年龄
public void setAge(int age) {
this.age = age;
}
//读取年龄
public int getAge() {
return age;
}
//设置姓名
public void setName(String name) {
this.name = name;
}
//读取姓名
public String getName() {
return name;
}
}
public class ClassDemo {
public static void main(String[] args){
Person per1 = new Person();
System.out.println("Name:"+per1.getName()+"\tAge:"+per1.getAge());
Person per2 = new Person("Wendy");
System.out.println("Name:"+per2.getName()+"\tAge:"+per2.getAge());
Person per3 = new Person(25);
System.out.println("Name:"+per3.getName()+"\tAge:"+per3.getAge());
Person per4 = new Person("Ann",30);
System.out.println("Name:"+per4.getName()+"\tAge:"+per4.getAge());
}
}
class Student{
private String name;
private int age;
Student() {}
Student(String name, int age) {
this.name = name;
this.age = age;
}
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 void eat(){
System.out.println("Person can eat.");
}
}
class Teacher{
private String name;
private int age;
Teacher() {}
Teacher(String name, int age) {
this.name = name;
this.age = age;
}
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 void eat(){
System.out.println("Person can eat.");
}
}
class Person{
private String name;
private int age;
Person() {}
Person(String name, int age) {
this.name = name;
this.age = age;
}
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 void eat(){
System.out.println("Person can eat.");
}
}
class Student extends Person{
Student() {}
}
class Teacher extends Person{
Teacher() {}
}
public class ExtendsDemo {
public static void main(String[] args) {
Student stu = new Student();
stu.setName("Wendy");
stu.setAge(28);
System.out.println("Name:" + stu.getName() + "\tAge:" + stu.getAge());
stu.eat();
Teacher teacher = new Teacher();
teacher.setName("Yan");
teacher.setAge(45);
System.out.println("Name:"+teacher.getName()+"\tAge:"+teacher.getAge());
teacher.eat();
}
}
class Student extends Person {
Student() {
}
public void eat() {
System.out.println("Student can eat.");
}
}
class Teacher extends Person {
Teacher() {
}
public void eat() {
System.out.println("Teacher can eat.");
}
}
测试类:
public class ExtendsDemo {
public static void main(String[] args) {
Student stu = new Student();
stu.setName("Wendy");
stu.setAge(28);
System.out.println("Name:" + stu.getName() + "\tAge:" + stu.getAge());
stu.eat();
Teacher teacher = new Teacher();
teacher.setName("Yan");
teacher.setAge(45);
System.out.println("Name:"+teacher.getName()+"\tAge:"+teacher.getAge());
teacher.eat();
}
}
class Fu {
public int num = 100;
//成员方法
public void show() {
System.out.println("show Fu");
}
//成员静态方法
public static void function() {
System.out.println("function Fu");
}
}
class Zi extends Fu {
public int num = 1000;
public int num2 = 200;
//成员方法
public void show() {
System.out.println("show Zi");
}
//子类特有的方法
public void method() {
System.out.println("method zi");
}
//成员静态方法
public static void function() {
System.out.println("function Zi");
}
}
public class DuoTaiDemo {
public static void main(String[] args) {
//要有父类引用指向子类对象。
//父类 f = new 子类();
Fu f = new Zi();
System.out.println(f.num); //100
//找不到符号
//System.out.println(f.num2);
f.show(); //show zi
//找不到符号
//f.method();
f.function(); //functin Fu
}
}
public class DuoTaiDemo {
public static void main(String[] args) {
//父类 f = new 子类();
Fu f = new Zi();
System.out.println(f.num); //
f.show(); //show zi
f.function(); //functin Fu
Zi zi = (Zi)f;
zi.method(); //method zi
}
}
abstract class Person {
private String name;
private int age;
protected Person() {}
Person(String name, int age) {
this.name = name;
this.age = age;
}
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 abstract void eat();
public abstract void sleep();
}
class Student extends Person {
public Student(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("Student can eat.");
}
public void sleep(){
System.out.println("Student can sleep.");
}
}
class Teacher extends Person {
public Teacher(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("Teacher can eat.");
}
public void sleep(){
System.out.println("Teacher can sleep.");
}
}
测试类:
public class AbstractDemo {
public static void main(String[] args){
Person per1 = new Student("Jone",16);
per1.eat();
per1.sleep();
System.out.println("Name:"+per1.getName()+"\tAge:"+per1.getAge());
Person per2 = new Teacher("Sam",60);
per2.eat();
per2.sleep();
System.out.println("Name:"+per2.getName()+"\tAge:"+per2.getAge());
}
}
//定义动物培训接口
interface AnimalTrain {
public abstract void jump();
}
//抽象类实现接口
abstract class Dog implements AnimalTrain {
}
//具体类实现接口
class Cat implements AnimalTrain {
public void jump() {
System.out.println("猫可以跳高了");
}
}
class InterfaceDemo {
public static void main(String[] args) {
//AnimalTrain是抽象的; 无法实例化
//AnimalTrain at = new AnimalTrain();
//at.jump();
AnimalTrain at = new Cat();
at.jump(); //猫可以跳高了
}
}
2)关系区别:
//定义抽烟接口
interface Smoking {
//抽烟的抽象方法
public abstract void smoke();
}
//定义抽象人类
abstract class Person {
//姓名
private String name;
//年龄
private int age;
public Person() {}
public Person(String name,int age) {
this.name = name;
this.age = age;
}
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 abstract void eat();
//睡觉(){}
public void sleep() {
System.out.println("睡觉觉了");
}
}
//具体老师类
class Teacher extends Person {
public Teacher() {}
public Teacher(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("吃大白菜");
}
}
//具体学生类
class Student extends Person {
public Student() {}
public Student(String name,int age) {
super(name,age);
}
public void eat() {
System.out.println("吃红烧肉");
}
}
//抽烟的老师
class SmokingTeacher extends Teacher implements Smoking {
public SmokingTeacher() {}
public SmokingTeacher(String name,int age) {
super(name,age);
}
public void smoke() {
System.out.println("抽烟的老师");
}
}
//抽烟的学生
class SmokingStudent extends Student implements Smoking {
public SmokingStudent() {}
public SmokingStudent(String name,int age) {
super(name,age);
}
public void smoke() {
System.out.println("抽烟的学生");
}
}
public class InterfaceDemo {
public static void main(String[] args) {
//测试学生
SmokingStudent ss = new SmokingStudent();
ss.setName("杨小红");
ss.setAge(27);
System.out.println(ss.getName()+"---"+ss.getAge());
ss.eat();
ss.sleep();
ss.smoke();
System.out.println("-------------------");
SmokingStudent ss2 = new SmokingStudent("陈小明",30);
System.out.println(ss2.getName()+"---"+ss2.getAge());
ss2.eat();
ss2.sleep();
ss2.smoke();
//测试老师
SmokingTeacher st = new SmokingTeacher("陈老师",36);
System.out.println(st.getName()+"---"+st.getAge());
st.eat();
st.sleep();
st.smoke();
}
}
Java的类演进过程的更多相关文章
- 一道题反映Java的类初始化过程
Java的类初始化过程: 1. 父类的static成员变量,static语句块. 2. 子类的static成员变量,static语句块. 3. 父类的普通成员变量,构造函数. 4. 子类的普通成员变量 ...
- Java 创建类的过程
创建对象过程: 堆分配父类空间 堆分类子类空间 属性初始化 调用构造方法(第一行是调用父类构造方法)
- Java:验证在类继承过程中equals()、 hashcode()、toString()方法的使用
以下通过实际例子对类创建过程汇中常用的equals().hashcode().toString()方法进行展示,三个方法的创建过程具有通用性,在项目中可直接改写. //通过超类Employee和其子类 ...
- 深入理解Java对象的创建过程:类的初始化与实例化
摘要: 在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类 ...
- Java虚拟机加载类的过程
Java虚拟机的类加载,从class文件到内存中的类,按先后顺序需要经过加载/链接/初始化三大步骤. Java语言的类型分为两大类:基本类型(primitive types)和引用类型(referen ...
- 深入学习Java对象创建的过程:类的初始化与实例化
在Java中,一个对象在可以被使用之前必须要被正确地初始化,这一点是Java规范规定的.在实例化一个对象时,JVM首先会检查相关类型是否已经加载并初始化,如果没有,则JVM立即进行加载并调用类构造器完 ...
- Java对象的创建过程:类的初始化与实例化
一.Java对象创建时机 我们知道,一个对象在可以被使用之前必须要被正确地实例化.在Java代码中,有很多行为可以引起对象的创建,最为直观的一种就是使用new关键字来调用一个类的构造函数显式地创建对象 ...
- Java NIO 机制分析(一) Java IO的演进
一.引言 Java1.4之前的早期版本,Java对I/O的支持并不完善,开发人员再开发高性能I/O程序的时候,会面临一些巨大的挑战和困难,主要有以下一些问题: (1)没有数据缓冲区,I/O性能存在问题 ...
- java代码的初始化过程研究
刚刚在ITeye上看到一篇关于java代码初始化的文章,看到代码我试着推理了下结果,虽然是大学时代学的知识了,没想到还能做对.(看来自己大学时掌握的基础还算不错,(*^__^*) 嘻嘻……)但 ...
随机推荐
- mysql 导出表结构
mysql导出数据库各表结构,很简单只要一条命令即可: mysqldump -uxxx -d databasename [,table] > xxx.sql mysqldump中-d参数即为只导 ...
- 何谓IOC的核心思想
IOC(Inversion of Control)即控制反转,是在面试或平常交流中经常遇到了词汇:我也曾经仿照Spring,利用JDK的反射和动态代理实现了一个简单的IOC框架,感觉算是知其然也知其所 ...
- 终于解决了我的DISCUZ 无法连接到您的服务器,可能您的服务器处于防火墙后端 论坛云平台的问题~
事由:由于前几天折腾备份,将论坛源文件误删了大部分,于是我重新下载了源码,传到了空间. 然后问题来了,我关闭纵横搜索提示“无法连接到您的服务器,可能您的服务器处于防火墙后端”,设置纵横搜索页一直显示“ ...
- Linux C 程序 指针和字符串函数(11)
指向字符串的指针 C语言访问字符串很多方法:1.用字符数组存放一个字符串 char string[] = "Linux C"; printf("%s\n".st ...
- 使用CSS修改HTML5 input placeholder颜色( 转载 )
问题:Chrome支持input=[type=text]占位文本属性,但下列CSS样式却不起作用: input[placeholder], [placeholder], *[placeholder] ...
- Android:ListView之ViewHolder
前言 在开发Android应用过程中经常要与列表展示打交道,比如Listview.在使用过程中如果不能正确的进行细节处理那么对性能还是有很大的损耗的. Listview展示内容是通过一个Adapter ...
- Cassandra1.2文档学习(18)—— CQL数据模型(下)
三.集合列 CQL 3 引入了一下集合类型: •set •list •map 在关系型数据库中,允许用户拥有多个email地址,你可以创建一个email_addresses表与users表存在一个多对 ...
- [大牛翻译系列]Hadoop系列性能部分完结
Hadoop系列性能部分完结.其它的部分发布时间待定. Hadoop系列将不再一日一篇,开始不定期发布.
- [译]Java Thread wait, notify和notifyAll示例
Java Thread wait, notify和notifyAll示例 Java上的Object类定义了三个final方法用于不同线程间关于某资源上的锁状态交互,这三个方法是:wait(), not ...
- 《C和指针》 读书笔记 -- 第14章 预处理器
1.相邻字符串常量被自动链接为一个字符串:"my""name"="myname" 2.##把位于两边的符号连接成一个符号: #define ...