代码演示二如下:
public class Student {
//成员变量----------描述对象的属性
String name;
int age;
String address;
//方法-------------描述对象的行为
void study(){
System.out.println(name+"在学习...");
}
void sayHi(){
System.out.println("大家好,我叫"+name+",今年"+age+"岁了,家住"+address);
}
}
public class StudentTest {
public static void main(String[] args) {
//创建一个学生对象
Student zs = new Student();
//访问成员变量
zs.name = "zhangsan";
zs.age = 24;
zs.address = "广东深圳";
//调用方法
zs.study();
zs.sayHi();
Student ls = new Student();
ls.name = "lisi";
ls.age = 25;
ls.address = "黑龙江哈尔滨";
ls.study();
ls.sayHi();
//1)创建了一个学生对象
//2)给成员变量赋默认值
Student ww = new Student();
ww.study();
ww.sayHi();
}
}
代码演示如下:
public class OverloadDemo {
public static void main(String[] args) {
Aoo o = new Aoo();
o.show();
o.show("zhangsan");
o.show(25);
o.show("zhangsan",25);
o.show(25,"zhangsan");
}
}
class Aoo{
void show(){}
void show(String name){}
void show(int age){}
void show(String name,int age){}
void show(int age,String name){}
//int show(){ return 1;} //编译错误,重载与返回值类型无关
//void show(String address){} //编译错误,重载与参数名称无关
}
public class Student {
String name;
int age;
String address;
//给成员变量赋初始值
Student(String name,int age,String address){
this.name = name;
this.age = age;
this.address = address;
}
void study(){
System.out.println(name+"在学习...");
}
void sayHi(){ //默认给了咱们一个this
System.out.println("大家好,我叫"+name+",今年"+age+"岁了,家住"+address);
}
}
public class ConsDemo {
public static void main(String[] args) {
//Student zs = new Student(); //编译错误,Student类中没有无参构造方法
Student zs = new Student("zhangsan",25,"LF");
Student ls = new Student("lisi",24,"JMS");
zs.sayHi();
ls.sayHi();
}
}
Student[] oses = new Student[3];
oses[0] = new Student();
oses[1] = new Student();
oses[2] = new Student();
若想访问元素的数据,需要通过数组元素去打点
Soudent[] oses = new Soudent[3]; //创建学生数组对象
oses[0] = new Soudent(); //创建学生对象
oses[1] = new Soudent();
oses[2] = new Soudent();
System.out.println(oses[0].name); //输出第1个学生的名字
oses[1].age = 11; //修改第2个学生年龄
oses[2].h();
for(int i=0;i
public class SuperDemo {
public static void main(String[] args) {
Boo o = new Boo();
}
}
//演示派生类中调用超类的有参构造方法
class Coo{
Coo(int a){
}
}
class Doo extends Coo{
Doo(){
super(5);
}
/*
//如下代码为默认的
Doo(){
super();
}
*/
}
//演示派生类中默认调用超类的无参构造方法
class Aoo{
Aoo(){
System.out.println("超类的构造方法");
}
}
class Boo extends Aoo{
Boo(){
super(); //默认的,调用超类的无参构造方法
System.out.println("派生类的构造方法");
}
}
public class UploadDemo {
public static void main(String[] args) {
Eoo o1 = new Eoo();
o1.e = 1;
o1.show();
//o1.f = 2; //编译错误,超类不能访问派生类的
//o1.test(); //编译错误
Foo o2 = new Foo();
o2.f = 1;
o2.test();
o2.e = 2; //正确,派生类可以访问超类的
o2.show(); //正确
//能点出来什么,看引用的类型------------这是规定,记住就可以了
Eoo o3 = new Foo(); //向上造型
o3.e = 1;
o3.show();
//o3.f = 2; //编译错误,o3是Eoo类型,所以只能访问Eoo里面的
//o3.test(); //编译错误
}
}
class Eoo{
int e;
void show(){
}
}
class Foo extends Eoo{
int f;
void test(){
}
}
package ooday04;
//演示访问控制修饰符
public class Aoo {
public int a; //任何类
protected int b; //本类、派生类、同包类
int c; //本类、同包类
private int d; //本类
void show(){
a = 1;
b = 2;
c = 3;
d = 4;
}
}
class Boo{ //-------------------演示private
void show(){
Aoo o = new Aoo();
o.a = 1;
o.b = 2;
o.c = 3;
//o.d = 4; //编译错误
}
}
package ooday04_vis;
import ooday04.Aoo;
public class Coo { //----------------演示同包的
void show(){
Aoo o = new Aoo();
o.a = 1;
//o.b = 2; //编译错误
//o.c = 3; //编译错误
//o.d = 4; //编译错误
}
}
class Doo extends Aoo{ //跨包继承-----------演示protected
void show(){
a = 1;
b = 2;
//c = 3; //编译错误
//d = 4; //编译错误
}
}
public class StaticDemo {
public static void main(String[] args) {
Eoo o1 = new Eoo();
o1.show();
Eoo o2 = new Eoo();
o2.show();
Eoo o3 = new Eoo();
o3.show();
System.out.println(Eoo.b); //常常通过类名点来访问
}
}
//演示静态变量
class Eoo{
int a;
static int b;
Eoo(){
a++;
b++;
}
void show(){
System.out.println(a+","+b);
}
}
public class StaticDemo {
public static void main(String[] args) {
Foo.test(); //常常通过类名点来访问
}
}
//演示静态方法
class Foo{
int a; //实例变量(对象来访问)
static int b; //静态变量(类名点来访问)
void show(){ //有this
System.out.println(this.a);
System.out.println(Foo.b);
}
static void test(){ //没有this
//静态方法中没有隐式this传递
//没有this就意味着没有对象
//而实例变量a是必须由对象来访问的
//所以如下语句发生编译错误
//System.out.println(a); //编译错误
System.out.println(Foo.b);
静态块:
由static修饰
属于类,在类被加载期间自动执行,因一个类只被加载一次,所以静态块也只执行一次
何时用:初始化/加载静态资源(图片、音频、视频等)
补充:
1. 数据(成员变量)私有化(private),行为(方法)公开化(public)
2. 成员变量分两种:
实例变量:没有static修饰,属于对象的,存储在堆中,有几个对象就有几份,通过对象/引用点来访问
}
}
//演示静态方法何时用
class Goo{
int a; //描述的是对象的属性
//在show()方法中访问了对象的属性a,说明该方法与对象有关,不能设计为static方法
void show(){
System.out.println(a);
}
//在plus()方法中不需要访问对象的属性,说明该方法与对象无关,可以设计为static方法
static int plus(int num1,int num2){
int num = num1+num2;
return num;
}
}
public class StaticDemo {
public static void main(String[] args) {
Hoo o4 = new Hoo();
Hoo o5 = new Hoo();
Hoo o6 = new Hoo();
}
}
//演示静态块
class Hoo{
static{
System.out.println("静态块");
}
Hoo(){
System.out.println("构造方法");
}
}
class Aoo{
final int a = 5;
void show(){
//a = 55; //编译错误,final的变量不能被改变
}
}
class Boo{
void show(){}
final void test(){}
}
class Coo extends Boo{
void show(){}
//void test(){} //编译错误,final的方法不能被重写
}
final class Doo{}
//class Eoo extends Doo{} //编译错误,final的类不能被继承
class Foo{}
final class Goo extends Foo{} //正确,不能当老爸,但能当儿子
public class StaticFinalDemo {
public static void main(String[] args) {
System.out.println(Hoo.PI); //常常通过类名点来访问
//Hoo.PI = 3.1415926; //编译错误,常量不能被改变
//1)加载Ioo.class到方法区中
//2)静态变量num一并存储到方法区中
//3)到方法区中获取num的值并输出
System.out.println(Ioo.num);
//编译器在编译时,会将常量直接替换为具体的值,效率高
//相当于System.out.println(5);
System.out.println(Ioo.COUNT);
}
}
class Ioo{
public static int num = 5; //静态变量
public static final int COUNT = 5; //常量
}
class Hoo{
public static final double PI = 3.14159;
//public static final int NUM; //编译错误,常量必须声明同时初始化
}
public class InnerClassDemo {
public static void main(String[] args) {
Mama m = new Mama();
//Baby b = new Baby(); //编译错误,内部类对外不可见
}
}
class Mama{ //外部类
private String name;
void create(){
Baby b = new Baby(); //正确
}
class Baby{ //内部类
void show(){
System.out.println(name); //简写
System.out.println(Mama.this.name); //完整写法
//System.out.println(this.name); //编译错误,this指代当前Baby对象
}
}
}
public class NstInnerClassDemo {
public static void main(String[] args) {
//1)创建了Aoo的一个派生类,但是没有名字
//2)为该派生类创建了一个对象,名为o1
// ---new Aoo(){}是在创建Aoo的派生类的对象
//3)大括号中的派生类的类体
Aoo o1 = new Aoo(){
};
//1)创建了Aoo的一个派生类,但是没有名字
//2)为该派生类创建了一个对象,名为o2
//3)大括号中的派生类的类体
Aoo o2 = new Aoo(){
};
int num = 5;
num = 55;
//1)创建了Boo的一个派生类,但是没有名字
//2)为该派生类创建了一个对象,名为o3
//3)大括号中的派生类的类体
Boo o3 = new Boo(){
void show(){ //重写超类Boo的抽象show()方法
System.out.println("showshow");
//num = 88; //编译错误,匿名内部类中不能修改外面局部变量的值,
//因为该变量在此处默认为final的
}
};
o3.show(); //派生类对象o3调用派生类中的方法show()
}
}
abstract class Boo{
abstract void show();
}
abstract class Aoo{
}
/**
* 接口的演示
*/
public class InterfaceDemo {
public static void main(String[] args) {
//Inter5 o = new Inter5(); //编译错误,接口不能被实例化
Inter5 o1 = new Doo(); //向上造型
Inter4 o2 = new Doo(); //向上造型
}
}
//演示接口的语法
interface Inter{
public static final int NUM = 5;
public abstract void show();
int COUNT = 5; //默认public static final
void test(); //默认public abstract
//int number; //编译错误,常量必须声明同时初始化
//void say(){} //编译错误,抽象方法不能有方法体
}
//演示接口的实现
interface Inter1{
void show(); //制定规范
void test();
}
class Aoo implements Inter1{
public void show(){} //重写接口的抽象方法时,必须加public权限
public void test(){} //--------遵守规范
}
//演示接口的多实现
interface Inter2{
void show();
}
interface Inter3{
void test();
}
abstract class Boo{
abstract void say();
}
class Coo extends Boo implements Inter2,Inter3{
public void show(){}
public void test(){}
void say(){}
}
//演示接口继承接口
interface Inter4{
void show();
}
interface Inter5 extends Inter4{
void test();
}
class Doo implements Inter5{
public void test(){}
public void show(){}
}
public class MultiTypeDemo {
public static void main(String[] args) {
//条件1:引用所指向的对象,就是该类型
//条件2:引用所指向的对象,实现了该接口或继承了该类
Aoo o = new Boo(); //向上造型
Boo o1 = (Boo)o; //引用o所指向的对象,就是Boo类型--------满足条件1
Inter o2 = (Inter)o; //引用o所指向的对象,实现了Inter接口----满足条件2
//Coo o3 = (Coo)o; //运行时会发生ClassCastException类型转换异常
if(o instanceof Coo){
Coo o4 = (Coo)o;
}else{
System.out.println("o不是Coo类型");
}
}
}
interface Inter{
}
class Aoo{
}
class Boo extends Aoo implements Inter{
}
class Coo extends Aoo{
}
/*
使用字面量来创建字符串对象时,JVM会检查常量池中是否有该对象:
1)若没有,则会创建该字符串对象,并将其引用存入常量池中
2)若有,则直接将常量池中的对象(引用)返回---并不会创建新的字符串对象
*/
String s1 = "123abc"; //常量池还没有,因此创建该字符串对象,并存入常量池中
String s2 = "123abc"; //常量池中已经有了,直接复用对象
String s3 = "123abc"; //常量池中已经有了,直接复用对象
//引用类型==,比较的是地址是否相同-----这是规则
System.out.println(s1==s2); //true
System.out.println(s1==s3); //true
System.out.println(s2==s3); //true
s1 = s1 + "!"; //创建新的字符串对象("123abc!")并将地址赋值给s1
System.out.println(s1==s2); //false
//编译器在编译时,若发现是两个字面量相连,则会直接连接好并将结果保存起来
//如下语句相当于: String s4 = "123abc";
String s4 = "123"+"abc"; //复用常量池中的对象
System.out.println(s4==s2); //true
String s5 = "123";
//因为s5是一个变量,所以在编译期并不会直接编译好
String s6 = s5+"abc"; //创建一个新的对象存储123abc
System.out.println(s6==s4); //false
面向对象自我总结大概就以上内容,补充里是我对上述内容的补充,如果觉得有用请点个赞!